如何消除矩阵中不对它的秩有贡献的行?

4

我刚接触MATLAB并有一个看起来很明显的问题,但我不太明白如何解决。

假设我有一个100 x 100的矩阵,它的秩是50。我怎样才能将其维度降低为50 x 100呢?也就是说,我如何消除那些对它的秩没有贡献的行呢?


1
@CroCo - 是的,那是等效的操作。 - rayryeng
类似的问题在这里:http://stackoverflow.com/questions/24547255/find-dependent-rows-columns-of-a-matrix-using-matlab 但是看起来rayryeng的答案可能更好。 - eigenchris
@Yaeli778 - 谢谢 :) 祝你好运! - rayryeng
1
@Yaeli778:我必须补充一点,那些向量的选择并不是唯一的。考虑矩阵 A=[1,0; 1,1; 0,1]。你可以选择任意两行的组合,它们都可以满足你的问题。从某种意义上说,所有这些行都对排名有贡献,只是不是同时贡献! - knedlsepp
显示剩余5条评论
1个回答

8
你可以使用 rref 来确定矩阵中哪些列组成了 列空间,从而确定哪些向量决定了矩阵的秩。给定你要检查的矩阵 A,你可以这样调用 rref
[R,RB] = rref(A);

R 是将您的矩阵分解为行简化阶梯形式,而 RB 表示形成矩阵 A 基础的列索引。因此,要寻求您所需的内容,您只需执行以下操作:

Areduced = A(:,RB);
Areduced将是仅由形成矩阵A的列空间的那些基向量组成的矩阵,因此它将减少您的矩阵A,使其仅包含允许您的矩阵具有完全秩的那些列。
然而,根据您的问题,您想要沿着行进行操作而不是列。 因此,您可以先转置矩阵,在结果上使用rref,然后在完成后再转置回来:
Atranspose = A.';
[R,RB] = rref(Atranspose);
Areduced = Atranspose(:,RB).';

谢谢,它正在工作。我想你只需要改变顺序:Areduced = R(RB,:); - Yaeli778
@Yaeli778 - 哎呀! 上面的代码应该是Areduced = A(:,RB);。不过,你说你想要沿着行操作,所以你现在做的还不太正确。请看我的更新答案。 - rayryeng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接