【问题标题】:What is R's crossproduct function?R的叉积函数是什么?
【发布时间】:2013-03-01 16:50:30
【问题描述】:

我觉得这个问题很愚蠢,但是 R 的 crossprod 函数对于向量输入的意图是什么?我想计算欧几里得空间中两个向量的叉积并错误地尝试使用crossprod
向量叉积的一种定义是N = |A|*|B|*sin(theta),其中 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)

【问题讨论】:

  • 查看crossprod 文档-Vectors are promoted to single-column or single-row matrices, depending on the context.
  • @DavidRobinson 我确实读过,所以我想我的问题变成了:矩阵叉积的正确定义是什么?为什么它不像欧几里得向量叉积?
  • @CarlWitthoft 感谢您发布此内容,我有同样的问题,这让我发疯了。如果您写了vectorxprod(A, B),您愿意分享(我猜是答案)?谢谢。
  • @BryanHanson 好的,看看新的答案。
  • 有点晚了,但是使用术语“叉积”来指代 X'X 矩阵在统计学中相当普遍(毕竟,这就是 R 的来源)。这是回归应用程序中的标准结构。谷歌搜索“平方和和叉积”可能会有所帮助。

标签: r


【解决方案1】:

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

【讨论】:

【解决方案2】:

这是一个短代码 sn-p,只要叉积有意义就可以工作: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 的只有 2D)。
  • 简单而惯用。
  • 很好的注释和格式化;因此,易于理解

缺点是数字“3”被多次硬编码。实际上,这并不是一件坏事,因为它突出了向量叉积纯粹是一个 3D 构造的事实。就个人而言,我会推荐ditching cross products entirelylearning Geometric Algebra。 :)

【讨论】:

  • 很好,虽然我对倾销交叉产品有点例外,因为手性对于 E&M 和其他一些物理学非常重要 :-)
  • 感谢您的好话 :) 手性很重要,但叉积的手性是任意的。在 E&M 中,如果您使用 左手 规则,您将得到所有相同的答案,因为它应用了偶数次。有关详细信息,请参阅av8n.com/physics/pierre-puzzle.htm(尤其是解决方案)。
【解决方案3】:

帮助?crossprod 解释得很清楚。以线性回归为例,对于模型y = XB + e,您想找到X'XX 转置和X 的乘积。为此,一个简单的调用就足够了:crossprod(X)crossprod(X,X) 相同,与t(X) %*% X 相同。此外,crossprod 可用于求两个向​​量的点积。

【讨论】:

  • 是的,但这不是叉积的定义,正如我上面所说的。也许我很迂腐,但我想要一个“交叉产品”函数来产生维基百科页面上显示的结果(或你友好的邻居物理 101 文本:-))
  • 我没有听说它被称为叉积,除了在 R 中。
【解决方案4】:

应@Bryan Hanson 的要求,这里有一些Q&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))
}

【讨论】:

  • 谢谢@Carlwitthoft。我写的差不多就是这样,希望你有 3d 版本。我会写它并在它准备好时发布它。很奇怪,没有内置这样的东西,异常常见。
  • RFOC::cross.prod中有3D版本;在同一个包中还有一些其他的接受不同的输入和输出格式。另外,RSEIS::xprod.
  • @BryanHanson 我怀疑,虽然 3D 叉积在物理和工程中很常见,但在统计分析中却不是很常见,而这正是 R 诞生的地方。幸运的是,我们物理学家非常擅长将方程转化为代码 :-)
【解决方案5】:

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

如果你想得到二维向量uv的标量“叉积”,你可以这样做

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

【讨论】:

  • 除了叉积 is 为二维向量定义,因此您的 msg 具有误导性。为什么不将我们的答案合并到一个函数中?
  • @CarlWitthoft 我知道你的意思,但交叉产品在技术上是 3D。如果有人想将特殊情况(此答案的最后一行)包装在一个函数中,最好他们自己命名。
【解决方案6】:

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

mat1 % mat2

【讨论】:

  • 我们已经介绍过了;而你写的不是有效的代码。
猜你喜欢
  • 2017-11-13
  • 2021-11-11
  • 2015-03-16
  • 2012-07-18
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 2023-01-17
  • 2017-05-23
相关资源
最近更新 更多