Рассмотрим отсортированный вектор 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
.