我有一个矩阵
A= [ 1 2 4
2 3 1
3 1 2 ]
我想按行和按列计算它的累积总和,也就是说,我希望结果是
B = [ 1 3 7
3 8 13
6 12 19 ]
关于如何快速在 R 中实现这一点的任何想法? (可能使用函数 cumsum)
(我有巨大的矩阵)
谢谢!
最佳答案
单线:
t(apply(apply(A, 2, cumsum)), 1, cumsum))
基本的观察是您可以首先计算列上的累积总和,然后计算行上该矩阵的累积总和。
注意:在做行时,您必须转置生成的矩阵。
你的例子:
> apply(A, 2, cumsum)
[,1] [,2] [,3]
[1,] 1 2 4
[2,] 3 5 5
[3,] 6 6 7
> t(apply(apply(A, 2, cumsum), 1, cumsum))
[,1] [,2] [,3]
[1,] 1 3 7
[2,] 3 8 13
[3,] 6 12 19
关于性能:我现在知道这种方法可以很好地扩展到大矩阵。在复杂性方面,这应该接近最优。通常,
apply
性能也没有那么差。编辑
现在我很好奇 - 什么方法更好?一个简短的基准:
> A <- matrix(runif(1000*1000, 1, 500), 1000)
>
> system.time(
+ B <- t(apply(apply(A, 2, cumsum), 1, cumsum))
+ )
User System elapsed
0.082 0.011 0.093
>
> system.time(
+ C <- lower.tri(diag(nrow(A)), diag = TRUE) %*% A %*% upper.tri(diag(ncol(A)), diag = TRUE)
+ )
User System elapsed
1.519 0.016 1.530
因此: Apply 优于矩阵乘法 15 倍。(仅供比较:MATLAB 需要 0.10719 秒。)结果并不令人惊讶,因为
apply
-version 可以在 O(n^2) 中完成,而矩阵乘法将需要大约。 O(n^2.7) 计算。因此,如果 n 足够大,矩阵乘法提供的所有优化都应该丢失。
关于arrays - 矩阵中的累积和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13519717/