如何计算矩阵的总和?

How to compute the grand sum of a matrix?

我有一个大小为 4 x 10 的矩阵。我想计算总和的所有可能项的总和。换句话说,如果你有一个 2 x 2 矩阵

2 3
4 1

然后有 2^2 个和 (2 + 3, 2 + 1) 和 (4 + 3, 和 4 + 1)。同样,如果您有一个 2 x 3 矩阵,则总和将是 2^3 = 8。允许重复。由于我的矩阵是 4 x 10,因此总和为 1,048,576。

我如何在 R 中准确地计算它?伪代码也很好,因为我相当确定我可以翻译成 R。但是专门的 R packages/functions 会更好。

这个呢?

m <- matrix(c(2,3,4,1), ncol = 2, byrow = T)
apply(expand.grid(m[,2],m[,1]),1,sum)
[1] 5 3 7 5

对于具有任意数量列的矩阵实现此目的的简洁方法是:

rowSums(expand.grid(as.data.frame(m)))

as.data.frame(m) 将您的矩阵转换为 data.frame,这意味着它可以直接传递给 expand.grid 函数,该函数将对每一列进行操作。 rowSums 有效地计算结果的行总和,与使用 apply 和函数 sum:

相比,这将带来显着的效率提升
m <- matrix(1:40, nrow=4)
system.time(apply(expand.grid(m[,1],m[,2],m[,3],m[,4],m[,5],m[,6],m[,7],m[,8],m[,9],m[,10]),1,sum))
#    user  system elapsed 
#   4.866   0.108   4.971 
system.time(rowSums(expand.grid(as.data.frame(m))))
#    user  system elapsed 
#   0.141   0.030   0.171

编辑: 正如@Roland 所建议的,这不是特别有效的内存,因为它在执行任何添加之前采用列的完整叉积。更难阅读但内存效率更高的版本是:

Reduce(function(x, y) rowSums(expand.grid(x, y)), as.data.frame(m))