R中稀疏矩阵的快速二维求和
问这个问题最清楚的方式可能是分阶段发展 问题1:一般情况 考虑到R中稀疏矩阵的快速二维求和,r,algorithm,matrix,sparse-matrix,cumsum,R,Algorithm,Matrix,Sparse Matrix,Cumsum,问这个问题最清楚的方式可能是分阶段发展 问题1:一般情况 考虑到cumsum(x)[i]可以定义(对于所有i)为sum(x[1:i]) 也考虑泛化 CuMux2D(a)[i,j] < /代码>定义(对于所有i,j)为求和(a(1:i,1:j])< /代码>。这类似于将积分推广到二维的方法 > # Example > A [,1] [,2] [,3] [1,] 0 1 0 [2,] 0 0 1 [3,] 0 1 0 >
cumsum(x)[i]
可以定义(对于所有i)为sum(x[1:i])
也考虑泛化<代码> CuMux2D(a)[i,j] < /代码>定义(对于所有i,j)为<代码>求和(a(1:i,1:j])< /代码>。这类似于将积分推广到二维的方法
> # 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成为问题:假设A
很大,在R中计算cumsum2D(A)
的最快/最好的方法是什么?这个问题被提出并得到了回答
问题2:稀疏情况
请注意,任何矩阵A
都可以表示为列出其非零元素的数据帧(称之为D
)D$val
包含A[A!=0]
而D$i
和D$j
包含相应的下标。如果A
稀疏,则nrow(D)
较小
让cumsum2Dsparse(D)
等于cumsum2D(A)
假设问题2:假设D
表示稀疏矩阵,那么计算cumsum2Dsparse(D)
的最快/最佳方法是什么
问题3:特殊稀疏情况
现在假设A
的每一行和每一列只包含一个非零元素。(或者等效地,假设D$i
和D$j
分别是1:nrow(A)
和1:ncol(A)
的排列。)
给定此约束条件,设Q3为Q2
Qk
如前所述,Q1已经过测试
Q2是Q1的稀疏版本
我之所以将第三季度包括进来,是因为它可能比第二季度有一个更快的解决方案,但如果您觉得它太具体/不可用,请忽略它
编辑:供参考:
- 与第三季度的稀疏性保持一致,
设N=列数=行数=非零元素数 - 对于基准测试,请使用数据
D对于稀疏矩阵D,可以得到O(N^2)中每个元素的累积和,其中N是D中非零元素的数量。对于每个元素,如果所考虑的元素位于矩阵的左上部分,只需继续添加和即可。这可以通过比较他们的i和j来实现。@Abhishek我不确定你如何得到O(N^2)。是否仅在外部循环中的非零项上循环?如果是这样的话,那么上面示例的累积和中的[3,3]之类的元素呢?是的,您是对的。外部循环应该为矩阵中的每个元素运行。@Abhishek,这样我们就剩下O(nrowncolN)。我认为即使是非色情案件也可以在O(nrowncol)中完成。我想如果我们想要整个输出矩阵,我们就必须使用O(nrowncol)。
# 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