圆,平,平

我们正在考虑一个MATLAB增强请求来支持选项万博1manbetx轮(x)x正好在两个整数之间。

内容

经典的圆

经典的MATLAB计算器是40年前用Fortran编写的,在IEEE 754和MathWorks之前。它只有71个功能,而且不容易添加更多。但其中一个函数是ROUND。帮助条目只有一句话。

ROUND ROUND(X)将X中的元素舍入到最接近的整数。

这可没说平局时会发生什么。ROUND的代码基本上就是这一行,它依赖于FLOOR。

圆(x) =符号(x)*地板(abs (x) + 0.5)

特别是:

圆(0.5)= 1.0
圆(1.5)= 2.0。

当MathWorks在1984年开始制作MATLAB的现代版本时,我们保留了这个简单的定义

舍入

这个函数可用于修整后的清理。

格式eH = hilb(5) X = inv(H) X = round(X) XH = X*H XH = round(XH)
H =列1到3 1.000000000000000 e + 00 5.000000000000000 3.333333333333333 2.500000000000000 3.333333333333333 5.000000000000000 3.333333333333333 e-01 e-01 e-01 e-01 e-01 e-01 2.500000000000000 e-01 2.000000000000000 e-01 2.500000000000000 1.428571428571428 1.666666666666667 2.000000000000000 1.666666666666667 2.000000000000000 e-01 e-01 e-01 e-01 e-01 e-01列4到5 2.500000000000000 1.666666666666667 1.666666666666667 2.000000000000000 2.000000000000000 e-01 e-01 e-01 e-01 e-011.111111111111111 1.250000000000000 1.250000000000000 1.428571428571428 1.428571428571428 e-01 e-01 e-01 e-01 e-01 X = 1到3列2.499999999998526 e + 01 -2.999999999997500 e + 02年1.049999999998995 4.799999999995864 -2.999999999997500 e + e + 03 02 e + 03 -1.889999999998367 e + 04 1.049999999998995 e + 03 -1.889999999998367 -1.399999999998561 7.937999999993641 e + e + 04 04 e + 03 2.687999999997693 e + 04 -1.175999999999111 e + 05年6.299999999993241 5.669999999995910 -1.259999999998929 e + e + 02年04 e + 04列4到5-1.399999999998561 e + 03 6.299999999993241 e + 02年2.687999999997693 -1.259999999998929 e + e + 04 04 -1.175999999999111 5.669999999995910 e + e + 05年04 1.791999999998769 -8.819999999994377 e + e + 05年04 -8.819999999994377 e + 04 4.409999999997448 e + 04 X = 25 -300 1050 -1400 630 -300 4800 -18900 26880 -12600 1050 -18900 79380 -117600 56700 -1400 26880 -117600 179200 -88200 630 -12600 56700 -88200 44100 XH = 1.000000000000000列1到3 e + 1.000000000000000 e + 00 00 0 0 0 0 0 0 1.000000000000000 e + 00 0 0-3.637978807091713e-12 000列4 ~ 5 00000000 1.000000000000000e+00 00 1.000000000000000e+00 XH = 1 000000 1 00000 1 000000 1 000000 1 0000000 1 0000000 1 0000000 1 00000000 1 00000000 1 00000000 1 000000000 1 1 0000000 1

燧石

适用于数组元素,将所有元素映射到燧石,值为整数的浮点数。小于1 / 2的所有值都映射为零。所有大于flintmax已经是燧石了,所以它们被映射到自己身上。以及1 / 2和之间的所有值flintmax,除了那些正处于两个燧石中间的,被映射到最近的燧石。几乎所有人都同意这一点。

惟一的余地,也是增强请求和这篇博客文章的主要原因,是的行为两个燧石之间的值。

我建议我们在内置功能中添加一个关键选项.如果你不用这个关系选项,将一如既往地发挥作用。如果你从未遇到平局,所有这些选项都会给出相同的结果。

最重要的选项是“偶数”。有统计学上的论据支持这种做法。如果从未遇到平局,则舍入数据所产生的预期更改的平均值为零。对于“偶数”选项,即使你遇到平局,情况也一样。

