Cómo calcular el producto cruzado vectorialSegún la documentación, parece que el operador * realizará un producto cruzado y ;* realizará un producto escalar. Quiero usar un producto cruzado para determinar el vector normal a un par de vectores conocidos como este:
p1 = [1, 2, 4];
p2 = [2, 1, 4];
p3 = [2, 2, 4];
v1 = p3 - p1;
v2 = p2 - p1;
xProd = v1*v2;
3 puntos definen un plano, dos vectores tomados de esos puntos hacen lo mismo, el producto vectorial debe dar el vector normal de ese plano. El problema parece ser que las dimensiones de las dos matrices que se multiplican (v1 y v2) no coinciden: nRows(v1) debe ser igual a nCols(v2). Puedo implementar esto manualmente con una fórmula simplificada para productos cruzados vectoriales, pero ¿alguien sabe cómo formatear esto de manera diferente para trabajar con la multiplicación de matrices?
Re: Cómo calcular el producto cruzado vectorialEl rendimiento inferior no sorprende... gracias por insertar el ajuste del letrero. Omití el "tablero de ajedrez" sin darme cuenta.
En mi opinión, este es uno de esos casos en los que se aplica "solo porque puedas, no significa que debas"... {genial, divertido, breve} no supera a {comprensible, mantenible, rápido}.
Re: Cómo calcular el producto cruzado vectorial@brady_brady ¡Fresco! Necesita un ajuste si vas a 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> muestra cómo el elemento medio debe ser negativo.Arriba, j alternará el signo (1, -1, 1) y i aumentará (1, 2, 3). La función J(...) tiene un bucle implícito que evalúa el tercer argumento de cada elemento.</P>
<P> </P>
<P>La sencilla fórmula corregida de<A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/11962" target="_blank"> @klk</A> es aproximadamente 3 veces más rápido y aproximadamente N veces más fácil de entender.</P>
<P> </P>
<P>Código de prueba.</P>
<DIV class="lia-spoiler-container"><A class="lia-spoiler-link" href="#" rel="nofollow noopener noreferrer" target="_blank">Ver más...</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, redondear a 11 lugares en ocasiones no coincide con los resultados. Probablemente vectores casi colineales.
Re: Cómo calcular el producto cruzado vectorialBueno, el zombie revivido me atrapó. Aquí hay una manera de hacerlo a través de determinantes como @Craige_Hales mencionado. Es corto, pero no sé... no es muy sencillo.
crossP = Function( {x, y, i = 1},
Return( J( 3, 1, Det( (x || y)[Remove( [1, 2, 3], i++ ), 0] ) ) )
);
es decir, utilizando los datos proporcionados originalmente:

Re: Cómo calcular el producto cruzado vectorialPerdón por revivir este hilo de zombies, pero aquí hay un error de signo en el segundo elemento.creo que debería ser
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 />)Solo quiero dejar esto aquí para cualquiera que venga a copiar y pegar rápidamente.
Re: Cómo calcular el producto cruzado vectorialGracias cwillden, esto es esencialmente lo que he implementado. Funciona para mí ya que sólo me preocupan los vectores 3D, pero me sorprende que no sea una función integrada. Voy a dejar esto abierto por un momento para ver si alguien más conoce esa forma.
Re: Cómo calcular el producto cruzado vectorialEspero que a alguien se le ocurra una manera inteligente de hacer esto. La función det() está estrechamente relacionada, pero no entiendo cómo usar det(matriz 3x3) para recuperar más que un valor escalar. Creo que podrías usar det(submatriz 2x2) tres veces, pero creo que lo más sencillo xyzzy El enfoque es más simple e igual de rápido.
Lo uso para las normales de superficie en escenas 3D, hay algo de JSL en https://community.jmp.com/t5/Uncharted/Custom-Visualization/ba-p/191559 .
Re: Cómo calcular el producto cruzado vectorialSi solo trabaja con vectores 3x1 (o 1x3), entonces creo que la eficiencia o elegancia computacional no es demasiado importante.¿Sería esto suficiente?
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);