首页 > 解决方案 > Matlab 矩阵乘法返回它不应该返回的值

问题描述

我在 Matlab 中使用矩阵乘法时遇到问题。

我有一个叫做 8x4 的矩阵A和一个叫做 4x1 的向量B。查看矩阵A,第四行的值

A(4,:) = (-19.723654104483987, -73.609679228848705,  73.609679228848705,  19.723654104483987)

并且向量 B 具有值

B = (101325,      101325,      101325,      101325)'.

在我看来,这两者相乘时会相互抵消。但是,当我使用A*B=时ans,第四行的ans值如下所示。

ans(4) = 4.656612873077393e-10 

我觉得这很奇怪,因为我试图检查 A(4,:) 的元素是否真的应该取消,因为

(A(4,1) == -A(4,4)) = 1
(A(4,2) == -A(4,3)) = 1

(B(1) == B(2)) = 1
(B(1) == B(3)) = 1
(B(1) == B(4)) = 1

我在想它可能与Matlab的机器epsilon有关,但答案比e-16大。

我觉得奇怪的另一件事是,当我使用它时A(4,:)*B,它返回 0。为什么在使用全比例矩阵乘法时,第四行会出现一个值?

如果有人知道为什么这不返回零,我将不胜感激!

标签: matlabmatrixfloating-point

解决方案


你正在计算一个表达式

((-a+(-b))+b)+a,  a,b > 0

浮点运算是不可交换的,第一次加法的截断错误不会被第二次加法撤消,所以第三次加法不会落在零,但会反映第一次加法的截断误差-a。因此,作为机器常数,您会得到一个大小为 的残差,大约为 也就不足为奇了。正如你的关于,这与你得到的实际结果一致。-bba(a+b)*mumu2e-16a+b1e+7

另请参阅浮点数学是否损坏?


推荐阅读