什么是R交叉产品功能?

时间:2013-03-01 16:50:31

标签: r

我觉得很愚蠢,但是R crossprod函数对矢量输入的意图是什么?我想计算欧几里德空间中两个向量的交叉积,并错误地尝试使用crossprod
矢量叉积的一个定义是N = |A|*|B|*sin(theta),其中θ是两个矢量之间的角度。 (N的方向垂直于A-B平面)。另一种计算方法是N = Ax*By - Ay*Bx base::crossprod显然不会进行此计算,实际上会生成两个输入sum(Ax*Bx, Ay*By)的矢量点积。

所以,我可以轻松编写自己的vectorxprod(A,B)函数,但我无法弄清楚crossprod一般在做什么。

另见R - Compute Cross Product of Vectors (Physics)

6 个答案:

答案 0 :(得分:18)

根据R中的帮助函数:crossprod(X,Y)= t(X)%*%Y是比表达式本身更快的实现。它是两个矩阵的函数,如果你有两个向量对应于点积。 @ Hong-Ooi的评论解释了为什么它被称为crossproduct。

答案 1 :(得分:10)

这是一个简短的代码片段,只要交叉产品有意义,它就会起作用:3D版本返回一个向量,2D版本返回一个标量。如果您只是想要简单的代码,无需拉入外部库就可以得到正确的答案,这就是您所需要的。

# 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)

有效吗?

让我们检查a random example I found online

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

看起来很不错!

为什么这比之前的答案更好?

  • 这是3D(Carl's仅限2D)。
  • 这很简单,也很惯用。
  • 很好地评论和格式化;因此,易于理解

缺点是数字'3'被硬编码好几次。实际上,这并不是一件坏事,因为它突出了矢量交叉产品纯粹 3D构造的事实。就个人而言,我建议改为ditching cross products entirelylearning Geometric Algebra。 :)

答案 2 :(得分:3)

帮助?crossprod非常清楚地解释了这一点。例如,对于要查找y = XB + e的模型X'X进行线性回归,X转置和X的乘积。要做到这一点,一个简单的调用就足够了:crossprod(X)crossprod(X,X)相同,与t(X) %*% X相同。此外,crossprod可用于查找两个向量的点积。

答案 3 :(得分:2)

为了回应@Bryan Hanson的要求,这里有一些Q&amp; D代码来计算平面中两个向量的向量叉积。计算一般的3空间矢量交叉产品或扩展到N空间有点麻烦。如果你需要那些,你将不得不去维基百科:-)。

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))
}

答案 4 :(得分:0)

以下是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])
}

如果你想获得标量&#34;交叉产品&#34; 2D矢量uv,你可以做

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

答案 5 :(得分:-3)

我想通过叉积你的意思是矩阵乘法 在那种情况下,它只是

mat1 % mat2