标量积与matlab和python的区别

时间:2018-03-07 23:20:26

标签: python matlab matrix product scalar

我有问题。我有两个大小为82248x20的数组,如果我在Matlab中执行以下操作

A=X'*Y

第二个值会给我6.152847328855238e-18。 如果我在Python中使用

之类的东西
test=scipy.io.loadmat('wohin.mat')
X=test['X']
Y=test['Y']
A=np.transpose(X)@Y
A=np.dot(np.transpose(X),Y)
A=np.matmul(np.transpose(X),Y)

我得到值为1.9233746539892849e-16为第二个值,如果我用

进行计算
for i in range(0,82248):
    t=t+np.transpose(Y)[0,i]*X[i,1]

我得到3.3664996263355106e-15作为第一行的第二个值。那么我的误解在哪里或者三种方法之间存在差异。最后一个可能有一些舍入错误,但另外两个应该给我相同的结果?

Mat file with the matrices is here

1 个答案:

答案 0 :(得分:1)

两个矩阵XY是相同的矩阵,其列形成似乎是标准正交的基础。因此,您应该期望transpose(X)*Y是一个单位矩阵。由于舍入误差,所有非对角线元素应为零,且仅与零不同。

也就是说,你观察到的差异只是暗示矩阵乘法的各种实现在某些方面彼此不同。例如,采用总和的顺序可能会影响最终结果。

示例(MATLAB):

>> sum(X(:,1).*Y(:,2))
ans =
   3.366499626335511e-15
>> sum(flipud(X(:,1)).*flipud(Y(:,2)))
ans =
   3.366880519846534e-15

在这个例子中,我们手动取两个大正交向量的内积。通过翻转向量,结果不会改变,但是,由于舍入误差,我们得到的结果略有不同。