我有一个n×n的奇异矩阵。我希望添加k行(这些行必须来自标准基向量e1,e2,...,en),使得新的(n+k)×n矩阵是满列秩的。 添加的行数k必须最小化,并且它们可以以任何顺序添加(不仅限于e1,e2,...,可以是e4,e10,e1,...),只要k是最小的。
有人知道简单的方法吗? 任何帮助都将不胜感激。
有人知道简单的方法吗? 任何帮助都将不胜感激。
n-rank(A)
列的转置来实现此操作。
在matlab中,这可以通过 qr
函数实现(请参见 matlab 文档 此处):r=rank(A);
[Q,R,E]=qr(A);
newA=[A;transpose(E(:,end-r+1:end))];
transpose(E(:,end-r+1:end))
都将成为标准基的一个成员,newA
的秩将为n,并且这也是您所需的最小标准基数。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)]
[0 I]
,E是一个置换矩阵,因此B*transpose(E)
只是E的最后n-rank(A)
列的转置,因此是由标准基向量组成的一组行,这正是您想要的!这个问题和n是否很大有关。最简单的解决方法是不使用任何算法,尝试添加e_i并查看排名是否增加。如果排名增加了,则保留e_i并继续进行下一个操作,直到完成。
我喜欢@Xiaolei Zhu的解决方案,因为它很优雅,但另一种更高效的方法是:
A
的任何行(索引为i
)是否全部为零。如果是,则必须连接相应的e_i
。n-rank(A)
列的任何子集。单位矩阵的行/列可以以任意顺序相加。一般情况下,不需要按照通常的顺序如e1,e2,...来使矩阵满秩。