Come calcolare il prodotto incrociato vettorialeDalla documentazione sembra che l'operatore * eseguirà un prodotto incrociato e ;* eseguirà un prodotto scalare. Voglio utilizzare un prodotto incrociato per determinare il vettore normale a una coppia di vettori noti come questo:
p1 = [1, 2, 4];
p2 = [2, 1, 4];
p3 = [2, 2, 4];
v1 = p3 - p1;
v2 = p2 - p1;
xProd = v1*v2;
3 punti definiscono un piano, due vettori presi da quei punti fanno lo stesso, il prodotto incrociato dovrebbe dare il vettore normale di quel piano. Il problema sembra essere che le dimensioni delle due matrici moltiplicate (v1 e v2) non concordano: nRows(v1) dovrebbe essere uguale a nCols(v2). Posso implementarlo manualmente con una formula semplificata per i prodotti incrociati vettoriali, ma qualcuno sa come formattarlo in modo diverso per lavorare con la moltiplicazione di matrici?
Re: Come calcolare il prodotto incrociato vettorialeLe prestazioni inferiori non sorprendono... grazie per aver inserito la regolazione del segno. Ho omesso inavvertitamente la "scacchiera del segno".
IMO questo è uno di quei casi in cui si applica "solo perché puoi, non significa che dovresti"... {bello, divertente, breve} non supera {comprensibile, gestibile, veloce}.
Re: Come calcolare il prodotto incrociato vettoriale@brady_brady Freddo! Ha bisogno di una modifica se intendi usarlo:
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> mostra come l'elemento centrale deve essere negativo.Sopra, j alternerà il segno (1, -1, 1) e i aumenterà (1, 2, 3). La funzione J(...) ha un ciclo implicito che valuta il terzo argomento per ciascun elemento.</P>
<P> </P>
<P>La formula corretta semplice da<A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/11962" target="_blank"> @klk</A> è circa 3 volte più veloce e circa N volte più facile da capire.</P>
<P> </P>
<P>Codice di prova.</P>
<DIV class="lia-spoiler-container"><A class="lia-spoiler-link" href="#" rel="nofollow noopener noreferrer" target="_blank">Visualizza altro...</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 ) )
);
);Curiosamente, l'arrotondamento a 11 posizioni a volte non riesce a far corrispondere i risultati. Probabilmente vettori quasi collineari.
Re: Come calcolare il prodotto incrociato vettorialeBene, lo zombie rianimato mi ha catturato. Ecco un modo per farlo tramite determinanti come @Craige_Hales menzionato. È breve, ma non lo so... non è molto semplice.
crossP = Function( {x, y, i = 1},
Return( J( 3, 1, Det( (x || y)[Remove( [1, 2, 3], i++ ), 0] ) ) )
);
ovvero, utilizzando i dati forniti originariamente:

Re: Come calcolare il prodotto incrociato vettorialeCi scusiamo per aver rilanciato questo thread sugli zombie, ma c'è un errore di segno nel secondo elemento qui.Credo che dovrebbe essere
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 />)Voglio solo lasciare questo qui per chiunque altro venga per un veloce copia-incolla.
Re: Come calcolare il prodotto incrociato vettorialeGrazie cwillden, questo è essenzialmente ciò che ho implementato. Funziona per me poiché mi occupo solo di vettori 3D, ma sono supposto che non sia una funzione integrata. Lascerò la questione aperta per un po' per vedere se qualcun altro conosce un metodo del genere.
Re: Come calcolare il prodotto incrociato vettorialeSpero che qualcuno trovi un modo intelligente per farlo. La funzione det() è strettamente correlata, ma non capisco come utilizzare det(matrice 3x3) per ottenere più di un valore scalare. Penso che potresti usare det(2x2 sub-matrix) tre volte, ma penso che sia semplice xyzzy l'approccio è più semplice e altrettanto veloce.
Lo uso per le normali di superficie nelle scene 3D, c'è del JSL dentro https://community.jmp.com/t5/Uncharted/Custom-Visualization/ba-p/191559 .
Re: Come calcolare il prodotto incrociato vettorialeSe hai a che fare solo con vettori 3x1 (o 1x3), allora penserei che l'efficienza computazionale o l'eleganza non siano troppo importanti.Questo sarebbe sufficiente?
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);