gpt4 book ai didi

arrays - 矩阵中的累积和

转载 作者:行者123 更新时间:2023-12-03 12:32:16 25 4
gpt4 key购买 nike

我有一个矩阵

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com