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

计算科学 优化 matlab 矩阵
2021-12-22 03:12:31

我有一个稀疏矩阵,例如

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×20000)。我尝试通过两种方式做到这一点,但它给出了不同的结果

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

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

    sprank(A) = 4
    

真正的答案必须是 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.
0个回答
没有发现任何回复~