在 MATLAB 和 NUMPY 中进行矩阵乘法会得到不同的结果

3

这是矩阵

>> x = [2 7 5 9 2; 8 3 1 6 10; 4 7 3 10 1; 6 7 10 1 8;2 8 2 5 9]

Matlab给我

>> mtimes(x',x)
ans =

   124   124    94   122   154
   124   220   145   198   179
    94   145   139   101   121
   122   198   101   243   141
   154   179   121   141   250

然而,使用Python中的NumPy在相同数据上执行同一操作会产生不同的结果。我无法理解为什么?
import numpy as np
a = [[2, 7, 5, 9, 2],[8,3,1,6,10],[4,7,3,10,1],[6,7,10,1,8],[2,8,2,5,9]]
x = np.array(a)
print 'A : ',type(x),'\n',x,'\n\n'
# print np.transpose(A)
X = np.multiply(np.transpose(x),x)
print "A'*A",type(X),'\n',X

产生

A :  <type 'numpy.ndarray'> 
[[ 2  7  5  9  2]
 [ 8  3  1  6 10]
 [ 4  7  3 10  1]
 [ 6  7 10  1  8]
 [ 2  8  2  5  9]] 


A'*A <type 'numpy.ndarray'> 
[[  4  56  20  54   4]
 [ 56   9   7  42  80]
 [ 20   7   9 100   2]
 [ 54  42 100   1  40]
 [  4  80   2  40  81]]

Snapshot


4
你必须在NumPy中进行逐元素乘法。在Matlab中,x.'.*x与你现在那个结果相同。再次检查矩阵乘法的语法。 - mikkola
@mikkola 的确,文档 证实了这一点。你可能希望把它作为一个答案。(在numpy中进行矩阵乘法是使用 dot - David Z
1
不是重复的问题,我认为;这个问题是关于“multiply”方法的,不同于其他问题。 - David Z
@excaza 正确。np.multiply与MATLAB中的元素乘法(.*)执行相同的操作。实际上,如果您查看官方NumPy源代码,*将计算为np.multiply。要执行矩阵乘法,需要使用np.dot或等效的MATLAB中的* - rayryeng
1
@excaza 我投票为“非重复”(我确实看到了另一个问题,但那个问题不是很清楚) - vyi
显示剩余2条评论
1个回答

5
Numpy的文档说明应用的运算符执行逐元素乘法。
然而,在MATLAB中,mtimes表示矩阵乘法。
为了验证,MATLAB中逐元素乘法的语法产生与numpy相同的结果:
disp(x.'.*x)

     4    56    20    54     4
    56     9     7    42    80
    20     7     9   100     2
    54    42   100     1    40
     4    80     2    40    81

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接