r - 在 R : Column multiplication of a matrix with another matrix without a loop 中

标签 r matrix

我使用的是 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/

相关文章:

r - 如何将公式转换为函数,或将公式应用于某些值?

c - 调整二维数组的大小,并将元素的平均值转移到 c 中较小的矩阵

arrays - Matlab:将矩阵 reshape 为一维数组,并将重叠元素加在一起

python - 在列上过滤 numpy 矩阵

r - 如何在R中加载大数据?

r - 如何让 emacs 中的 R 缓冲区占据更多水平空间?

c++ - 如何将 boost::numeric::ublas::vector 复制到矩阵?

c++ - 使用 LAPACK 访问子矩阵

r - 如何隐藏R studio上的值或不显示值但可以使用?

r - 难以在 R 中加载 maxent 包