arrays - 矩阵中的累积和

标签 arrays performance r matrix cumsum

我有一个矩阵

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/

相关文章:

r - 预测 v7 和 ggplot2 图形将拟合线添加到自动绘图

r - 从 R 中的 HTML 片段中提取 URL

arrays - 使用 vb.net 将数组转为 Excel

JavaScript 性能 : simple key search in object vs value search in array

mysql - 加速 GROUP BY、SUM 和 AVG 查询

java - 将类似方法重构为策略模式的性能成本?

r - 尝试从简单线性回归进行预测时出错

javascript - 如何让 php `json_encode` 返回 Javascript 数组而不是 Javascript 对象?

javascript - react JSX : rendering nested arrays of objects

java - 计算 2D 数组输出的频率并将其分配给 1D 数组