我正在使用R v 3.2.3。
我试图以更优雅的方式解决问题。
我在下面写了一个简化的问题形式:
第一阵列:在时间维度5上将10个向量放入一个矩阵
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乘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的机会吗?非常欢迎任何建议!
答案 0 :(得分:3)
使用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
...
答案 1 :(得分:1)
这样可以解决问题:
sapply(1:5, FUN=function(i) Array2 %*% Array1[,,i], simplify="array")
它比for
循环更具可读性,可能会更快一些。