Метод квантованного уровня - PullRequest
1 голос
/ 15 ноября 2011

Попытка найти более элегантный способ создания int с дискретными уровнями.Мой пример показывает только 6 разных уровней, но я хочу сделать это для 45 разных уровней, поэтому не хочу 45, если еще.Не уверен, как это называется в математике, и поэтому не могу найти то, что я ищу.

sd = some double value

int level = 0;

if (Double.compare(sd, 0.41) >= 0) {
    level = 5;
} else if(Double.compare(sd, 0.25) >= 0) {
    level = 4;
} else if(Double.compare(sd, 0.11) >= 0) {
    level = 3;
} else if(Double.compare(sd, 0.05) >= 0) {
    level = 2;
} else if(Double.compare(sd, 0.02) >= 0) {
    level = 1;
}

................

Последнее обновление К вашему сведению, это были значения, которые мне нужно было квантовать: Как вы видите, мне нужно что-тонемного более элегантный, б / у Navigable Map ответ

public static final int[] Levels = { 
        3100, 3250, 3383, 3517, 3650, 
        3673, 3695, 3718, 3740, 3760, 
        3780, 3800, 3820, 3853, 3885,
        3918, 3950, 3975, 4000, 4025, 4050
        };

Ответы [ 4 ]

5 голосов
/ 15 ноября 2011

http://download.oracle.com/javase/6/docs/api/java/util/NavigableMap.html

NavigableMap<Integer, Integer> map = new TreeMap<Integer, Integer>();
map.put(0, 0);    // 0..4     => 0
map.put(5, 1);    // 5..10    => 1
map.put(10, 2);   // 10..100  => 2
......

Вы также можете реализовать его с типом данных Double.

3 голосов
/ 15 ноября 2011

Я бы сохранил ваши пороги в коллекции, а затем нашел бы местоположение самого высокого порога по отношению к вашему входу.

Пример

double[] thresholds = { 0.0, 0.025, 0.05, 0.1, 0.2 };

int level(double d) {
    for(int i = 0; i < thresholds.length; i++) {
        if(thresholds[i] > d) return i;
    }
    return thresholds.length + 1;
}

Теперь это порядок n.Вы можете ускорить это с помощью бинарного поиска, чтобы упорядочить журнал регистрации.

1 голос
/ 15 ноября 2011

Создайте массив double[] boundary = { 0.4, 0.2, 0.1...}; со всеми границами вашего уровня. Затем переберите этот массив, пока ваше значение не станет больше границы. Индекс вашего цикла - это ваш дискретный уровень.

(Обратите внимание, если ваши уровни на самом деле логарифмические, как отметили другие, вам не обязательно нужен пользовательский массив ...)

0 голосов
/ 15 ноября 2011

Для меня это логарифмическая функция с основанием 2.

РЕДАКТИРОВАТЬ: ОК, так что ваша реальная функция не совсем логарифмически. Есть несколько вещей, которые вы можете попробовать. Я думаю, первое, что я попробую, это какая-то регрессия (логарифмическая?), Чтобы попытаться получить значения. Если это не работает, всегда есть метод таблицы, предложенный другими. Другой метод численного решения, который я хотел попробовать (но еще не попробовал): Eureqa .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...