到底如何用MATLAB计算一笔数组元素的总和()函数?它使用任何补偿求和算法,如卡亨吗?

13个视图(30天)
目前我从事软件项目翻译一些MATLAB代码的Java。在这个过程中,我意识到,这的输出 MATLAB的总和()函数 适用于一些“单”或“双重”数组不是相同的一个普通的连续循环中数组元素。我没有找到任何进一步的信息关于sum()的具体实现在任何最近的MATLAB版本(例如我R2019a),所以我试图复制其功能通过实现一些常见的求和算法等浮点加法 卡亨求和算法 或者它的一些变体。然而,结果没有与MATLAB的输出的总和()。
有人知道任何细节实现MATLAB的总和()函数?是任何形式的补偿包括求和?“单一”数组求和之前把“双”?求和分布在多个线程默认吗?数组排序来减少错误是由于小和大的浮点数?

更多的答案(3)

dpb
dpb 2021年11月8日
TMW算法不公开文档或文档描述中提供的超出部分,偶尔一个算法部分可能会增加一些额外的洞察力。
我没有戳来戳去调查,以下线程有一些信息 //www.tianjin-qmedu.com/matlabcentral/answers/550-compensated-summation-in-sum?s_tid=answers_rc1-1_p1_MLT answer_822 当然,如前所述,虽然不可能改变了,没有保证TMW没有改变任何启发式规则。
1评论
乔纳斯K。
乔纳斯K。 2021年11月9日
谢谢你,不幸的是,我已经意识到你提到的线程,但这将是伟大的任何信息目前的实现。特别是,因为TMW似乎已经改变了多线程功能之后, 布鲁诺陈德良指出 ,这也符合我所测试到目前为止。

登录置评。


Edric埃利斯
Edric埃利斯 2021年11月9日
outtype 参数 总和 控制用于求和的数值类型,描述 在医生 。默认的是 总和 值在执行 ,但其他类型的操作 翻倍。 (下面的例子做依靠的顺序操作,不保证)
单身=最大浮点数(“单一”)。* (1,1,1,1)
单身= 1×4
1.0 e+38 * 3.4028 3.4028 -3.4028 -3.4028
%浸透
总和(单身)
ans =
%的“双”,不饱和
总和(单打,“双”)
ans = 0
int8s = [intmax (“int8”),intmax (“int8”),intmin (“int8”)]
int8s = 1×3
127 127 -128
%违约总和“双重”——不饱和
总和(int8s)
ans = 126
%浸透
总和(int8s“本地”)
ans =int81
1评论
乔纳斯K。
乔纳斯K。 2021年11月9日
谢谢你,“单一”数组的信息总结每默认使用本机类型是有用的,尽管任何细节具体的方式/算法求和是如何执行的,会更有帮助。

登录置评。


布鲁诺陈德良
布鲁诺陈德良 2021年11月9日
编辑:布鲁诺陈德良 2021年11月9日
根据我的测试似乎MATLAB并不总和块向量上操作时,确保结果是一致的,即不取决于数量的线程。
> > =兰德(1,1 e7);
> > maxNumCompThreads = 1;
> >抽搐;s1 = (a)和toc
s1 =
4.9999 e + 06
运行时间是0.005212秒。
> > maxNumCompThreads = 4;
> >抽搐;s4 = (a)和toc
s4 =
4.9999 e + 06
运行时间是0.005153秒。
> > s1-s4
ans =
0
> >党卫军=总和(排序(a));
> > ss-s1
ans =
3.7253 e-09
国际海事组织意见和刚从左到右进行线性与一些内部国际比赛结果fiw的比特数> 64。
这个在某些版本(2015 ?)MATLAB实现了多线程的矢量和,引发了一些问题,一直在讨论旧的新闻组,然后切换回单线程。
使用多线程和2 d或ND-array,其中每个线程负责一组向量。
所有假设的algorirthm TMW没有文档。
7评论
布鲁诺陈德良
布鲁诺陈德良 2021年11月9日
我不认为罗兰的博客包括细节 总和 。和旁边的这篇文章的目的是提醒R2021b的行为改变,然而你使用R2019a。

登录置评。

类别

找到更多的在字符和字符串帮助中心文件交换

s manbetx 845


释放

R2019a

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!