R中稀疏矩阵的快速二维求和

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 >

问这个问题最清楚的方式可能是分阶段发展

问题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
> 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