【发布时间】:2015-01-10 14:36:44
【问题描述】:
我有一个稀疏矩阵,例如
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.
【问题讨论】:
-
您是否尝试过使用
eigs查找非零特征值的数量? -
先生,这需要很长时间。
-
svds(A)工作得更快吗?排名将是结果中非零的数量(最多允许出现数字错误) -
我报告了比排名函数更大的计算时间
-
sprank是 Matlab 提供的快速默认方法,但给出的答案不正确。您可能可以就这个主题写一篇完整的论文。优化非常大的稀疏矩阵的秩计算?您的问题可能更适合数学交流 (math.stackexchange.com)。这可能会有所帮助:ljk.imag.fr/membres/Jean-Guillaume.Dumas/Publications/…
标签: performance algorithm matlab matrix