入力として整数の行列を期待するアルゴリズムを使用する必要があります。私が持っている入力は実数値であるため、アルゴリズムに渡す前に入力を整数に変換したいと考えています。
入力を大きな定数でスケーリングしてから、整数に丸めます。これは良い解決策のように見えますが、使用する適切な定数をどのように決定すればよいでしょうか。特に、float 入力の範囲はケースごとに異なる可能性があるためです。他のアイデアも歓迎しますか?
入力として整数の行列を期待するアルゴリズムを使用する必要があります。私が持っている入力は実数値であるため、アルゴリズムに渡す前に入力を整数に変換したいと考えています。
入力を大きな定数でスケーリングしてから、整数に丸めます。これは良い解決策のように見えますが、使用する適切な定数をどのように決定すればよいでしょうか。特に、float 入力の範囲はケースごとに異なる可能性があるためです。他のアイデアも歓迎しますか?
おそらく、この質問に対する最も一般的な答えは、アルゴリズム自体でオーバーフローを引き起こすことなく、アルゴリズムが行列の要素として受け入れることができる最大の整数値を見つけることです。この最大値を取得したら、入力データの最大浮動小数点値を見つけ、これら 2 つの最大値の比率で入力をスケーリングし、最も近い整数に丸めます (切り捨てを避けます)。
実際には、アルゴリズムがオーバーフローせずに受け入れることができる最大の整数値を判断できないため、おそらくこれを行うことはできません。アルゴリズムの詳細がわからないか、すべての入力値に複雑に依存している可能性があります。この場合、十分に機能すると思われる任意の最大入力値を選択するだけで済みます。
最初に入力を [0,1) 範囲に正規化し、次に一般的な方法を使用してそれらをスケーリングします。
f(x) = range_max_exclusive * x + range_min_inclusive
その後、f(x) (または必要に応じて丸め) を整数にキャストします。そのようにして、実際の値が範囲内[0,1)
または範囲内にあるなどの状況を処理できます[0,n) where n>1
。
一般に、お気に入りのライブラリには行列演算が含まれており、この手法を簡単に実装でき、可能な実装よりもパフォーマンスが向上します。
EDIT:スケールダウンしてからスケールアップすると、精度が失われます。正規化操作は通常ライブラリに付属しているため、私はそれを好みます。また、次の方法でダウンスケーリングせずにそれを行うことができます。
f(x) = range_max_exlusive / max_element * x + range_min_inclusive