我做了这个函数 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 个值,我在 rounds(( 中将其作为包含这 14 个值的整个向量传递。结果就像,对于它应该返回 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 个值,结果仍然不精确,而如果我单独传递这些相同的值,它会给出正确的输出。请某人解决此问题。提前谢谢。
function [newVal] = rounds2(x)
newVal = round(x/0.5)*0.5;
end
这是我挣扎了很长时间的事情,但现在我有一个完美的答案。发生这种情况是因为我将向量表达式 dist>= 0.25 传递给 if...结束,错误地认为如果...end将针对x(i(的每个元素单独计算。希望它也能帮助其他人