有效计算 R 中两个 3D 数组的叉积之和

Posted

技术标签:

【中文标题】有效计算 R 中两个 3D 数组的叉积之和【英文标题】:Efficiently computing sum of cross product for two 3D arrays in R 【发布时间】:2019-03-20 04:20:44 【问题描述】:

以R中的两个3D数组为例,

N <- 1000
x <- rnorm(N*3*3);   dim(x) <- c(N,3,3)
y <- rnorm(N*3*3);   dim(y) <- c(N,3,3)

我可以通过循环做以下叉积:

gg <- 0
for (n in 1:dim(x)[1])
    gg <- gg + t(x[n,,]) %*% y[n,,]

我的问题是,对于非常大的N,我们能否更有效地(例如,通过矢量化或rcpp)而不是使用循环?

【问题讨论】:

本文中使用 Rcpp ***.com/questions/37191673/… 实现了矩阵乘法 感谢您的评论!我已经编写了 rcpp 并针对循环进行了测试,但它比循环慢 2 倍...根据我的测试,我认为下面 F. Privé 的解决方案是最快的。 【参考方案1】:

如果你用数学方法重写你的问题,你可以证明它等价于:

dim(x) <- c(3 * N, 3)
dim(y) <- c(3 * N, 3)
gg2 <- crossprod(x, y)

应该非常快并且不应该复制任何内容。

【讨论】:

非常感谢!它的运行速度比我电脑上的循环快 12 倍!

以上是关于有效计算 R 中两个 3D 数组的叉积之和的主要内容,如果未能解决你的问题,请参考以下文章

计算机图形学-向量向量加减法向量的点积(乘)向量的叉积(乘)

计算二维向量叉积

计算2D矢量叉积

如何用向量的叉积来计算一个多边形的面积?

Unity3D之Vector3.Dot和Vector3.Cross的使用

Unity3D之Vector3.Dot和Vector3.Cross的使用