给定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]))在我的机器上花费大约一秒钟,我需要做数万次,所以我很乐意发现更快的方式。
答案 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