I feel stupid asking, but what is the intent of R's crossprod
function with respect to vector inputs? I wanted to calculate the cross-product of two vectors in Euclidean space and mistakenly tried using crossprod
.
One definition of the vector cross-product is N = |A|*|B|*sin(theta)
where theta is the angle between the two vectors. (The direction of N
is perpendicular to the A-B plane). Another way to calculate it is N = Ax*By - Ay*Bx
.base::crossprod
clearly does not do this calculation, and in fact produces the vector dot-product of the two inputs sum(Ax*Bx, Ay*By)
.
So, I can easily write my own vectorxprod(A,B)
function, but I can't figure out what crossprod
is doing in general.
See also R - Compute Cross Product of Vectors (Physics)
crossprod() function in R Language is used to return the cross-product of the specified matrix.
Computing Cross Product in RBy using cross() method which is available in the pracma library. This function computes the cross or vector product of vectors in 3 dimensions. In the case of matrices, it takes the first dimension of length 3 and computes the cross product between corresponding columns or rows.
In mathematics, when two vectors are multiplied the output is a scalar quantity which is the sum of the product of the values. For example, if we have two vectors x and y each containing 1 and 2 then the multiplication of the two vectors will be 5. In R, we can do it by using t(x)%*%y.
According to the help function in R: crossprod (X,Y) = t(X)%*% Y is a faster implementation than the expression itself. It is a function of two matrices, and if you have two vectors corresponds to the dot product. @Hong-Ooi's comments explains why it is called crossproduct.
Here is a short code snippet which works whenever the cross product makes sense: the 3D version returns a vector and the 2D version returns a scalar. If you just want simple code that gives the right answer without pulling in an external library, this is all you need.
# 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)
Let's check a random example I found online:
> CrossProduct3D(c(3, -3, 1), c(4, 9, 2)) == c(-15, -2, 39) [1] TRUE TRUE TRUE
Looks pretty good!
The downside is that the number '3' is hardcoded several times. Actually, this isn't such a bad thing, since it highlights the fact that the vector cross product is purely a 3D construct. Personally, I'd recommend ditching cross products entirely and learning Geometric Algebra instead. :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With