我使用的是 R v 3.2.3。
我正在尝试以更优雅的方式解决问题。
我在下面写了一个简化形式的问题:
第一个数组:10 个向量在时间维度 5 上放入一个矩阵
Array1 <- array(100,c(10,10,5))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 100 100 100 100 100 100 100 100 100 100
[2,] 100 100 100 100 100 100 100 100 100 100
[3,] 100 100 100 100 100 100 100 100 100 100
[4,] 100 100 100 100 100 100 100 100 100 100
[5,] 100 100 100 100 100 100 100 100 100 100
[6,] 100 100 100 100 100 100 100 100 100 100
[7,] 100 100 100 100 100 100 100 100 100 100
[8,] 100 100 100 100 100 100 100 100 100 100
[9,] 100 100 100 100 100 100 100 100 100 100
[10,] 100 100 100 100 100 100 100 100 100 100
, , 2
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 100 100 100 100 100 100 100 100 100 100
[2,] 100 100 100 100 100 100 100 100 100 100
[3,] 100 100 100 100 100 100 100 100 100 100
[4,] 100 100 100 100 100 100 100 100 100 100
[5,] 100 100 100 100 100 100 100 100 100 100
[6,] 100 100 100 100 100 100 100 100 100 100
[7,] 100 100 100 100 100 100 100 100 100 100
[8,] 100 100 100 100 100 100 100 100 100 100
[9,] 100 100 100 100 100 100 100 100 100 100
[10,] 100 100 100 100 100 100 100 100 100 100
.etc
第二个数组:用于乘法的 10 x 10 矩阵
Array2 = diag(0.5,10,10)
将对角线和对角线为 1 的向量添加到第二个数组中进行测试
Array2[row(Array2)-1 == col(Array2)] = matrix(1-0.5,ncol(Array2)-1,1)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
[2,] 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
[3,] 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0
[4,] 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0
[5,] 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0
[6,] 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0
[7,] 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0
[8,] 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0
[9,] 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0
[10,] 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5
我希望 Array1 的列单独与 Array 2 相乘。
每次乘法的输出将等于数组 1 的时间维度 2 的值...依此类推直到 5。它实质上是覆盖第三维度的列。
我通过使用 i+1 = i 的循环来做到这一点,其中 i+1 在时间 2 时等于:
as.matrix(Array2)%*%as.matrix(Array1[,1:10,i])
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 50 50 50 50 50 50 50 50 50 50
[2,] 100 100 100 100 100 100 100 100 100 100
[3,] 100 100 100 100 100 100 100 100 100 100
[4,] 100 100 100 100 100 100 100 100 100 100
[5,] 100 100 100 100 100 100 100 100 100 100
[6,] 100 100 100 100 100 100 100 100 100 100
[7,] 100 100 100 100 100 100 100 100 100 100
[8,] 100 100 100 100 100 100 100 100 100 100
[9,] 100 100 100 100 100 100 100 100 100 100
[10,] 100 100 100 100 100 100 100 100 100 100
这会是 lapply 的机会吗?非常欢迎任何建议!
最佳答案
使用apply
,它专门用于数组或矩阵的边距。
> a = apply(Array1, 3, function(x,y)as.matrix(y)%*%as.matrix(x), Array2)
> a
[,1] [,2] [,3] [,4] [,5]
[1,] 50 50 50 50 50
[2,] 100 100 100 100 100
[3,] 100 100 100 100 100
[4,] 100 100 100 100 100
[5,] 100 100 100 100 100
[6,] 100 100 100 100 100
[7,] 100 100 100 100 100
[8,] 100 100 100 100 100
[9,] 100 100 100 100 100
[10,] 100 100 100 100 100
[11,] 50 50 50 50 50
[12,] 100 100 100 100 100
[13,] 100 100 100 100 100
...
[100,] 100 100 100 100 100
然后将其转换回数组
> array(a, dim=c(10,10,5))
, , 1
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 50 50 50 50 50 50 50 50 50 50
[2,] 100 100 100 100 100 100 100 100 100 100
[3,] 100 100 100 100 100 100 100 100 100 100
[4,] 100 100 100 100 100 100 100 100 100 100
[5,] 100 100 100 100 100 100 100 100 100 100
[6,] 100 100 100 100 100 100 100 100 100 100
[7,] 100 100 100 100 100 100 100 100 100 100
[8,] 100 100 100 100 100 100 100 100 100 100
[9,] 100 100 100 100 100 100 100 100 100 100
[10,] 100 100 100 100 100 100 100 100 100 100
, , 2
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 50 50 50 50 50 50 50 50 50 50
[2,] 100 100 100 100 100 100 100 100 100 100
[3,] 100 100 100 100 100 100 100 100 100 100
[4,] 100 100 100 100 100 100 100 100 100 100
[5,] 100 100 100 100 100 100 100 100 100 100
[6,] 100 100 100 100 100 100 100 100 100 100
[7,] 100 100 100 100 100 100 100 100 100 100
[8,] 100 100 100 100 100 100 100 100 100 100
[9,] 100 100 100 100 100 100 100 100 100 100
[10,] 100 100 100 100 100 100 100 100 100 100
...
关于r - 在 R : Column multiplication of a matrix with another matrix without a loop 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37054357/