Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is R's crossproduct function?

Tags:

r

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)

like image 360
Carl Witthoft Avatar asked Mar 01 '13 16:03

Carl Witthoft


People also ask

What is Crossprod R?

crossprod() function in R Language is used to return the cross-product of the specified matrix.

How do you do a cross product in R?

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.

How do you make a vector product in R?

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.


2 Answers

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.

like image 87
vinnief Avatar answered Oct 04 '22 19:10

vinnief


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) 

Does it work?

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!

Why is this better than previous answers?

  • It's 3D (Carl's was 2D-only).
  • It's simple and idiomatic.
  • Nicely commented and formatted; hence, easy to understand

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. :)

like image 28
Chip Hogg Avatar answered Oct 04 '22 20:10

Chip Hogg