【发布时间】:2016-09-28 19:11:49
【问题描述】:
考虑一个在min 和max 之间有界的排序向量x。下面是x 的示例,其中min 可以是0,max 可以是12:
x = c(0.012, 1, exp(1), exp(1)+1e-55, exp(1)+1e-10,
exp(1)+1e-3, 3.3, 3.33333, 3.333333333333333, 3+1/3, 5, 5, 10, 12)
5 和 5 以及 exp(1) 和 exp(1)+10^(-55) 具有完全相同的值(达到浮点数的精度级别)。其他一些条目差异很大,而另一些条目差异很小。我想考虑一个近似相等测试
ApproxEqual = function(a,b) abs(a-b) < epsilon
,例如 epsilon 可以是 1e-5。
目标
我想“尽可能少”地修改变量x 的值,以确保x 中没有两个值“近似相等”并且x 仍然在min 和@ 之间987654341@.
我很高兴让您决定“尽可能少”的真正含义。例如,可以最小化原始x 与预期变量输出之间的平方偏差总和。
示例 1
x_input = c(5, 5.1, 5.1, 5.1, 5.2)
min=1
max=100
x_output = c(5, 5.1-epsilon, 5.1, 5.1+epsilon, 5.2)
示例 2
x_input = c(2,2,2,3,3)
min=2
max=3
x_output = c(2, 2+epsilon, 2+2*epsilon, 2+3*epsilon, 3-epsilon,3)
当然,在上述情况下,如果(3-epsilon) - (2+3*epsilon) < epsilon 是TRUE,那么函数应该抛出错误,因为问题没有解决方案。
旁注
如果解决方案非常高效,我会很高兴。例如,答案可以使用Rcpp。
【问题讨论】:
-
不是你想要的,但直截了当
sort(jitter(x_input, amount=1e-5)) -
@user20650 我无法从手册页中看出,但抖动能保证没有冲突吗?
-
查看
jitter代码的最后一行 - 它是从统一分布中随机抽取的。 – 可能但不太可能 -
我会这样做 ^^^ 但也许
ifelse(duplicated(x_input), jitter(x_input, amount = 1e-5), x_input)会代替。你可以在你的容忍范围内工作而不是duplicated -
感谢@rawr 的评论。随机添加小值和排序并不能确保值会严格增加(而不是达到我想要做的近似水平)。我试图在一个大的 while 循环中实现它,只要输出符合预期,它就会中断,但它有时会运行(似乎?),因为我有相对较大的向量,可能包含 5 或 10 个非常接近的值。请注意,我编辑了帖子以指定
x的范围以概括该功能。感谢您的帮助!
标签: c++ c r optimization rcpp