Comment calculer le produit croisé vectorielD'après la documentation, il semble que l'opérateur * effectuera un produit vectoriel et ;* effectuera un produit scalaire. Je souhaite utiliser un produit vectoriel pour déterminer le vecteur normal à une paire de vecteurs connus comme ceci :
p1 = [1, 2, 4];
p2 = [2, 1, 4];
p3 = [2, 2, 4];
v1 = p3 - p1;
v2 = p2 - p1;
xProd = v1*v2;
3 points définissent un plan, deux vecteurs pris à partir de ces points font de même, le produit vectoriel doit donner le vecteur normal de ce plan. Le problème semble être que les dimensions des deux matrices multipliées (v1 et v2) ne concordent pas : nRows(v1) devrait être égal à nCols(v2). Je peux l'implémenter manuellement avec une formule simplifiée pour les produits croisés vectoriels, mais est-ce que quelqu'un sait comment le formater différemment pour travailler avec la multiplication matricielle ?
Re : Comment calculer le produit croisé vectorielLes performances inférieures ne sont pas surprenantes... merci d'avoir inséré le réglage du signe. J'ai omis le "signe en damier" par inadvertance.
OMI, c'est l'un de ces cas où "ce n'est pas parce que vous pouvez le faire que vous devriez" s'appliquer... {cool, amusant, court} ne l'emporte pas sur {compréhensible, maintenable, rapide}.
Re : Comment calculer le produit croisé vectoriel@brady_brady Cool! Il a besoin d'un ajustement si vous comptez l'utiliser :
i = 1;
j = -1;
J( 3, 1, (j *= -1) * Det( (v1 || v2)[Remove( [1, 2, 3], i++ ), 0] ) );
</CODE><A href="https://mathinsight.org/cross_product_formula" target="_blank" rel="nofollow noopener noreferrer">https://mathinsight.org/cross_product_formula</A> montre comment l'élément du milieu doit être négatif.Ci-dessus, j alternera de signe (1, -1, 1) et i augmentera (1, 2, 3). La fonction J(...) a une boucle implicite qui évalue le 3ème argument pour chaque élément.</P>
<P> </P>
<P>La formule simple et corrigée de<A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/11962" target="_blank"> @klk</A> est environ 3 fois plus rapide et environ N fois plus facile à comprendre.</P>
<P> </P>
<P>Code de test.</P>
<DIV class="lia-spoiler-container"><A class="lia-spoiler-link" href="#" rel="nofollow noopener noreferrer" target="_blank">Voir plus...</A><NOSCRIPT><DIV class="lia-spoiler-content"><BR /><PRE><CODE class=" language-jsl">v1 = [0, 0, 1];
v2 = [0, 1, 0];
start = HP Time();
For( t = 1, t < 1e6, t += 1,
i = 1;
j = -1;
J( 3, 1, (j *= -1) * Det( (v1 || v2)[Remove( [1, 2, 3], i++ ), 0] ) );
);
stop = HP Time();
Show( (stop - start) / 1e6 );//9.3s
start = HP Time();
For( t = 1, t < 1e6, t += 1,
Matrix( {v1[2] * v2[3] - v1[3] * v2[2], v1[3] * v2[1] - v1[1] * v2[3], v1[1] * v2[2] - v1[2] * v2[1]} )
);
stop = HP Time();
Show( (stop - start) / 1e6 );//3.2s
For( q = 1, q < 10000, q += 1,
v1 = J( 3, 1, Random Uniform( -1, 1 ) );
v2 = J( 3, 1, Random Uniform( -1, 1 ) );
If(
All(
Round( Matrix( {v1[2] * v2[3] - v1[3] * v2[2], v1[3] * v2[1] - v1[1] * v2[3], v1[1] * v2[2] - v1[2] * v2[1]} ), 10 ) //
== //
(i = 1; j = -1 ; Round( J( 3, 1, (j *= -1) * Det( (v1 || v2)[Remove( [1, 2, 3], i++ ), 0] ) ), 10 ) ; ) //
) == 0//
, //
Throw( Char( q ) )
);
);Curieusement, les arrondis à 11 places ne parviennent parfois pas à correspondre aux résultats. Probablement des vecteurs presque colinéaires.
Re : Comment calculer le produit croisé vectorielEh bien, le zombie ressuscité m'a attrapé. Voici une façon de le faire via les déterminants comme @Craige_Hales mentionné. C'est court, mais je ne sais pas... ce n'est pas très simple.
crossP = Function( {x, y, i = 1},
Return( J( 3, 1, Det( (x || y)[Remove( [1, 2, 3], i++ ), 0] ) ) )
);
c'est-à-dire en utilisant les données fournies à l'origine :

Re : Comment calculer le produit croisé vectorielDésolé d'avoir relancé ce fil de discussion zombie, mais il y a une erreur de signe dans le deuxième élément ici.je crois que ça devrait être
Matrix(
{v1[2] * v2[3] - v1[3] * v2[2], v1[3] * v2[1] - v1[1] * v2[3], v1[1] * v2[2] - v1[2] * v2[1]}<BR />)Je veux juste laisser ceci ici pour tous ceux qui viendront pour un copier-coller rapide.
Re : Comment calculer le produit croisé vectorielMerci Cwillden, c'est essentiellement ce que j'ai mis en œuvre. Cela fonctionne pour moi puisque je ne m'intéresse qu'aux vecteurs 3D, mais je suis surpris que ce ne soit pas une fonction intégrée. Je vais laisser cela ouvert un moment pour voir si quelqu'un d'autre connaît une telle méthode.
Re : Comment calculer le produit croisé vectorielJ'espère que quelqu'un trouvera une façon intelligente de procéder. La fonction det() est étroitement liée, mais je ne comprends pas comment utiliser det(3x3 Matrix) pour récupérer plus qu'une valeur scalaire. Je pense que vous pourriez utiliser det(2x2 sub-matrix) trois fois, mais je pense que la solution simple xyzzy L’approche est plus simple et tout aussi rapide.
Je l'utilise pour les normales de surface dans les scènes 3D, il y a du JSL dans https://community.jmp.com/t5/Uncharted/Custom-Visualization/ba-p/191559 .
Re : Comment calculer le produit croisé vectorielSi vous ne traitez que des vecteurs 3x1 (ou 1x3), alors je pense que l'efficacité ou l'élégance du calcul n'est pas trop importante.Est-ce que cela serait suffisant ?
cross_prod = function({v1, v2},
matrix({v1[2]*v2[3] - v1[3]*v2[2], v1[1]*v2[3] - v1[3]*v2[1], v1[1]*v2[2] - v1[2]*v2[1]});
);
cross_prod(v1, v2);