Matlab根据计算形式产生不同的矩阵乘积结果

问题描述 投票:0回答:1

在 Matlab 中,我通过两种方式计算 2D 点集合的旋转:一种通过常规矩阵-矩阵乘积,另一种通过迭代向量-矩阵乘积,如下所示。

>> points = % read data from some file, Nx2 matrix
>> R = [cosd(-18), sind(-18); -sind(-18), cosd(-18)];  % My rotation matrix
>> prod1 = points * R;
>> numpt = size(points, 1);
>> for k=1:numpt, prod2(k,:) = points(k,:) * R; end;

我使用的是装有 Windows 10 操作系统的“常规”(基于英特尔)PC。

事实证明,在某些计算机上,

prod1 ~= prod2
,而在其他计算机上,
prod1 == prod2
。这可以通过

检查
>> max(max(abs(prod2 - prod1)))

ans =

   1.1102e-16

这种差异在“较弱”的计算机上等于

0
,在我的“强大”计算机上等于非零。

我想这种情况发生在某些计算机上而不是其他计算机上的原因是它发生的地方,矩阵乘法有一些硬件加速(可能涉及

madd
三元运算,因这种差异而臭名昭着)。

这是一些已知问题,例如“错误”吗? 是否有解决方法,例如禁用或暂停这种 H/W 加速?

作为单元测试的一部分,我正在寻求在不同计算机上获得相同的计算结果。我可以满足于“近乎平等”。但如果我能得到真正的平等,我就不应该这样做。

matlab vectorization precision numeric hardware-acceleration
1个回答
0
投票

需要验证每个步骤中的每个变量才能回答所有问题。通常,对于跨平台定义明确的数学函数,结果应该是相同的。同时,您可以利用符号工具箱提高数值计算的精度

© www.soinside.com 2019 - 2024. All rights reserved.