[运算] 求助 简单的矩阵乘法结果怪怪的

楼主: amy2005 (FamilyAlwaysFirst)   2017-07-20 01:27:39
各位高手晚安~
小妹我刚刚在做一个矩阵乘法时,发现乘出的结果好难理解...
过程是这样的:
H = 1e-14 * ones(4) (一个4*4, 每个元素皆为1e-14的方阵)
R = 1e-100 * eye(4) (一个对角矩阵,对角元素皆为1e-100)
t = H * H * transpose(H) + R
t = inv(t)
最后t的结果长这样:(一个4*4矩阵, 以下结果为求干净只显示到小数点后第3位)
row1: 5.629e+56 , -6.938e+24 , -6.25e+40 , -5.629e+56
row2: -6.938e+24 , 5.070e+72 , -5.629e+56 , -5.070e+72
row3: -6.25e+40 , -5.629e+56 , 4.567e+88 , -4.567e+88
row4: -5.629e+56 , -5.070e+72 , -4.567e+88 , 4.567e+88
之后我计算 H*t,
结果居然是个元素全都是0的4*4矩阵...
全都是0耶...好奇怪...看起来就不对阿
然后我尝试只算第一项,
也就是 H(1,1)*t(1,1) + H(1,2)*t(2,1) + H(1,3)*t(3,1) + H(1,4)*t(4,1)
正解应该是 (5.629e+56 -6.938e+24 -6.25e+40 -5.629e+56) * 1e-14 ,约为-6.25e+26
但matlab跑出结果 = 0
然后我还是不死心,改变加法顺序,
变成 H(1,1)*t(1,1) + H(1,4)*t(4,1) + H(1,2)*t(2,1) + H(1,3)*t(3,1)
跑出结果 = 6.1294e+26
疴.......交换加法顺序结果居然不一样! 而且都是错的!
后来再用java算 , 结果也是错的....
请问各位matlab高手有碰过类似的状况吗~~
p.s. 这些算术都没有overflow或underflow喔~
谢谢大家!
作者: sunev (Veritas)   2017-07-20 03:24:00
基本上取inverse 时就爆了
楼主: amy2005 (FamilyAlwaysFirst)   2017-07-20 09:37:00
原来如此! 那请问为什么之后改变加法顺序答案居然不一样呢?我后来用java测试加法的部分居然和matlab结果一样...感谢楼上高手回答!!!
作者: BrianCashman (最强⑨番-さるの)   2017-07-20 12:23:00
怎么可能会没有overflow? 容器仅能够装10^308指数
作者: sunev (Veritas)   2017-07-20 13:22:00
应该在t=H^3+R 就出问题了,有效数字没这么多
楼主: amy2005 (FamilyAlwaysFirst)   2017-07-20 16:19:00
http://i.imgur.com/x7rXhs6.jpghttp://i.imgur.com/a0kOdXI.jpg不好意思~我觉得不会overflow or underflow耶...请参考图片, 因最小值为 16*e-42 , 最大值为 16*e-42 +1e-100
作者: BrianCashman (最强⑨番-さるの)   2017-07-20 16:38:00
绝对overflow,4x4算det(R)时 1e-100就已经1e-400了
楼主: amy2005 (FamilyAlwaysFirst)   2017-07-20 16:40:00
嗯嗯!所以是在算inv的时候~
作者: BrianCashman (最强⑨番-さるの)   2017-07-20 16:41:00
1e-100对角矩阵不见 你的矩阵行列式就直接变成0
楼主: amy2005 (FamilyAlwaysFirst)   2017-07-20 17:29:00
喔喔!但算行列式时,应该只有算到 (1e-100)^4 和 (1e-100)^3 时才会overflow吧?其他项不会~然后overflow(归0) +某数 = 某数 ? 所以行列式值不会为0? 谢谢!

Links booklink

Contact Us: admin [ a t ] ucptt.com