计算矩阵的等级

时间:2012-07-03 09:21:52

标签: c++ c matrix rank

我需要计算4096x4096稀疏矩阵的等级,我使用C / C ++代码。 我找到了一些图书馆(比如Armadillo),但它们太慢了(差不多5分钟)。

我也尝试了两个开源版本的Matlab(Freemat和Octave)但当我尝试用脚本进行测试时都崩溃了。

5分钟并不是那么多,但我必须得到一百万个矩阵的等级,所以越快越好。

有人知道一个用于排名计算的快速库吗?

3 个答案:

答案 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();