提出这个问题的最明确的方法可能是分阶段发展......
考虑cumsum(x)[i]
可以定义(对于所有i)sum(x[1:i])
。
同时考虑将cumsum2D(A)[i,j]
定义(对于所有i,j)定义为sum(A[1:i,1:j])
。这类似于积分推广到2维的方式。
> # Example
> A
[,1] [,2] [,3]
[1,] 0 1 0
[2,] 0 0 1
[3,] 0 1 0
> cumsum2D(A)
[,1] [,2] [,3]
[1,] 0 1 1
[2,] 0 1 2
[3,] 0 2 3
让Q1成为问题:假设cumsum2D(A)
很大,在R中计算A
的最快/最佳方法是什么?这个问题被提出并回答here。
请注意,任何矩阵A
都可以表示为列出其非零元素的数据框(称之为D
)。 D$val
包含A[A!=0]
,而D$i
和D$j
包含相应的下标。如果A
稀疏nrow(D)
很小。
让cumsum2Dsparse(D)
等于cumsum2D(A)
。
# Example
> D
i j val
1 1 2 1
2 2 3 1
3 3 2 1
> cumsum2Dsparse(D)
[,1] [,2] [,3]
[1,] 0 1 1
[2,] 0 1 2
[3,] 0 2 3
让Q2成为问题:假设cumsum2Dsparse(D)
表示稀疏的矩阵,计算D
的最快/最佳方式是什么?
现在假设A
的每一行和每列只包含一个非零元素。 (或者等效地,假设D$i
和D$j
分别是1:nrow(A)
和1:ncol(A)
的排列。)
考虑到这个约束,让Q3为Q2。
如前所述,Q1已为answered on SO before。
Q2是Q1的稀疏版本。
我包含Q3,因为它可能比Q2有更快的解决方案,但是如果你觉得它太具体/不可用,那就忽略它。
编辑:供参考:
D <- data.frame(i=1:10000,j=((1:10000)*3333)%%10000,val=1)