【问题标题】:set new boundary in Matlab在 Matlab 中设置新边界
【发布时间】:2013-07-15 02:52:00
【问题描述】:

我有一个数组:

[0.0182, 0.5238, -0.0205, 1.1683, 0.9684, 0.9722, 0.5677, 0.9043, 0.0025, ...
 0.9986, 0.4088, 0.5483, -0.0082, 0.5659]

我想为上述数组设置[0 0.5 1] 范围内的新数字。例如,0.52381 更接近0.5,因此应将其设置为0.5 而不是10.00250.5更接近0,所以应该设置为0,以此类推。因此,新数组应该是:

[0, 0.5, 0, 1, 1, 1, 0.5, 1, 0, 1, 0.5, 0.5, 0, 0.5]

在 MATLAB 中如何实现?有什么功能吗?

【问题讨论】:

  • 这有点令人困惑。 0.5238不是更接近0.5而不是1,所以应该设置为0.5
  • 是的。它应该设置为 0.5。

标签: arrays matlab boundary


【解决方案1】:

这样的事情比假设它像 0.5 那样简单要好一点。如果您知道要四舍五入最接近的值。

valueToRoundTo = [0,0.5,1];
x = [0.0182, 0.5238, -0.0205, 1.1683, 0.9684, 0.9722, 0.5677, 0.9043, 0.0025, 0.9986, 0.4088, 0.5483, -0.0082, 0.5659];

for i = 1:numel(x)
    [~,idx] = min(abs(valueToRoundTo-x(i)));
    x(i) = valueToRoundTo(idx);
end

您也可以在没有for loop 的情况下以非常优化的方式执行此操作

valueToRoundTo = [-0.5,0,0.5,1];
x = [0.0182, 0.5238, -0.0205, 1.1683, 0.9684, 0.9722, 0.5677, 0.9043, 0.0025, 0.9986, 0.4088, 0.5483, -0.0082, 0.5659];
[~,idx] = min(abs(bsxfun(@minus,x,valueToRoundTo.')));
rounded = valueToRoundTo(idx);

【讨论】:

  • 当我将 'valueToRound' 设置为 [0, 0.25, 0.5, 0.75, 1] 时,此函数的工作原理与 [0,0.5,1] 时相同。是否可以对任何整数值使用此功能?
  • 是的,只是你的值没有一个比 0 或 0.5 更接近 0.25,把 0.26 扔进去,你会看到它被正确地四舍五入
  • 基本上我只是选择绝对差异最小的值。非常优化和灵活。我建议使用使用bsxfun 的第二种解决方案。如果您想了解更多关于它是如何工作的,请阅读文档,只需知道它消除了对 for 循环的需要。这将在处理大量数据时显着提高性能。
【解决方案2】:

我认为您想使用带有比例因子的round 函数:

x = [0.0182, 0.5238, -0.0205, 1.1683, 0.9684, 0.9722, 0.5677, 0.9043, 0.0025, 0.9986, 0.4088, 0.5483, -0.0082, 0.5659]

roundingScaling = 0.5;
round(x/roundingScaling )*roundingScaling 

【讨论】:

  • 相当好和高效,但我不确定这对于一般边界集是否在数值上是稳定的 - 特别是那些没有精确浮点表示的边界集。
  • 如果我的新边界是 [0 0.25 0.5 0.75 1]。它的解决方案有效吗?我的意思是,roundingScaling 设置为 0.25。因为数字之间的距离为 0.25。
  • @BlueBit。是的,它会随着roundingScaling 的变化而工作。
  • 在下面查看我的解决方案,简单得多,并且不依赖于用户更改缩放因子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
  • 2013-04-30
  • 1970-01-01
相关资源
最近更新 更多