Normalizacja od [0,5 - 1] do [0 - 1]

Trochę tu utknąłem, to chyba jakaś łamigłówka. Jeśli mam liczby z zakresu od 0,5 do 1, Jak mogę znormalizować to, aby było od 0 do 1?

Dzięki za pomoc, może jestem trochę powolny, ponieważ pracowałem przez ostatnie 24 godziny prosto O_O

Author: tweetypi, 2009-09-24

6 answers

Inni dostarczyli Ci formułę, ale nie pracę. Oto, jak podchodzisz do takiego problemu. Może okazać się to o wiele bardziej wartościowe niż tylko poznanie odpowiedzi.

Aby odwzorować [0.5, 1] do [0, 1] poszukamy liniowej mapy postaci x -> ax + b. Wymagamy, aby punkty końcowe były mapowane na punkty końcowe i aby kolejność była zachowana.

Metoda pierwsza: wymóg, że punkty końcowe są mapowane do punktów końcowych i że kolejność jest zachowana, oznacza, że {[8] } jest mapowana do 0 i 1 jest odwzorowane na 1

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

Jest to układ równań liniowych, który można rozwiązać mnożąc równanie (1) przez -2 i dodając równanie (1) do równania (2). W ten sposób otrzymujemy b = -1 i zamieniając to z powrotem na równanie (2) otrzymujemy to a = 2. Tak więc mapa x -> 2x - 1 załatwi sprawę.

Metoda druga: nachylenie linii przechodzącej przez dwa punkty (x1, y1) i (x2, y2) wynosi

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

Tutaj użyjemy punkty (0.5, 0) i (1, 1) w celu spełnienia wymogu, że punkty końcowe są mapowane do punktów końcowych i że mapa jest zachowanie porządku. Dlatego nachylenie jest

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

Mamy, że (1, 1) jest punktem na linii i dlatego przez punkt-nachylenie postaci równania linii mamy, że

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

Tak, że

y = 2x - 1.

Po raz kolejny widzimy, że x -> 2x - 1 to mapa, która załatwi sprawę.

 64
Author: jason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-01 17:32:57

Odejmij 0,5 (dając nowy zakres 0-0,5), a następnie pomnóż przez 2.

double normalize( double x )
{
    // I'll leave range validation up to you
    return (x - 0.5) * 2;
}
 31
Author: Bill the Lizard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-24 12:36:47

Aby dodać kolejną ogólną odpowiedź.

Jeśli chcesz odwzorować zakres liniowy [A..B] do [C..D], można zastosować następujące kroki:

Przesuń zakres tak, aby dolna granica wynosiła 0. (subrakt A z obu granic:

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

Przeskaluj zakres tak, aby był [0..1]. (podziel przez górną granicę):

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

Przeskaluj zakres tak, aby miał długość nowego zakresu, który wynosi D-C. (mnożenie przez D-C):

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

Przesuń zakres tak, aby dolna granica wynosiła C. (Dodaj C do "granica": {]}

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

Łącząc to z pojedynczym wzorem, otrzymujemy:

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

W Twoim przypadku, A=0.5, B=1, C=0, D=1 otrzymujesz:

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

UWAGA, jeśli musisz przekonwertować wiele x Na X', możesz zmienić formułę na:

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

Interesujące jest również spojrzenie na nieliniowe zakresy. Możesz wykonać te same kroki, ale potrzebujesz dodatkowego kroku, aby przekształcić zakres liniowy w nieliniowy.

 24
Author: Toon Krijthe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-25 13:23:20

× 2 - 1

Should do the trick

 15
Author: Glenner003,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-24 12:31:27

Lazyweb odpowiedź: aby przekonwertować wartość x z [minimum..maximum] na [floor..ceil]:

Przypadek ogólny:

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

Normalizować do [0..255]:

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

Normalizować do [0..1]:

normalized_x = (x - minimum)/(maximum - minimum)
 14
Author: meetar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-10 17:41:14

Zawsze możesz użyć clamp lub saturate w swojej matematyce, aby upewnić się, że ostateczna wartość jest między 0-1. Trochę nasycić na końcu, ale widziałem to robione podczas obliczeń, też.

 0
Author: Whitney Imura,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-13 23:03:50