【问题标题】:Matrix multiplication problems - Numpy vs Matlab?矩阵乘法问题 - Numpy vs Matlab?
【发布时间】:2015-06-01 15:15:15
【问题描述】:

我正在尝试将我拥有的一些 Matlab 代码翻译成 Python(使用 numpy)。我有以下 Matlab 代码:

(1/x)*eye(2)

X 只是 1000000。据我了解,Matlab 中的 * 表示矩阵乘法,等价于 numpy 中的 .dot。所以在 Python 中,我有:

numpy.array([(1/x)]).dot(numpy.identity(2))

当我尝试运行 numpy 代码时,出现错误“形状 (1,) 和 (2,2) 未对齐:1 (dim 0) != 2 (dim 0)”。

显然我不明白什么。有人知道正确的 numpy 代码是什么吗?

【问题讨论】:

  • 糟糕,x 只是 1000000。
  • 如果x 是标量,为什么要使用矩阵乘法?
  • 在这种情况下它是标量,但我只是将其用作代码示例,我认为它在 Python 中应该给出与在 Matlab 中相同的答案。 Numpy 的 * 等价物是什么?是.dot,不是吗?
  • 我很肯定它可以在 Matlab 中工作 - 我刚刚跑了 1000000*eye(2)。看起来它给了我逐元素乘法。所以我猜如果你使用标量,Matlab 假设 * 是元素乘法。
  • @user1566200 - 是的,你是对的。我才意识到你在做什么。我还添加了一个答案。

标签: python arrays matlab numpy matrix


【解决方案1】:

由于x 是一个标量,如果您在 MATLAB 中将一个矩阵乘以一个标量,它只会按该值缩放所有条目。不需要矩阵乘法。

如果您想在numpy 中实现相同的功能,您可以执行与 MATLAB 中相同的操作:

(1/x)*numpy.identity(2)

如果x 是兼容维度的矩阵,那么是的,您使用numpy.dot

(1/x).dot(numpy.identity(2))

因此,在决定进行操作之前,您需要确保知道x 是什么。

numpy 使用* 运算符执行逐元素乘法,因此如果您想要实际的矩阵乘法,可以使用numpy.dot。您得到的维度不兼容,因为标量和矩阵之间的真正矩阵乘法是不可能的。

【讨论】:

    【解决方案2】:

    基本上在 numpy 操作中 * 和 dot 是不同的。

    (*) 执行元素操作——每个矩阵元素与其他矩阵对应元素

    a.dot(c) – 执行实际的数学矩阵乘法,这是我们在高中时学习的。

    a = np.arange(9).reshape(3,3)
    
    b = np.arange(10,19).reshape(3,3)
    
    In [47]: a*b
    
    Out[47]:
    array([[ 0, 11, 24],
    [ 39, 56, 75],
    [ 96, 119, 144]])
    
    In [48]: a.dot(b)
    
    Out[48]:
    array([[ 45, 48, 51],
    [162, 174, 186],
    [279, 300, 321]])
    

    【讨论】:

      猜你喜欢
      • 2015-10-12
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多