单行:
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 足够大,矩阵乘法提供的所有优化都应该丢失。