【问题标题】:Left Matrix Division and Numpy Solve左矩阵除法和 Numpy 求解
【发布时间】:2011-11-01 21:00:34
【问题描述】:

我正在尝试将包含 \ 运算符的代码从 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 的非方阵一起工作?

有什么解决办法吗?

【问题讨论】:

    标签: python matlab numpy octave linear-algebra


    【解决方案1】:

    你可以形成左逆:

    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]]
    

    ....和以前一样

    为什么?因为:

    我们有:

    乘以B.T,得到:

    现在,B.T.dot(B) 是正方形,满秩,确实有逆。因此,我们可以乘以 B.T.dot(B) 的倒数,或者使用上述求解器得到 c

    【讨论】:

      【解决方案2】:

      当使用 \ 运算符时,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 相同的解决方案。

      【讨论】:

        【解决方案3】:

        来自MathWorks documentation的左矩阵除法:

        如果 A 是一个 m×n 矩阵,m ~= n,B 是一个列向量,m 组件,或具有多个此类列的矩阵,则 X = A\B 是 对欠定或超定的最小二乘法解 方程组 AX = B。换句话说,X 最小化 norm(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]])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-13
          • 1970-01-01
          • 1970-01-01
          • 2017-06-06
          • 2015-01-15
          • 1970-01-01
          • 2020-05-08
          • 1970-01-01
          相关资源
          最近更新 更多