手工完成的 * 矩阵乘法和按分量按分量完成的矩阵乘法之间的差异问题 (MATLAB)

Problem of difference in between matrix multiplication done by * and by components by components by hand (MATLAB)

提问人:pawel 提问时间:7/8/2021 最后编辑:pawel 更新时间:7/8/2021 访问量:84

问:

我对Matlab上矩阵乘法的准确性有疑问。我将用一个例子来解释这一点。 让

 A=[0.1256, 0.25789; 0.00018, 0.68741];
B=[0.1578, 0.24471; 0.12801, 0.99701];
s=0;
while s<100
    for i=1:2
        for j=1:2
    A(i,j)=A(i,j)+0.0125;
    B(i,j)=B(i,j)+0.2470;
        end
    end
    D=A*B;
    d11=A(1,1)*B(1,1)+A(1,2)*B(1,2);
    d12=A(1,1)*B(1,2)+A(1,2)*B(2,2);    
    d21=A(2,1)*B(1,1)+A(2,2)*B(1,2);
    d22=A(2,1)*B(2,1)+A(2,2)*B(2,2);
    DD=[d11, d12; d21, d22];
    s=s+1;
end

我有一个算法,在每次迭代时都会升级矩阵 A 和 B 分量的值。在此算法中,还有一个公式涉及将矩阵定义为升级后的 A 和 B 的乘积。

我的问题是,如果我在每次迭代中通过手动执行矩阵乘法的组件定义这些新矩阵组件,我将获得的结果与我通过执行矩阵乘法来定义这个新矩阵的情况略有不同“*”,而不是由我逐个组件。 最终结果是:

DD=[71,8082684418998,   73,0622074848998;
79,4048550050998,   80,8251256858998]
and
D=[71,6322976788998 73,0622074848998
79,1787592580998    80,9710216918998]

这可能吗?提前致谢

MATLAB 矩阵 乘法 浮动精度

评论

2赞 Hoki 7/8/2021
提供一个“示例”来解释你的问题是一个很好的努力,但要真正有用,你的示例还应该包括数值,这样人们就可以重现你试图修复或实现的行为。
0赞 pawel 7/8/2021
@rinkert我打算$C=A*B$,我打算手动:$c 11=a*e+b*g;$ $c 12=a*f+b*h$, $c 21=c*e+d*g$, $c 22=c*f+d*h$ 然后 $C=[c11, c12; c21, c22]$。
1赞 rinkert 7/8/2021
然后只需创建矩阵和 ,然后执行 .就像 Hoki 说的,添加一个代码最少的示例来重现您的问题,以说明为什么这对您不起作用。ABC=A*B
0赞 pawel 7/8/2021
我已经添加了我的代码和结果,现在我希望你能帮助我!

答:

1赞 rinkert 7/8/2021 #1

这与数值精度无关,但您的手动矩阵乘法是错误的。这将是正确的版本:

d11=A(1,1)*B(1,1)+A(1,2)*B(2,1);
d12=A(1,1)*B(1,2)+A(1,2)*B(2,2);    
d21=A(2,1)*B(1,1)+A(2,2)*B(2,1);
d22=A(2,1)*B(1,2)+A(2,2)*B(2,2);

但是你看,在这个手动矩阵乘法中很容易犯错误,所以最好只做.A*B

评论

0赞 pawel 7/8/2021
感谢您的帮助!但是,例如在迭代 7 中,我也有: D=[1.043469763900000, 1.362134194900000; 1.604450243099999 , 2.285467301899999] DD= [1.043469763900000 , 1.362134194900000; 1.604450243099999 , 2.285467301899998]
0赞 pawel 7/8/2021
看看 d22 和 dd22,它们并不完全相等......这就是我想在我的问题中说的!
1赞 rinkert 7/8/2021
啊哈,现在你看的是浮点精度,区别是 1e-16 的数量级,这是双精度的极限。请参阅浮点数据的准确性。这是意料之中的,并且很可能不是您的应用程序的问题。
0赞 pawel 7/8/2021
无论如何,这两个程序中的哪一个更可取?
1赞 rinkert 7/8/2021
选择Matlab矩阵乘法,正如你所看到的,在手动实现它时很容易犯错误。由于MATLAB使用BLAS进行线性代数,因此比手动实现的矩阵乘法更有效。A*B