在numpy或matlab中从满秩的非方阵中获得可逆方阵

时间:2010-08-21 21:19:09

标签: python matlab numpy linear-algebra svd

假设您有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线性独立列向量的索引。

2 个答案:

答案 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将是一个很好的问题。

如果你需要的只是一种计算方式,那么上面的代码就足够了。