我有一个nxn奇异矩阵。我想将k行(必须来自标准基础e1,e2,...,en)添加到此矩阵,使得新的(n + k)xn矩阵是完整列等级。添加的行数k必须最小,并且只要k是最小值,它们可以按任何顺序添加(不仅仅是e1,e2,...,它可以是e4,e10,e1,...)。
有人知道一个简单的方法吗?任何帮助表示赞赏。
答案 0 :(得分:4)
您可以通过执行QR decomposition with column pivoting,然后对置换矩阵的最后n-rank(A)
列进行转置来实现此目的。
在matlab中,这是通过qr
函数实现的(参见matlab文档here):
r=rank(A);
[Q,R,E]=qr(A);
newA=[A;transpose(E(:,end-r+1:end))];
transpose(E(:,end-r+1:end))
的每一行都是标准基础的成员,newA
的等级将为n,这也是您需要这样做的最小标准基础数。
这是如何工作的:
使用列旋转进行QR分解是将矩阵A分解为产品的标准程序:
一个* E == Q * - [R
如果A是实数,Q是orthogonal matrix,如果A是复数,则Q是酉矩阵; R是upper triangular matrix,E是permutation matrix。
简而言之,选择排列使得对角线元素大于同一行中的非对角线,并且对角线元素的大小不增加。可以在netlib QR factorization page上找到更详细的说明。
由于Q和E都是正交(或单一)矩阵,因此R的秩与A的秩相同。为了提高A的等级,我们只需要找到增加R的等级的方法;由于旋转的结构和它是上三角形的事实,这更加直截了当。
现在,由于对旋转过程的要求,如果R的任何对角元素为0,则整行必须为0.如果R负责无效,则底部的n-rank(A)
行为0。如果我们用单位矩阵替换右下角,那么新矩阵将是满秩。好吧,我们不能真正做到替换,但是我们可以将行矩阵附加到R的底部并形成一个具有相同等级的新矩阵:
B==[ 0 I ] => newR=[ R ; B ]
这里I
的维度是A的无效性和R的无效性。
很容易看出rank(newR)=n
。然后我们还可以通过以微不足道的方式扩展其维数来定义新的单一Q矩阵:
newQ=[Q 0 ; 0 I]
这样,我们的新秩n矩阵可以作为
获得newA=newQ*newR.transpose(E)=[Q*R ; B ]*transpose(E) =[A ; B*transpose(E)]
请注意,B是[0 I]
,E是置换矩阵,因此B*transpose(E)
只是转置
E的最后n-rank(A)
列,以及由标准基础组成的一组行,这正是您想要的!
答案 1 :(得分:3)
n非常大吗?不使用任何数学运算的最简单的解决方案是尝试添加e_i并查看排名是否增加。如果是,请保留e_i。继续直到完成。
答案 2 :(得分:1)
我喜欢@Xiaolei Zhu的解决方案,因为它很优雅,但另一种方式(计算效率更高):
i
的{{1}}索引的任何行是否全为零。如果是,则必须连接相应的A
。 e_i
列的任何子集。答案 3 :(得分:-1)
行/列可以按任何顺序添加。它不需要按照通常的顺序添加为e1,e2,...一般情况下使矩阵满级。