gpt4 book ai didi

matlab - 为什么我在不同版本的 MATLAB(2016 与 2021)中得到不同的结果?

转载 作者:行者123 更新时间:2023-12-04 16:35:33 28 4
gpt4 key购买 nike

为什么在对 sum(b.*x1) 使用在不同版本的 MATLAB(2016 与 2021)中运行的相同代码时会得到不同的结果哪里b是单例和x1是双。如何避免 MATLAB 版本之间的此类错误?
MATLAB v.2021:

sum(b.*x1)

ans =

single

-0.0013286
MATLAB 2016
sum(b.*x1)

ans =

single

-0.0013283

最佳答案

在 R2017b 中,他们更改了 sum 的行为对于单精度浮点数,在 R2020b 中,他们也对其他数据类型进行了相同的更改。
这种变化加快了计算速度,并通过减少舍入误差来提高准确性。简单地说,以前的算法只是按顺序遍历数组,将值相加。新行为计算数组较小部分的总和,然后将这些结果相加。这更精确,因为运行总数可能会变成一个非常大的数字,向其中添加较小的数字会导致这些较小数字的四舍五入。速度的提高来自循环展开:循环现在跳过,比如说,当时 8 个值,并且在循环体中,计算了 8 个运行总数(它们没有指定它们使用的数字,这里的 8 是一个例子)。
因此,与旧的结果相比,新的结果更接近于数组的总和。
有关更多详细信息(对新算法和更改原因的更好解释),请参阅 this blog post .

关于如何避免差异:您可以实现自己的 sum函数,并使用它而不是内置函数。我建议将其编写为 MEX 文件以提高效率。但是,请确保您匹配内置 sum 的较新行为。 ,因为这是更好的近似值。

这是问题的一个例子。让我们用 N+1 创建一个数组元素,其中第一个元素的值为 N其余的值为 1。

N = 1e8;
a = ones(N+1,1,'single');
a(1) = N;
该数组的总和预计为 2*N .如果我们设置 N足够大 w.r.t.数据类型,我在 R2017a 中看到了这一点(更改之前):
>> sum(a)
ans =
single
150331648
我在 R2018b 中看到了这一点(在更改单精度 sum 之后):
>> sum(a)
ans =
single
199998976
两种实现在这里都会产生舍入错误,但一个显然更接近预期结果( 2e8200000000 )。

关于matlab - 为什么我在不同版本的 MATLAB(2016 与 2021)中得到不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70209828/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com