Python 在numpy或matlab中由满秩非方矩阵求可逆方矩阵

Python 在numpy或matlab中由满秩非方矩阵求可逆方矩阵,python,matlab,numpy,linear-algebra,svd,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}?这可以通过奇异值分解来实现吗?代码片段将非常受欢迎 编辑: 为了使这更具体,请考虑下面的Pyt

假设您有一个满秩的
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,我们需要找到一组线性独立列向量的索引。

我的第一个想法是尝试M列中N的每个可能组合。可以这样做(在Python中):

如果需要列索引而不是结果的平方矩阵,只需将
return B
替换为
return colset
。或者您可以使用
return colset,B
获得这两个属性

我不知道SVD在这里会有什么帮助。事实上,我想不出任何纯粹的数学运算能将A转换成B(或者甚至能计算出MxN列选择矩阵Q,从而使B=A.Q),除了通过反复试验。但是,如果你想知道是否存在,math.stackexchange.com将是一个好去处


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

简单,用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是一件非常糟糕的事情,并且您选择使用它,否则您实际上不应该在MATLAB中使用det。

无论谁否决了,请证明您认为此过程是错误的。我没有否决它,但它确实很昂贵。definite的计算成本很高:如果numpy提供,行减少会更好(我不知道)。更好的算法是归纳式的:假设n-1列是线性独立的。然后继续尝试下一个未使用的列,直到找到一个线性独立的列。重复一遍。请记住,即使您可能不必搜索所有这些内容(除非您这样做,否则它们不会被创建),也有M/(N!(M-N)!)您愿意在那里搜索的组合。我不知道Numpy是否也提供行减少。。。行列式只是我能想到的第一种确定列的线性独立性的方法,因为我找不到
函数(当然有一个,但它并不像你想的那样)。我想我应该编辑一下,任何寻找列是否线性独立的过程都可以在那里工作。你想知道为什么这是一个糟糕的解决方案吗?此解决方案的问题是,根据M和N的值,其效率可能非常低。例如,当N=100和M=50时,可能有超过1e29个列的组合。用蛮力搜索专栏简直是疯了。考虑到QR分解中有一个非常好的解决方案,使用诸如蛮力搜索之类的低效算法是愚蠢的。更糟糕的是,我相信你最初的回答暗示了一个决定奇点的决定因素。det对于任何矩阵来说都是一件可怕的事情。从来没有人说过它在数学上是错误的。我认为,作为解决这个问题的一种方法,提出这样的建议是很糟糕的,并给出了一个很好的理由。如果Python中没有透视QR,那么仍然有其他选择。没有什么能阻止你提出格兰·施密特的变体,这和QR没什么不同。所以写一个旋转形式的GS,它只是说,你减去指向前面列的方向的分量,然后在剩下的最大的列上旋转。(这写起来很简单。)请注意,由于OP对python解决方案也很感兴趣,请参见这里的scipy的scipy.linalg.qr:
M*E
ans =
     3     0     0     0     0
     0     0     1     0     0
     0     0     0     1     0
     0     2     0     0     0