تطبيع من [0.5 - 1] إلى [0 - 1
سؤال
أنا عالق هنا، أعتقد أنه قليل من دعابة الدماغ. إذا كان لدي أرقام في النطاق بين 0.5 إلى 1 كيف يمكنني تطبيعها لتكون بين 0 إلى 1؟
شكرا لأي مساعدة، ربما بطيء قليلا منذ أن كنت أعمل لمدة 24 ساعة الماضية مستقيم O_O
المحلول
وقد قدم لك الآخرون الصيغة، ولكن ليس العمل. إليك الطريقة التي تقترب منها مشكلة مثل هذا. قد تجد هذا أكثر قيمة بكثير من المعرفة فقط الإجابة.
الى الخريطة [0.5, 1]
ل [0, 1]
سنطلب خريطة خطية للنموذج x -> ax + b
. وبعد سوف نطلب مع تعيين نقاط النهاية إلى نقاط النهاية والحفاظ على هذا الطلب.
الطريقة الأولى: يتم تعيين شرط نقاط النهاية إلى نقاط النهاية ويتم الحفاظ على هذا الترتيب يعني ذلك 0.5
تم تعيينه إلى 0
و 1
تم تعيينه إلى 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.5 (مما يتيح لك مجموعة جديدة من 0 - 0.5) ثم اضرب بنسبة 2.
double normalize( double x )
{
// I'll leave range validation up to you
return (x - 0.5) * 2;
}
لإضافة إجابة عامة أخرى.
إذا كنت ترغب في تعيين النطاق الخطي [A.B] إلى [C..D]، يمكنك تطبيق الخطوات التالية:
تحول النطاق لذا فإن الحد الأدنى هو 0. (subract a من كلا الحدود:
[A..B] -> [0..B-A]
مقياس النطاق بحيث يكون [0..1]. (تقسيم من خلال الحد العلوي):
[0..B-A] -> [0..1]
قم بتوسيع نطاق النطاق بحيث يكون طول النطاق الجديد الذي هو DC. (اضرب DC):
[0..1] -> [0..D-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)
ومن المثير للاهتمام أيضا إلقاء نظرة على النطاقات غير الخطية. يمكنك أن تأخذ نفس الخطوات، لكنك تحتاج إلى خطوة إضافية لتحويل النطاق الخطي إلى نطاق غير خطي.
× 2 − 1
يجب أن تفعل الخدعة
الرد 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-1. بعض التشبع في النهاية، لكنني رأيت ذلك أثناء حسابه أيضا.