Matlab 上限至最接近50
我可以将Matlab 上限至最接近50,matlab,rounding,Matlab,Rounding,我可以将A的元素四舍五入为大于或等于A ceil(A) 但是如果我想把它四舍五入到大于或等于A的最接近的50呢 例如,给定以下A数组 A=[24, 35, 78, 101, 199]; 子例程应返回以下内容 B=Subroutine(A)=[50, 50, 100, 150, 200]; 您只需除以50,取ceil(),然后再乘以50: octave:1> A=[24, 35, 78, 101, 199]; octave:2> ceil(A) ans =
A
的元素四舍五入为大于或等于A
ceil(A)
但是如果我想把它四舍五入到大于或等于A
的最接近的50呢
例如,给定以下A
数组
A=[24, 35, 78, 101, 199];
子例程应返回以下内容
B=Subroutine(A)=[50, 50, 100, 150, 200];
您只需除以50,取ceil(),然后再乘以50:
octave:1> A=[24, 35, 78, 101, 199];
octave:2> ceil(A)
ans =
24 35 78 101 199
octave:3> 50*(ceil(A/50.))
ans =
50 50 100 150 200
一种简单的方法是将每个数的补模50相加:
octave> A = [24, 35, 78, 101, 199]
octave> mod(-A, 50) # Complement (mod 50)
ans =
26 15 22 49 1
octave> A + mod(-A, 50) # Sum to "next higher" zero (mod 50)
ans =
50 50 100 150 200
octave> A - mod(A, 50) # Can also sum to "next lower" zero (mod 50)
ans =
0 0 50 100 150
(请注意,这仅取决于整数运算,它可以避免由于浮点舍入而产生的错误。)请注意,对于.Meh中的大值,这可能会引入浮点舍入错误,因此请去掉除法中50后的小数点。要么数字已经是浮点值,在这种情况下,问题已经出现在代码中的其他地方,要么数字是整数,在这种情况下,只需去掉小数点,现在就可以进行整数除法和加法,在这种情况下,就没有浮点数问题了。所以我看不出这里有什么问题。问题是结果不正确。:-)例如,尝试将
77777
作为输入:此方法给出不正确的结果777792
,而模数方法正确给出77800
。是的,您的方法也是如此:“a=77777;a+mod(-a,50)”也给出7792。你可能想看看维基百科关于机器epsilon()的文章,注意你永远不会让数字运算在浮点数的第16位小数点产生正确的结果,即使是双精度的。当然,对于(比如)64位整数,这两种方法都给出了正确的结果,因为整数算术中的50*ceil(a/50)与a+mod(-a,50)完全相同。@Piet和Jonathan:我在MATLAB中测试了你的两个答案(问题所问的),我从每个答案中得到了完全相同的结果。但是,使用777
这样的数字测试输出没有多大意义,因为这是一个更大的整数。你需要一个64位整数来处理这个数字。我喜欢这个,因为它利用了模加/减法,也就是说,没有乘法/除法。但是,如果您有一个复杂的表达式来代替,您可能希望恢复到使用ceil函数的解决方案,因为在该方法中,该表达式只会被调用一次。所有这些都是为了代码简单化的目标。