Arrays 三维数组元素与R中无环矩阵列的叉积

Arrays 三维数组元素与R中无环矩阵列的叉积,arrays,r,performance,loops,matrix,Arrays,R,Performance,Loops,Matrix,我正在研究一个渔业资源评估模型,希望通过删除一个循环(实际上是相同形式的两个循环)来加快评估速度。 我有一个数组,A,dimA=[L,L,Y],还有一个矩阵,M,dimM=[L,Y]。 这些用于通过计算矩阵乘积来生成矩阵mat,dimat=[L,Y]。我的循环看起来像: for(i in 1:Y){ mat[,i]<-(A[,,i]%*%M[,i])[,1]} 有人能帮我吗?我真的需要一个速度增益。 另外,我不知道它是否会产生差异,但每个a[,i]矩阵都是下三角形。我很肯定这会给你想要的

我正在研究一个渔业资源评估模型,希望通过删除一个循环(实际上是相同形式的两个循环)来加快评估速度。 我有一个数组,A,dimA=[L,L,Y],还有一个矩阵,M,dimM=[L,Y]。 这些用于通过计算矩阵乘积来生成矩阵mat,dimat=[L,Y]。我的循环看起来像:

for(i in 1:Y){
mat[,i]<-(A[,,i]%*%M[,i])[,1]}
有人能帮我吗?我真的需要一个速度增益。
另外,我不知道它是否会产生差异,但每个a[,i]矩阵都是下三角形。

我很肯定这会给你想要的结果。由于没有可复制的例子,我不能绝对肯定。必须追踪一些线性代数逻辑,以了解您试图实现的目标

library(plyr) # We need this to split the array into a list of 9 matrices
B = lapply(alply(A, 3), function(x) (x%*%M)) # Perform 9 linear algebra multiplications
sapply(1:9, function(i) (B[[i]])[,i]) # Extract the 9 columns you actually want.
我使用了以下测试数据:

A = array(rnorm(225), dim = c(5,5,9))
M = matrix(rnorm(45), nrow = 5, ncol = 9)

我认为关键是要消除所有与第一列无关的计算。您应该发布一个简化的示例。第一列的最后一个子集是多余的。循环中的矩阵乘法只产生一列。这不是比for循环慢吗?我不知道,因为操作代码实际上并不为我运行。想一想,可能会慢一些……我们拭目以待。我将在为我运行OP repress.OP代码时删除。只需用ncolM替换Y并添加垫子即可,非常好,谢谢。它确实产生了正确的结果。我不知道阿尔卑斯函数-非常有用,但速度较慢。我在我的数据上试过,希望在更大的矩阵上更快,但事实并非如此。