“up”选项是默认的,也是传统的MATLAB行为。“奇数”和“向下”选项一起提供了“偶数”和“向上”选项的镜像。

类型
函数r = round(x,ties) % r = round(x)将x的元素舍入到最接近的整数。整数中间的元素从0四舍五入。% % r = round(x,'even')四舍五入为整数,偶数为偶数。% r = round(x,'odd')四舍五入到整数,绑定到奇数。% r = round(x,'down')舍入整数,趋近于零。% r = round(x,'up')四舍五入到整数,远离零(默认)。% a = abs(x) + 0.5;R =地板(a);如果nargin == 2开关连接情况'偶数' m = (r == a) & (mod(r,2) == 1);Case 'odd' m = (r == a) & (mod(r,2) == 0); case 'down' m = (r == a); case 'up' m = []; end r(m) = r(m) - 1; end r = sign(x).*r; end

测试回合

X = (0.5: 1:45 5)';xRound (x)
X轮偶数向下奇数0.500 1 00 1 1.500 2 2 1 1 2.500 3 2 2 3 3.500 4 4 4 4 5

城市

下载电子表格www.census.gov的城市并使用导入向导选择最后一列。这就是2019年美国788个城市的人口。

负载cities.mat城市人口普查

将数据四舍五入到最接近的1000。

rcensus = 1000*Round(census/1000);

这是五个最大的城市,他们的人口,人口四舍五入。

disp(城市(1:5)disp([人口普查(1:5)rcensus (1:5)))
“纽约州纽约市”“加利福尼亚州洛杉矶市”“伊利诺伊州芝加哥市”“德克萨斯州休斯顿市”“亚利桑那州菲尼克斯市”8336817 8337000 3979576 3980000 2693976 2694000 2320268 2320000 1680992 1681000

这是最小的5个,

Disp (cities(end-4:end)) Disp ([census(end-4:end) rcensus(end-4:end)])
“俄亥俄州莱克伍德市”“纽约州特洛伊市”“密歇根州萨吉诺市”“纽约州尼亚加拉大瀑布市”“西弗吉尼亚州查尔斯顿市”49678 50000 49154 49000 48115 48000 4772 48000 46536 47000

这是舍入变化的直方图。尽管外表参差不齐,但它是统一的。

Delta = census - rcensus;直方图(三角洲,40)

大约一半的788人四舍五入,大约一半四舍五入。2019年只有一个城市的人口已经达到1000倍。

Disp ([nnz(delta < 0), nnz(delta == 0), nnz(delta > 0)])
396 1 391
K = find(delta == 0) disp(cities(K)) disp([census(K) rcensus(K)])
k = 69阿拉斯加州安克雷奇市288000 288000

有多少城市报告了人口联系,即人口介于1000倍之间?

K = find(mod(census,1000)==500) disp(cities(K)) disp([census(K) rcensus(K)])
k = 131 189 757“佛罗里达州塔拉哈西市”“加利福尼亚州罗斯维尔市”“华盛顿州布里恩市”194500 195000 141500 142000 51500 52000

在788个城市中,只有一个城市的人口四舍五入为1,000的奇数倍,这是触发了“偶数”选项。

人口普查= 1000*Round(人口普查/1000,“甚至”);K = find(census ~= rcensus) disp(城市(K)) disp([人口普查(K))普查(K)]
k = 131佛罗里达州塔拉哈西市194500 195000 194000

IEEE 754

IEEE 754舍入模式很容易与函数。IEEE 754是关于硬件的;是软件。浮点算术运算的精度比现在高16个数量级,速度比现在快许多个数量级。一些考虑因素是相似的,但背景和细节是非常不同的。

哪个?

MATLAB应该有这样的东西吗轮(x,“甚至”)?这真的是个品味问题。我正好喜欢我们一直以来的做事方式。对其他人来说,整数到偶数的统计特性可能是相关的。

但我认为支持增强请求的最重要的论点是提供与其他没有选择的数学软件的兼容性。




发布与MATLAB®R2020a

|

评论

如欲留言,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。