我有一个稀疏矩阵,例如
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)。我尝试通过两种方式来做,但它给出了不同的结果
转换为完整矩阵并使用
查找排名rank(full(A)) = 3
使用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 :(得分: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表现更好,如果级别很小则表现更差)。
最后,您可能希望根据最有可能使用的矩阵类型调整您的技术解决方案。