Python 函数scipy.linalg.lu中的上三角矩阵是否始终为行列形式?

Python 函数scipy.linalg.lu中的上三角矩阵是否始终为行列形式?,python,numpy,matrix,scipy,linear-algebra,Python,Numpy,Matrix,Scipy,Linear Algebra,我有一个m x n矩阵a,n>m,我试图通过它的行梯队形式来识别独立的行。函数scipy.linalg.lu返回矩阵的PLU分解,但U因子似乎不是梯队形式,即枢轴不是阶梯模式。据我所知,U因子应该总是在一个阶梯模式中 考虑以下示例: from numpy import array from scipy.linalg import lu A = array([[1, 1, 1, 1, 0, 1, 1, 1, 1, 0], [1, 1, 0, 0, 1, 0, 1, 0, 1

我有一个m x n矩阵a,n>m,我试图通过它的行梯队形式来识别独立的行。函数scipy.linalg.lu返回矩阵的PLU分解,但U因子似乎不是梯队形式,即枢轴不是阶梯模式。据我所知,U因子应该总是在一个阶梯模式中

考虑以下示例:

from numpy import array
from scipy.linalg import lu

A = array([[1, 1, 1, 1, 0, 1, 1, 1, 1, 0],
           [1, 1, 0, 0, 1, 0, 1, 0, 1, 1],
           [1, 1, 0, 0, 0, 1, 1, 0, 0, 0],
           [0, 1, 0, 1, 1, 0, 1, 0, 0, 1],
           [1, 1, 0, 0, 1, 1, 1, 1, 1, 1]])

P, L, U = lu(A)
U系数不是成排梯队形式。对于每一行k,枢轴应始终位于行k-1中枢轴的右侧。请参见第五行的轴不在第四行的轴的右侧:

array([[ 1.,  1.,  1.,  1.,  0.,  1.,  1.,  1.,  1.,  0.],
       [ 0.,  1.,  0.,  1.,  1.,  0.,  1.,  0.,  0.,  1.],
       [ 0.,  0., -1., -1.,  0.,  0.,  0., -1., -1.,  0.],
       [ 0.,  0.,  0.,  0.,  1., -1.,  0.,  0.,  1.,  1.],
       [ 0.,  0.,  0.,  0.,  1.,  0.,  0.,  1.,  1.,  1.]])

我以前从未见过LUP分解,但我怀疑它并不像你想象的那样。我在Matlab中进行了与上面在Python中相同的分解,得到了与您完全相同的结果。所以我不认为这是Python LU函数的问题

更新: 我也在R中实现了这一点(下面的代码),U矩阵再次给出了与Matlab和Python相同的结果。与其他警告不同,它给出了以下警告:

Warning message:
In .local(x, ...) :
  Exact singularity detected during LU decomposition: U[i,i]=0, i=4.
Matlab:

代码:

Matlab结果:
U=

Python结果(来自您的代码):

R:

代码:


不能保证LU分解将产生行梯队形式的U矩阵。在这种情况下,它失败的原因可能是因为矩阵是奇异的;我强烈怀疑这就是原因,因为奇异矩阵的一个特征是缺少一组完整的枢轴


有关详细信息,请参见中的一般矩阵部分和其中提供的参考。

请提供示例代码。顺便说一下,我已经解决了通过QR分解识别独立行的问题,虽然我的第一次尝试是按照线性代数教科书,通过高斯消去法来识别它们。
scipy.linalg.lu
()并没有说
U
将以行列形式()。上面说是上三角形(),这很奇怪。根据U系数的以下属性(STRANG,1988,第72页),第五列中枢轴下方的元素应为零,而不是1:“(i)非零行排在第一位,否则会有行交换,枢轴是这些行中的第一个非零条目。(ii)每个支点下面是一列零,通过消去法获得。(iii)每个支点位于上一行支点的右侧。这产生了阶梯模式。”STRANG,G.线性代数及其应用。第三版,汤姆森,1988年。事实上,我应用LU分解的矩阵比上面例子中给出的矩阵大得多,而U因子在阶梯模式中比上面给出的要小得多。我目前的假设是Python和Matlab中LU函数计算的U因子中的行没有正确排序。我也在R中进行了因子分解(见更新的答案),它也给出了相同的结果。R给出的奇点警告仅对平方矩阵有意义。消除后,矩形矩阵的对角位置很可能有零。与平方矩阵不同,对角线中的零并不意味着矩阵是秩亏矩阵或没有逆矩阵。事实上,示例中的矩阵A是满秩的。有趣的是,如果我取消术语U[5,5],通过减去第4行和第5行,我得到了预期的行梯队形式,但乘以因子PLU并不能恢复A。这似乎违反了Strang(1998,第72页)中的(iii)。我认为这更像是一个线性代数问题,而不是一个计算问题。我将在数学交流上发表这个问题。
A = ([[1, 1, 1, 1, 0, 1, 1, 1, 1, 0],
           [1, 1, 0, 0, 1, 0, 1, 0, 1, 1],
           [1, 1, 0, 0, 0, 1, 1, 0, 0, 0],
           [0, 1, 0, 1, 1, 0, 1, 0, 0, 1],
           [1, 1, 0, 0, 1, 1, 1, 1, 1, 1]]);
[L,U,P] = lu(A);
U
     1     1     1     1     0     1     1     1     1     0
     0     1     0     1     1     0     1     0     0     1
     0     0    -1    -1     0     0     0    -1    -1     0
     0     0     0     0     1    -1     0     0     1     1
     0     0     0     0     1     0     0     1     1     1
U = 

array([[ 1.,  1.,  1.,  1.,  0.,  1.,  1.,  1.,  1.,  0.],
       [ 0.,  1.,  0.,  1.,  1.,  0.,  1.,  0.,  0.,  1.],
       [ 0.,  0., -1., -1.,  0.,  0.,  0., -1., -1.,  0.],
       [ 0.,  0.,  0.,  0.,  1., -1.,  0.,  0.,  1.,  1.],
       [ 0.,  0.,  0.,  0.,  1.,  0.,  0.,  1.,  1.,  1.]])
library(Matrix)
A <- Matrix( c( 1, 1, 1, 1, 0, 1, 1, 1, 1, 0 , 1, 1, 0, 0, 1, 0, 1, 0, 1, 1 , 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 , 0, 1, 0, 1, 1, 0, 1, 0, 0, 1 , 1, 1, 0, 0, 1, 1, 1, 1, 1, 1 ),nrow=5,ncol=10,byrow=TRUE )
expand(mylu <-lu(A))
class "dtrMatrix" (unitriangular)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    .    .    .    .
[2,]    0    1    .    .    .
[3,]    1    0    1    .    .
[4,]    1    0    1    1    .
[5,]    1    0    1    0    1

$U
5 x 10 Matrix of class "dgeMatrix"
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    1    1    1    0    1    1    1    1     0
[2,]    0    1    0    1    1    0    1    0    0     1
[3,]    0    0   -1   -1    0    0    0   -1   -1     0
[4,]    0    0    0    0    1   -1    0    0    1     1
[5,]    0    0    0    0    1    0    0    1    1     1

$P
5 x 5 sparse Matrix of class "pMatrix"

[1,] | . . . .
[2,] . . . | .
[3,] . . | . .
[4,] . | . . .
[5,] . . . . |