2009-09-24 100 views
26

我有點卡在這裏,我猜這是一個腦部傳情。如果我的數字範圍在0.5到1之間,我如何將它標準化爲0到1之間?正常化從[0.5 - 1]到[0 - 1]

感謝您的幫助,也許我只是有點慢,因爲我已經工作了過去24個小時了O_O

+1

我假設+的投票是專門針對「一直工作過去24小時直」:) – Michael 2014-01-13 23:44:45

回答

63

其他人提供了你的公式,但不是工作。以下是你如何處理這樣的問題。你可能會發現這比僅僅知道答案更有價值。我們將尋找x -> ax + b的線性地圖。我們將要求將端點映射到端點,並保留該順序。

方法一:端點被映射到端點和該順序被保存的要求意味着0.5映射到01被映射到1

a * (0.5) + b = 0 (1) 
a * 1 + b = 1  (2) 

這是線性方程的同時系統並且可以通過將方程(1)乘以-2並且將方程(1)添加到方程(2)來解決。在這樣做時,我們獲得b = -1並且將其替換回等式(2),我們獲得a = 2。因此,地圖x -> 2x - 1將做的伎倆。

方法二:通過兩個點(x1, y1)(x2, y2)線的斜率是

(y2 - y1)/(x2 - x1). 

在這裏,我們將使用點(0.5, 0)(1, 1)滿足端點被映射到端點和要求該地圖是保存順序的。因此,斜率是

m = (1 - 0)/(1 - 0.5) = 1/0.5 = 2. 

我們有(1, 1)是線路上的點,並因此通過的線的​​方程的點斜形式我們有

y - 1 = 2 * (x - 1) = 2x - 2 

使得

y = 2x - 1. 

我們再次看到x -> 2x - 1是一個可以做到這一點的地圖。

+0

在方法一中,爲了解決,爲什麼要將方程(1)乘以-2? – RobertL 2009-09-24 16:03:50

+1

@RobertL:爲了求解一個具有兩個未知數的兩個方程的線性系統,最簡單的方法是將該系統轉換爲其中一個未知數的係數在兩個方程中相等的等價系統。所以在這裏我們有兩個方程:a *(0.5)+ b = 0和a * 1 + b = 1。在將第一個等式乘以2後,我們得到兩個等式'a + 2 * b = 0'和'a * 1 + b = 1'。由於'a'的係數在兩個方程中都是相等的,所以我們可以從第二個方程中減去第一個方程以獲得'-b = 1'。 – jason 2009-09-24 17:35:30

15

×2 - 1

應該做的伎倆

+3

這將舍入到0,1或2. – erelender 2009-09-24 12:36:27

+3

這是解決方案的數學部分我解決的不是語言相關部分 – Glenner003 2009-09-24 12:59:00

31

減去0.5(給你的0新的範圍 - 0.5)再乘以2。

double normalize(double x) 
{ 
    // I'll leave range validation up to you 
    return (x - 0.5) * 2; 
} 
24

添加另一個通用答案。

如果要將線性範圍[A..B]映射到[C ..d]時,可以應用以下步驟:

移位的範圍,因此下限是0(從兩個界限subract答:

[A..B] -> [0..B-A] 

量表所以它是範圍[0..1] (由上限除):

[0..B-A] -> [0..1] 

量表因此它具有新的範圍是DC的長度的範圍內(與DC乘法):

[0..1] -> [0..D-C] 

移的範圍內,因此下限是C.(添加C至界限):

[0..D-C] -> [C..D] 

此結合到一個單一的公式,我們得到:

 (D-C)*(X-A) 
X' = ----------- + C 
      (B-A) 

在你的情況下,A = 0.5 ,B = 1,C = 0,d = 1你:

 (X-0.5) 
X' = ------- = 2X-1 
     (0.5) 

注意,如果你要轉換大量的X到X的」,您可以更改公式:

 (D-C)   C*B - A*D 
X' = ----- * X + --------- 
     (B-A)   (B-A) 

查看非線性範圍也很有趣。您可以採取相同的步驟,但需要額外的步驟將線性範圍轉換爲非線性範圍。

+0

爲了適應非線性範圍,您需要做什麼?我想將-1..1範圍轉換爲-.25..1,其中-.25..0..1 = -1..0..1(因此-0.25..0是整個範圍-1..0)。 – Shizam 2013-10-07 19:45:42

14

Lazyweb答案:

一般情況下:的值x[minimum..maximum][floor..ceil]轉換

normalized_x = ((ceil - floor) * (x - minimum))/(maximum - minimum) + floor 

爲了歸爲[0..255]:

normalized_x = (255 * (x - minimum))/(maximum - minimum) 

歸一化爲[0..1]:

normalized_x = (x - minimum)/(maximum - minimum) 
+0

我喜歡你一般化你的答案的方式。我用你的語法在Python中做這個。 +1 – MyCarta 2014-05-07 02:38:08

0

您可以在您的數學中始終使用鉗位或飽和以確保您的最終值在0-1之間。最後有些飽和,但我也在計算過程中看到它完成。