我有兴趣计算相当大的等级,最大的数量级为 x,稀疏矩阵的整数都是 0、1 或 -1。我一直在尝试使用 Matlab 来实现这一点。特别是,我的方法是使用 QR 因式分解——将我的矩阵分解为,其中是置换矩阵,是正交是上三角矩阵——然后计算非的对角线上的零条目。
使用 Matlab 的内置QR 函数,以下 Matlab 代码计算我的一些示例的正确排名。(我已经确认了一些针对 rank(full(T)) 的较小矩阵的排名。)
load(‘FILE_NAME.dat')
T = spconvert(FILE_NAME);
tic
[Q,R,P]=qr(T);
[m,n] = size(T);
tol = max(size(T))*eps*abs(R(1,1));
r = 0;
while (r<min(m,n) & abs(R(r+1,r+1)) >= tol)
r = r+1;
end
tim=toc
r
也就是说,即使对于我的一些较小的矩阵,此代码似乎也相当慢且内存密集。例如,在其中一个约为 70,000 x ~50,000 的矩阵上,上述代码在 64 GB 服务器上需要花费数小时和大部分内存。(我注意到的一件事是,如果我将上面计算的 Q、R 和 P 保存到 .mat 文件中,文件大小似乎会快速增长。例如,当初始矩阵为 ~15,000 x 时,.mat 文件为 ~1 GB ~15,000)
是否有更好的(更快或更少内存密集型)方法来计算大型稀疏矩阵的等级?例如,一种更有效的实现 QR 分解的方法,甚至是完全不同于 QR 的方法?