Рассмотрим отсортированный вектор x, который ограничен между min и max. Ниже приведен пример такого 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 и max.
Я рад позволить вам решить, что "как можно меньше" действительно означает. Например, можно свести к минимуму сумму квадратических отклонений между исходным 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.