varias superponer studio resta productos multiplicacion metodo graficos graficas fracciones ejemplos ecuaciones cruzados cruzado r

superponer - ¿Cuál es la función de producto cruzado de R?



superponer graficas en r (5)

Me siento estúpido al preguntar, pero ¿cuál es la intención de la función crossprod de R con respecto a las entradas vectoriales? Quería calcular el producto cruzado de dos vectores en el espacio euclidiano y, por error, probé el uso de crossprod .
Una definición del producto cruzado del vector es N = |A|*|B|*sin(theta) donde theta es el ángulo entre los dos vectores. (La dirección de N es perpendicular al plano AB). Otra forma de calcularlo es N = Ax*By - Ay*Bx .
base::crossprod claramente no realiza este cálculo y, de hecho, produce el vector punto-producto de la sum(Ax*Bx, Ay*By) de las dos entradas sum(Ax*Bx, Ay*By) .

Entonces, puedo escribir fácilmente mi propia función vectorxprod(A,B) , pero no puedo entender qué está haciendo crossprod en general.

Ver también R - Calcular producto cruzado de vectores (física).


¿La ayuda ?crossprod explica muy claramente. Tome la regresión lineal, por ejemplo, para un modelo y = XB + e que desea encontrar X''X , el producto de X transpose y X Para lograr eso, una simple llamada será suficiente: crossprod(X) es lo mismo que crossprod(X,X) es lo mismo que t(X) %*% X Además, se puede usar la crossprod para encontrar el producto de puntos de dos vectores.


Aquí hay un fragmento de código corto que funciona siempre que el producto cruzado tenga sentido: la versión 3D devuelve un vector y la versión 2D devuelve un escalar. Si solo desea un código simple que dé la respuesta correcta sin tener que acceder a una biblioteca externa, esto es todo lo que necesita.

# Compute the vector cross product between x and y, and return the components # indexed by i. CrossProduct3D <- function(x, y, i=1:3) { # Project inputs into 3D, since the cross product only makes sense in 3D. To3D <- function(x) head(c(x, rep(0, 3)), 3) x <- To3D(x) y <- To3D(y) # Indices should be treated cyclically (i.e., index 4 is "really" index 1, and # so on). Index3D() lets us do that using R''s convention of 1-based (rather # than 0-based) arrays. Index3D <- function(i) (i - 1) %% 3 + 1 # The i''th component of the cross product is: # (x[i + 1] * y[i + 2]) - (x[i + 2] * y[i + 1]) # as long as we treat the indices cyclically. return (x[Index3D(i + 1)] * y[Index3D(i + 2)] - x[Index3D(i + 2)] * y[Index3D(i + 1)]) } CrossProduct2D <- function(x, y) CrossProduct3D(x, y, i=3)

¿Funciona?

Veamos un ejemplo aleatorio que encontré en línea :

> CrossProduct3D(c(3, -3, 1), c(4, 9, 2)) == c(-15, -2, 39) [1] TRUE TRUE TRUE

¡Se ve bastante bien!

¿Por qué es esto mejor que las respuestas anteriores?

  • Es 3D (el de Carl era solo en 2D).
  • Es simple e idiomático.
  • Muy bien comentado y formateado; por lo tanto, fácil de entender

El inconveniente es que el número ''3'' está codificado varias veces. En realidad, esto no es algo tan malo, ya que destaca el hecho de que el producto cruzado vectorial es puramente una construcción 3D. Personalmente, recomendaría deshacerse de productos cruzados por completo y, en su lugar, aprender Álgebra geométrica . :)


Aquí hay una implementación minimalista para vectores 3D:

vector.cross <- function(a, b) { if(length(a)!=3 || length(b)!=3){ stop("Cross product is only defined for 3D vectors."); } i1 <- c(2,3,1) i2 <- c(3,1,2) return (a[i1]*b[i2] - a[i2]*b[i1]) }

Si desea obtener el "producto cruzado" escalar de los vectores 2D u , puede hacerlo

vector.cross(c(u,0),c(v,0))[3]


De acuerdo con la función de ayuda en R: crossprod (X, Y) = t (X)% *% Y es una implementación más rápida que la expresión en sí misma. Es una función de dos matrices, y si tiene dos vectores corresponde al producto punto.


En respuesta a la solicitud de @Bryan Hanson, aquí hay un código de Q&D para calcular un producto cruzado vectorial para dos vectores en el plano. Es un poco más complicado calcular el producto cruzado general del vector de 3 espacios, o extenderlo al espacio-N. Si los necesitas, tendrás que ir a Wikipedia :-).

crossvec <- function(x,y){ if(length(x)!=2 |length(y)!=2) stop(''bad vectors'') cv <- x[1]*y[2]-x[2]*y[1] return(invisible(cv)) }