【问题标题】:Sum of matrices in 3-dimensional object of variable dimensions without looping无循环的可变维度 3 维对象中的矩阵和
【发布时间】:2014-12-27 07:35:25
【问题描述】:

我在 R 中有一个 3 维对象,其中包含 n 个方阵。例如:

myObject[,,1] # returns a square matrix
myObject[,,2] # returns a square matrix of the same size
...

对象内的所有矩阵大小相同。我想将所有矩阵加在一起,没有循环。如果我知道对象中有多少个矩阵,这很简单。例如:

matrixSum <- myObject[,,1] + myObject[,,2] + myObject[,,3]

问题是,我需要为数千个这样的对象执行此操作,并且每个对象中都有可变数量的矩阵。有什么办法可以在没有循环的情况下做到这一点?从某种意义上说,我想尝试将这个总和“矢量化”。

【问题讨论】:

  • 不确定这里的for 循环有什么问题,无论myObject 中有多少矩阵,以下操作都可以:matrixSum &lt;- matrix(0, dim(myObject)[[1]], dim(myObject)[[2]]); for(i in seq_len(dim(myObject)[[3]])) matrixSum &lt;- matrixSum + myObject[,,i]; matrixSum

标签: arrays r performance matrix vectorization


【解决方案1】:

最方便但肯定不是最快的方法是使用apply

matrixSum <- apply(myObject, c(1,2), sum)

例子

myObject <- array(c(1,2,3),dim = c(3,4,3))
myObject
, , 1

     [,1] [,2] [,3] [,4]
[1,]    1    1    1    1
[2,]    2    2    2    2
[3,]    3    3    3    3

, , 2

     [,1] [,2] [,3] [,4]
[1,]    1    1    1    1
[2,]    2    2    2    2
[3,]    3    3    3    3

, , 3

     [,1] [,2] [,3] [,4]
[1,]    1    1    1    1
[2,]    2    2    2    2
[3,]    3    3    3    3

apply(myObject, c(1,2), sum)
     [,1] [,2] [,3] [,4]
[1,]    3    3    3    3
[2,]    6    6    6    6
[3,]    9    9    9    9

加法:

使用rowSums 应该更快:

rowSums(myObject, dims = 2)
     [,1] [,2] [,3] [,4]
[1,]    3    3    3    3
[2,]    6    6    6    6
[3,]    9    9    9    9

【讨论】:

  • 为什么不是最快的? apply 是否仍然在后台使用循环?还是你这么说是出于其他原因?我肯定在寻找计算效率。
  • @nsw apply 是一个循环,是的。但它是为处理矩阵和数组而设计的,因此在这种情况下可能还不错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
相关资源
最近更新 更多