我需要计算4096x4096稀疏矩阵的等级,我使用C / C ++代码。 我找到了一些图书馆(比如Armadillo),但它们太慢了(差不多5分钟)。
我也尝试了两个开源版本的Matlab(Freemat和Octave)但当我尝试用脚本进行测试时都崩溃了。
5分钟并不是那么多,但我必须得到一百万个矩阵的等级,所以越快越好。
有人知道一个用于排名计算的快速库吗?
答案 0 :(得分:1)
Eigen库支持稀疏矩阵,试试看。
答案 1 :(得分:1)
计算代数秩是O(n ^ 3),其中n是矩阵大小,因此它本身就很慢。你需要例如。如果你的矩阵条件不好(n = 4096,一个典型的矩阵病态非常严重),那么执行旋转就会很慢且不准确。
现在,等级是多少?它是图像的维度。当n很大时很难计算,并且它会被输入的任何小的数值不准确性破坏。对于n = 4096,除非您碰巧有特别好的条件矩阵,否则这将阻止您使用旋转算法做任何有用的事情。
实际上,最好的方法是修复截止epsilon,计算奇异值s_1> ...> s_n并且将秩作为最低整数r,使得和(s_i ^ 2,i> r)
因此,您需要一个稀疏的SVD例程,例如。来自there。
这可能不会更快,但至少它会正确。
你可以要求提供加速事物所需的更少的奇异值。这是一个棘手的问题,没有关于背景和你如何得到这些矩阵的信息,我们无能为力。
答案 2 :(得分:1)
请尝试以下代码(文档在此处)。 这是用特征库计算矩阵A的秩的一个例子:
MatrixXd A(2,2);
A << 1 , 0, 1, 0;
FullPivLU<MatrixXd> luA(A);
int rank = luA.rank();