假设您有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}
?这可以使用奇异值分解来完成吗?代码片段将非常受欢迎。
编辑: 为了使其更具体,请考虑以下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
线性独立列向量的索引。
答案 0 :(得分:6)
在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确定矩阵是否是单数是绝对的,肯定的,绝对是最糟糕的方式。
改用排名。
基本上,你几乎不应该在MATLAB中使用det,除非你理解为什么它是如此糟糕的事情,你选择使用它尽管如此。
答案 1 :(得分:1)
我的第一个想法是尝试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 B
替换为return colset
即可。或者你可以使用return colset,B
获得两者。
我不知道SVD在这方面会有什么帮助。实际上,除了通过反复试验之外,我无法想到将A转换为B(或甚至任何能够找出MxN列选择矩阵Q,使得B = A.Q)的纯数学运算。但是如果你想知道一个是否存在,math.stackexchange.com将是一个很好的问题。
如果你需要的只是一种计算方式,那么上面的代码就足够了。