提问人:pawel 提问时间:7/8/2021 最后编辑:pawel 更新时间:7/8/2021 访问量:84
手工完成的 * 矩阵乘法和按分量按分量完成的矩阵乘法之间的差异问题 (MATLAB)
Problem of difference in between matrix multiplication done by * and by components by components by hand (MATLAB)
问:
我对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]
这可能吗?提前致谢
答:
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
评论
A
B
C=A*B