我有问题。我有两个大小为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作为第一行的第二个值。那么我的误解在哪里或者三种方法之间存在差异。最后一个可能有一些舍入错误,但另外两个应该给我相同的结果?
答案 0 :(得分:1)
两个矩阵X
和Y
是相同的矩阵,其列形成似乎是标准正交的基础。因此,您应该期望transpose(X)*Y
是一个单位矩阵。由于舍入误差,所有非对角线元素应为零,且仅与零不同。
也就是说,你观察到的差异只是暗示矩阵乘法的各种实现在某些方面彼此不同。例如,采用总和的顺序可能会影响最终结果。
示例(MATLAB):
>> sum(X(:,1).*Y(:,2))
ans =
3.366499626335511e-15
>> sum(flipud(X(:,1)).*flipud(Y(:,2)))
ans =
3.366880519846534e-15
在这个例子中,我们手动取两个大正交向量的内积。通过翻转向量,结果不会改变,但是,由于舍入误差,我们得到的结果略有不同。