优化非常大的稀疏矩阵的秩计算

时间:2014-11-13 12:37:59

标签: performance algorithm matlab matrix

我有一个稀疏矩阵,例如

A =

   (1,1)        1
   (3,1)        1
   (1,2)        1
   (2,2)        1
   (1,3)        1
   (3,3)        1
   (4,3)        1
   (4,4)        1

A的完整矩阵可以看如下:

full(A) =

     1     1     1     0
     0     1     0     0
     1     0     1     0
     0     0     1     1

我希望通过快速方式找到矩阵A的等级(因为我的矩阵可以扩展到10000 x 20000)。我尝试通过两种方式来做,但它给出了不同的结果

  1. 转换为完整矩阵并使用

    查找排名
    rank(full(A)) = 3
    
  2. 使用sprank

    查找排名
    sprank(A) = 4
    
  3. 真正的答案必须是3,这意味着使用第一种方式。但是,需要很长时间才能找到排名,特别是大尺寸的矩阵。我知道第二种方式给出4的原因是因为sprank只告诉你矩阵有多少行/列有非零元素,而rank则报告矩阵的实际等级,表示你的行数矩阵是线性独立的。 sprank(A)为4,但rank(A)仅为3,因为您可以将第三行写为其他行的线性组合,特别是A(2,:) - A(1,:)

    我的问题是如何找到时间消耗最少的稀疏矩阵的等级

    更新:我试图用某种方式。但是,它报告了更长的时间消耗

    %% Create random matrix
     G = sparse(randi(2,1000,1000))-1;
     A=sparse(G) %% Because my input matrix is sparse matrix
     %% Measure performance
    >> tic; rank(full(A)); toc
    Elapsed time is 0.710750 seconds.
    >> tic; svds(A); toc
    Elapsed time is 1.130674 seconds.
    >> tic; eigs(A); toc
    Warning: Only 3 of the 6 requested eigenvalues converged. 
    > In eigs>processEUPDinfo at 1472
      In eigs at 365
    Elapsed time is 4.894653 seconds.
    

1 个答案:

答案 0 :(得分:1)

我不知道哪种算法最适合您,我同意在math.stackexchange.com上提问可能更合适。当我尝试使用你提供G = sparse(randi(2,1000,1000))-1;的随机矩阵时,我发现它的等级几乎不可能<1000,无论你使用什么算法,它的性能都可能与数据有关。例如,在2000样本的秩矩阵(分别为[198,325,503,1026,2000]]上使用eigs(G)得到以下表现(以秒为单位):[0.64,0.90,1.38,1.57,4.00],表示eigs函数的性能与矩阵的排名密切相关。

我还搜索了现有的工具并尝试了spnrank,我认为这不是数据依赖的(它比高级别的eigs表现更好,如果级别很小则表现更差)。

最后,您可能希望根据最有可能使用的矩阵类型调整您的技术解决方案。