左矩阵分区和Numpy Solve

时间:2011-08-23 11:17:23

标签: python matlab numpy octave linear-algebra

我正在尝试将包含\运算符的代码从Matlab(Octave)转换为Python。示例代码

B = [2;4]
b = [4;4]
B \ b

这有效并产生1.2作为答案。使用此网页

http://mathesaurus.sourceforge.net/matlab-numpy.html

我将其翻译为:

import numpy as np
import numpy.linalg as lin
B = np.array([[2],[4]])
b = np.array([[4],[4]])
print lin.solve(B,b)

这给了我一个错误:

numpy.linalg.linalg.LinAlgError: Array must be square

为什么Matlab \与B的非方矩阵一起工作?

任何解决方案?

3 个答案:

答案 0 :(得分:15)

MathWorks documentation左侧矩阵划分:

  

如果A是m-by-n矩阵,其中m~ = n,B是具有m的列向量   组件,或具有几个这样的列的矩阵,然后X = A \ B是   在最小二乘意义上的解决方案对于欠定或超定   方程组AX = B.换句话说,X最小化范数(A * X - B),   矢量AX-B的长度。

numpy中的等价物是np.linalg.lstsq

In [15]: B = np.array([[2],[4]])

In [16]: b = np.array([[4],[4]])

In [18]: x,resid,rank,s = np.linalg.lstsq(B,b)

In [19]: x
Out[19]: array([[ 1.2]])

答案 1 :(得分:8)

当使用\运算符时,Matlab实际上会执行许多不同的操作,具体取决于所涉及的矩阵的形状(有关详细信息,请参阅here)。在您的示例中,Matlab返回最小二乘解,而不是直接求解线性方程,就像方阵一样。要在numpy中获得相同的行为,请执行以下操作:

import numpy as np
import numpy.linalg as lin
B = np.array([[2],[4]])
b = np.array([[4],[4]])
print np.linalg.lstsq(B,b)[0]

应该给你与Matlab相同的解决方案。

答案 2 :(得分:2)

你可以形成左反:

import numpy as np
import numpy.linalg as lin
B = np.array([[2],[4]])
b = np.array([[4],[4]])

B_linv = lin.solve(B.T.dot(B), B.T)
c = B_linv.dot(b)
print('c\n', c)

结果:

c
 [[ 1.2]]

实际上,我们可以简单地运行求解器一次,而不会形成逆,如下所示:

c = lin.solve(B.T.dot(B), B.T.dot(b))
print('c\n', c)

结果:

c
 [[ 1.2]]

......和以前一样

为什么呢?这是因为:

我们有:

enter image description here

乘以B.T,给我们:

enter image description here

现在,B.T.dot(B)是正方形,满级,有倒数。因此,我们可以乘以B.T.dot(B)的倒数,或者使用上面的解算器来获取c