Ruby

ある範囲における数値を別な範囲における数値に変換する

More than 1 year has passed since last update.

$ x_{min} $ 以上 $ x_{max} $ 以下の範囲に存在する数値 $ x_i $ を、0 以上 1 以下の範囲に存在する数値 $ n_i $ に変換する、つまり正規化するためには

\begin{equation}

n_i = \frac{x_i - x_{min}}{x_{max} - x_{min}}
\end{equation}

という式で計算します。逆に、正規化した数値 $ n_i $ を $ y_{min} $ 以上 $ y_{max} $ 以下の範囲に存在する数値 $ y_i $ 変換する、つまり非正規化するには、上記の式を変形した

\begin{equation}

y_i = n_i(y_{max} - y_{min}) + y_{min}
\end{equation}

という式で計算します。

module NumericExtensions

refine Numeric do
def normalize(min = 0, max = 1)
(self - min).to_f / (max - min)
end

def denormalize(min = 0, max = 1)
self * (max - min) + min
end
end
end

using NumericExtensions

# (例 1) 1..3 の範囲における 2 を 0..1 における数値に変換する。
2.normalize(1, 3) #=> 0.5

# (例 2) (例 1) の結果を元に戻す。
2.normalize(1, 3).denormalize(1, 3) #=> 2.0

# (例 3) 1..3 の範囲における 2 を 1..5 における数値に変換する。
2.normalize(1, 3).denormalize(1, 5) #=> 3.0

# (例 4) 1..5 の範囲における 3 を 1..3 における数値に変換する。
3.normalize(1, 5).denormalize(1, 3) #=> 2.0