假设你有一个满秩的NxM
矩阵A
,其中M>N
。如果我们用C_i
(维度为Nx1
)表示列,那么我们可以将矩阵写成
A = [C_1, C_2, ..., C_M]
如何获得原始矩阵A
的第一个线性无关的列,以便构造一个新的NxN
矩阵B
,该矩阵是一个具有非零行列式的可逆矩阵。
B = [C_i1, C_i2, ..., C_iN]
如何在matlab或python numpy中找到索引{i1, i2, ..., iN}
?使用奇异值分解可以做到这一点吗?代码片段将非常受欢迎。
EDIT:为了使这一点更具体,请考虑以下python代码
from numpy import *
from numpy.linalg.linalg import det
M = [[3, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 1],
[0, 2, 0, 0, 0]]
M = array(M)
I = [0,1,2,4]
assert(abs(det(M[:,I])) > 1e-8)
因此,给定一个矩阵M,就需要找到一组N
线性无关列向量的索引。
发布于 2010-08-22 03:12:43
在MATLAB中很容易,很容易。使用QR,特别是旋转的QR。
M = [3 0 0 0 0;
0 0 1 0 0;
0 0 0 0 1;
0 2 0 0 0]
[Q,R,E] = qr(M)
Q =
1 0 0 0
0 0 1 0
0 0 0 1
0 1 0 0
R =
3 0 0 0 0
0 2 0 0 0
0 0 1 0 0
0 0 0 1 0
E =
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 0 1
0 0 0 1 0
E的前4列指定要使用的M列,即列1、2、3、5。如果您想要M列,只需形成乘积M*E。
M*E
ans =
3 0 0 0 0
0 0 1 0 0
0 0 0 1 0
0 2 0 0 0
顺便说一句,使用det来确定一个矩阵是否奇异是绝对、肯定、绝对最糟糕的方法。
请改用rank。
从本质上讲,您不应该在MATLAB中使用det,除非您了解为什么它是一件如此糟糕的事情,并且您选择使用它。
发布于 2010-08-21 22:00:20
我的第一个想法是尝试M列中的N个可能的组合。这可以像这样完成(在Python中):
import itertools
import numpy.linalg
# 'singular' returns whether a matrix is singular.
# You could use something more efficient than the determinant
# (I'm not sure what options there are in NumPy)
singular = lambda m: numpy.linalg.det(m) == 0
def independent_square(A):
N,M = A.shape
for colset in itertools.combinations(xrange(M), N):
B = A[:,colset]
if not singular(B):
return B
如果您想要列索引而不是生成的方阵,只需用return colset
替换return B
即可。或者,您可以使用return colset,B
同时实现这两个功能。
我不知道SVD会有什么帮助。事实上,除了反复试验之外,我想不出任何纯粹的数学运算可以将A转换为B(甚至是任何可以计算出B=A.Q的MxN列选择矩阵Q的运算)。但是如果你想知道它是否存在,math.stackexchange.com将是一个很好的去处。
如果您所需要的只是一种计算方法,那么上面的代码应该就足够了。
https://stackoverflow.com/questions/3539026
复制