如何计算矩阵的总和?
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))
我有一个大小为 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))