0

我已经制作了这个函数 rounds() ,它将值四舍五入到最接近的 0.5 倍数,即 rounds(2.685)=2.5 rounds(2.332)=2.5 rounds(2.7554)=3.0 rounds(2.245)=2.0 它在上面提到的方式,但是在处理大量值时精度下降。它没有给我想要的结果。我有 30 个函数,每个函数计算 14 个值,我将这些值作为包含这 14 个值的整个向量传入 rounds()。结果就像,对于它应该返回 3.0 的值,例如 rounds(2.7554),它只返回 2.5,这会影响我的整体准确性。单独它适用于所有值,即使 2.7554 在我通过它检查它的工作时返回 3.0。谁能告诉我为什么会发生这种情况,在处理大量值时,它的性能会下降,并告诉我解决方案。

 function [newVal] = rounds(x) 
   dist = mod(x, 0.5); 
   floorVal = x - dist; 
   if  dist  >=0.25
     newVal = floorVal + 0.5;      
   else
     newVal = floorVal;
   end
 end 

上面是轮次函数,下面我展示了我是如何使用它的。

if true
  calc(1) = x+y;
  calc(2) = x-y;
  calc(3) = x*y+a;
  .......
  .......
  .......
  calc(14) = a+b*c+x;
  calc = calc';
  final_calc = rounds(calc);
end

即使在单个函数中,rounds 函数一次只处理 14 个值,结果仍然不精确,而如果我单独传递这些相同的值,它会给出正确的输出。请有人解决这个问题。提前致谢。

4

1 回答 1

0
function [newVal] = rounds2(x)
  newVal = round(x/0.5)*0.5;
end

这是我挣扎了很长时间的事情,但在这里我现在有了一个完美的答案。发生这种情况是因为我将向量表达式 dist >= 0.25 传递给 if...end,错误地认为 if...end 将为 x(i) 的每个元素单独计算。希望它也对其他人有所帮助

于 2018-08-13T17:56:02.453 回答