R中稀疏矩阵的快速2D积分

时间:2013-11-04 08:49:25

标签: r algorithm matrix sparse-matrix cumsum

提出这个问题的最明确的方法可能是分阶段发展......

Q1:一般情况

考虑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

Q2:稀疏案例

请注意,任何矩阵A都可以表示为列出其非零元素的数据框(称之为D)。 D$val包含A[A!=0],而D$iD$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的最快/最佳方式是什么?

Q3:特殊稀疏案例

现在假设A的每一行和每列只包含一个非零元素。 (或者等效地,假设D$iD$j分别是1:nrow(A)1:ncol(A)的排列。)

考虑到这个约束,让Q3为Q2。

Qk的

如前所述,Q1已为answered on SO before

Q2是Q1的稀疏版本。

我包含Q3,因为它可能比Q2有更快的解决方案,但是如果你觉得它太具体/不可用,那就忽略它。

编辑:供参考:

  • 为了与Q3的稀疏性保持一致,
    令N =列数=行数=非零元素数。
  • 对于基准测试,请使用数据
    D <- data.frame(i=1:10000,j=((1:10000)*3333)%%10000,val=1)

0 个答案:

没有答案