matlab与python在标量积上的差异

matlab与python在标量积上的差异,python,matlab,matrix,product,scalar,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.92337

我有个问题。我有两个大小为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。那么,我对这三种方法的误解或区别在哪里呢。最后一个可能有一些舍入误差,但另外两个应该给我相同的结果,还是不


两个矩阵
X
Y
是相同的矩阵,列构成了一个正交基。因此,您应该期望
转置(X)*Y
是一个单位矩阵。所有非对角元素均应为零,且仅因舍入误差而与零不同

也就是说,您观察到的差异仅仅意味着矩阵乘法的各种实现在某些方面彼此不同。例如,求和的顺序可能会影响最终结果

示例(MATLAB):

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

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

你说的“第二个值”是什么意思?我指的是第一行中的第二个值。但是经过乔达格的解释,现在已经很清楚了。