【问题标题】:MATLAB vs Python numpy array/matrix multiplicationMATLAB vs Python numpy 数组/矩阵乘法
【发布时间】:2015-10-12 08:34:50
【问题描述】:

我正在翻译一些 MATLAB 代码,但在理解 MATLAB 和 Python 的 numpy 之间的语法差异时遇到了一些问题。

在 MATLAB 中,我有一个 6 x 6 矩阵 A,以及 6 个浮点值 a、b、c、d、e、f。 MATLAB代码

B = A*[a;b;c;d;e;f];

产生一个 6 x 1 的矩阵 B。 所以我认为 MATLAB 运算符 '*' 必须对应于 numpy 运算符 numpy.dot()。

所以在我的 Python 代码中,我有相同的矩阵 A,以及相同的 a、b、c、d、e 和 f 值。

B = numpy.dot(A, [[a],[b],[c],[d],[e],[f]])

不会产生相同的矩阵B,也不会

B = numpy.dot(A, [a,b,c,d,e,f])

我还尝试使用 numpy 的数组函数构建 Python 矩阵和数组,结果相同。 感觉就像我在这里混合了一些基本的东西。非常感谢任何帮助。

【问题讨论】:

  • 在 Matlab 中 [a;b;c;d;e;f] 是列向量,你确定你的 numpy 向量是列向量而不是行向量吗?
  • 你有 numpy 矩阵还是数组? wiki.scipy.org/…
  • 另外,如果你解释你所期望的和你得到的之间的区别,而不是让人们猜测,你会得到更好的回应!
  • 在 Matlab 中,如果 A 是 6 x 6,A*[a;b;c;d;e;f] 应该是 6 x 1(即列向量)。你确定你有一个 1 x 6 矩阵吗?
  • 请在您的问题中包含我们可以运行的代码(即包含定义Aab 等的代码),并显示您在 Matlab 中获得的输出和蟒蛇。

标签: arrays matlab numpy matrix dot-product


【解决方案1】:

您要相乘的向量是一列,因此将其用作一列以获得最终的 6x1 向量而不是 1x6 向量,因为您在 MATLAB 中进行 6x6 x 6x1 的点积。

这个例子是针对 3x3 维度的(只是为了减少代码并易于理解):

import numpy as np
A = np.array([[8,1,6],[3,5,7],[4,9,2]])  # This is the matrix
b = np.array([1,2,3])                    # These are the float numbers
c = np.dot(A,b.reshape(-1,1))            # This is a 3x1 vector

这在 MATLAB 上等价于:

magic(3)*[1;2;3]

【讨论】:

    【解决方案2】:

    如果不知道Aa,b,c,d,e,f 中的值,很难完全回答。但是,您的代码似乎可以工作:

    MATLAB:

    A = [1,2,3,4,5,6;
         1,2,3,4,5,6;
         1,2,3,4,5,6;
         1,2,3,4,5,6;
         1,2,3,4,5,6;
         1,2,3,4,5,6];
    
    b = [7;8;9;10;11;12];
    
    A*b
    
    ans = 
    
      217
      217
      217
      217
      217
      217
    
    A'*b
    
    ans = 
    
       57
      114
      171
      228
      285
      342
    

    Python:

    import numpy as np
    
    A = np.array([[1,2,3,4,5,6],
                  [1,2,3,4,5,6],
                  [1,2,3,4,5,6],
                  [1,2,3,4,5,6],
                  [1,2,3,4,5,6],
                  [1,2,3,4,5,6]])
    
    b = np.array([7,8,9,10,11,12]).reshape(6, 1)
    
    B = np.dot(A, b)
    
    B
    array([[217],
           [217],
           [217],
           [217],
           [217],
           [217]])
    
    B = np.dot(A.transpose(), b)
    
    B
    array([[57],
           [114],
           [171],
           [228],
           [285],
           [342]])
    

    numpy dot 运算符确实执行矩阵乘法,因此您的 A 初始化可能出现问题,而您没有显示。

    请注意,reshape 操作不是必需的(无论如何都会看到相同的结果)。但是,这会生成一个列向量而不是一维数组,因此可以以与 MATLAB 数组[7;8;9;10;11;12] 相同的方式进行转置等。

    【讨论】:

    • @WarrenWeckesser 确实,我已将其更改为重塑。这不是必需的,但它表明这是一个与发布的等效 MATLAB 代码匹配的列向量(并遵循矩阵乘法规则)。我还将添加一个注释来解释这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 2012-05-27
    相关资源
    最近更新 更多