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
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ę.
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;
}
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.
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
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)
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ż.
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