如果给出一组向量(它们可以作为矩阵的列向量提供),并且我想获得最大独立向量,那么最好的方法是什么?
我可以一次向结果集添加一个向量,以查看新形成的矩阵的等级是否增加。但我觉得效率不高。当然,我可以回去做高斯消除来解决这个问题。但我只是想知道是否有更好的(有效和数字稳定和机器人)解决这个问题的方法。
感谢。
修改
通过观察等级增加可能无效,感觉增加。我们可以通过观察等级是否正在减少来进行删除。
答案 0 :(得分:2)
这段代码可以解决问题。它有点脏,因为它在飞行中增长rInd
,这不是最有效的,但这个想法更重要。它使用QR分解,这基本上是Gram-Schmidt正交化。从这里开始,它遍历r的行,直到找到A
中的下一个向量,该向量添加与当前已知基础线性无关的东西。
iUnderConsideration = 1;
[q,r] = qr(A);
rInd = [];
for j = 1:size(r,2),
if(r(iUnderConsideration,j) ~= 0)
rInd = [rInd r(:,j)];
iUnderConsideration = iUnderConsideration + 1;
end
if(iUnderConsideration > size(r,1))
break;
end
end
q*rInd %here's your answer
作为旁注,此代码将选择矩阵A
的向量而不更改它们。 svd
不会直接给你这些。
答案 1 :(得分:2)
[U,S,V]=svd(vectors);
U(1:size(vectors,1),1:size(vectors,2))=vectors;
U现在包含原始矢量加上最佳正交集。
答案 2 :(得分:1)
执行RREF并查找带有前导零的列是最好的选择:
matr(:,logical(sum(rref(matr)==1)))
这将为您提供矩阵列空间的基础。
答案 3 :(得分:0)
SVD是你的答案。