2011-11-14 7 views
1

離散レベルを持つintを作成するより洗練された方法を見つけようとしています。私の例では6つのレベルしか示されていませんが、私は45のレベルでこれをやりたがっているので、もしelsesなら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; 
} 

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

最新のアップデートFYIこれらは私が量子化するために必要な値だった:あなたは、私はもう少し何かを必要と見ることができるように エレガントで使い勝手のよい地図の答え

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 
     }; 
+1

各条件は常に前の1/2ですか? – JohnPS

+0

これは単なる例だったので、私はそれを編集して他人には見えないようにしました。 – JPM

答えて

5

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データ型とそれを実装することができます。

+1

あなたはこれを書いた方が速かったです...レベルを取得するためには単純に 'floorEntry(sd).getValue()'を使用してください – Kru

+0

NavigableMapはどこですか?そのjava.utilにはありません。 – JPM

+0

@JPM:かなり古いバージョンのJavaを使用しているに違いありません。 5年前に出てきた1.6年以来のことだ。 –

0

私はベース2の対数的に基づく関数のように見えます。

EDIT:OKですので、実際の関数は対数的には正確ではありません。あなたが試すことができるいくつかのことがあります。私は最初に試してみたいのは、ある種の回帰(対数?)で値を取得しようとすることだと思います。それがうまくいかない場合は、常に他の人が提案するテーブルメソッドがあります。私が試したがっているもう一つの数値ソルバー法は、まだEureqaです。

+0

ちょうど例ですが、私が45の異なるレベルにすると論理的ではありません。 – JPM

1

すべてのレベル境界で配列double[] boundary = { 0.4, 0.2, 0.1...};を作成します。次に、値が境界よりも大きくなるまでこの配列をループします。あなたのループのインデックスはあなたの離散レベルです。

(自分のレベルが実際に対数であれば他の人が指摘しているとして、あなたは、必ずしもカスタム配列を必要としない、注意してください...)

+0

うーん、もっと良い...まだ少し力説しているようだ。 – JPM

3

私はコレクションであなたのしきい値を保存し、その後の場所を見つけるだろうあなたの入力に対して最も高いしきい値。

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です。バイナリ検索を使ってlog nを注文することでこれをスピードアップすることができます。

+0

バイナリ検索はJavaに組み込まれているので、コードを高速にするだけでなく、かなり短くすることもできます: 'int pos = Arrays.binarySearch(thresholds、d); return pos <0? - (pos + 1):pos; '(免責事項:これが天井か床かどうかは考えていません) –

+0

@マークそれは私がそこにhahahaを入れなかった理由です。 – corsiKa

関連する問題