检查向量是否增加矩阵等级的最快方法

时间:2012-02-01 14:32:14

标签: performance matlab rank

给定n-by-m矩阵A,保证n> m = rank(A),并给出n-by-1列v,检查[A v]的最快方法是什么?排名严格大于A?

对于我的应用,A是稀疏的,n约为2 ^ 12,m在1:n-1中的任何位置。 比较等级(完整([A v]))在我的机器上花费大约一秒钟,我需要做数万次,所以我很乐意发现更快的方式。

3 个答案:

答案 0 :(得分:6)

如果你能负担得起零空间的一个计算,就没有必要重复求解。只需调用一次null就足够了。给定新的向量V,如果具有V和零空间基的点积不为零,则V将增加矩阵的秩。例如,假设我们有矩阵M,当然其等级为2.

M = [1 1;2 2;3 1;4 2];
nullM = null(M')';

如果我们将它附加到M,新的列向量[1; 1; 1; 1]会增加等级吗?

nullM*[1;1;1;1]
ans =
       -0.0321573705742971
        -0.602164651199413

是的,因为它在nullM中的至少一个基础向量上具有非零投影。

这个载体怎么样:

nullM*[0;0;1;1]
ans =
      1.11022302462516e-16
      2.22044604925031e-16

在这种情况下,两个数字基本上都为零,因此有问题的向量不会增加M的等级。

重点是,一旦生成零空间基础,只需要简单的矩阵向量乘法。如果你的矩阵太大(并且矩阵几乎满级),那么对null的调用将在这里失败,那么你将需要做更多的工作。但是,只要矩阵没有太多列,n = 4096就不会过大。

如果null太大,则另一种选择是调用svds,以找到基本上为零的奇异向量。这些将形成我们需要的零空间基础。

答案 1 :(得分:2)

我会将sprank用于稀疏矩阵。看看它,它可能比任何其他方法更快。

编辑:正如@IanHincks正确指出的那样,它不是排名。我将在这里留下答案,以防万一其他人将来需要它。

答案 2 :(得分:1)

也许你可以尝试解决系统A*x=v,如果它有一个解决方案,意味着排名不会增加。

x=(B\A)';
norm(A*x-B) %% if this is small then the rank does not increase