左矩阵分区和Numpy Solve

BBD*_*Sys 13 python matlab numpy linear-algebra octave

我试图将包含\运算符的代码从Matlab(Octave)转换为Python.示例代码

B = [2;4]
b = [4;4]
B \ b
Run Code Online (Sandbox Code Playgroud)

这有效并产生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)
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误:

numpy.linalg.linalg.LinAlgError: Array must be square
Run Code Online (Sandbox Code Playgroud)

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

对此有何解决方案?

unu*_*tbu 16

MathWorks文档中获取左矩阵划分:

如果A是m×n的m-by-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]])
Run Code Online (Sandbox Code Playgroud)


tal*_*ies 8

当使用\运算符时,Matlab实际上会执行许多不同的操作,具体取决于所涉及的矩阵的形状(有关详细信息,请参见此处).在您的示例中,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]
Run Code Online (Sandbox Code Playgroud)

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