在R中:矩阵与另一个没有循环的矩阵的列乘法

时间:2016-05-05 15:23:05

标签: r matrix

我正在使用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的机会吗?非常欢迎任何建议!

2 个答案:

答案 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循环更具可读性,可能会更快一些。