matlab - 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。为什么在使用全比例矩阵乘法时,第四行会出现一个值?
如果有人知道为什么这不返回零,我将不胜感激!
解决方案
你正在计算一个表达式
((-a+(-b))+b)+a, a,b > 0
浮点运算是不可交换的,第一次加法的截断错误不会被第二次加法撤消,所以第三次加法不会落在零,但会反映第一次加法的截断误差-a
。因此,作为机器常数,您会得到一个大小为 的残差,大约为 也就不足为奇了。正如你的关于,这与你得到的实际结果一致。-b
b
a
(a+b)*mu
mu
2e-16
a+b
1e+7
另请参阅浮点数学是否损坏?
推荐阅读
- python - AttributeError: 'int' 对象没有属性 'send'
- docker - Traefik https 在额外的自定义端口 (8080)
- selenium - 如何用硒按下按钮?
- prepared-statement - 查看准备好的 TMyQuery SQL 字符串
- java - 保存在路由器页面上所做的更改会在 Chrome 中引发连接错误消息
- scheduled-tasks - Blueprism 中的调度无法启动
- artifactory - 尝试删除工件时出现 PSQL 错误
- python - 比较两个字符串并在 Python 中有效地将差异返回为 0 和 1
- python - solve_ivp 积分的界限
- reactjs - 如何根据功能是否打开来调节具有相同 URL 的路由以调用不同的组件?