سؤال

أنا عالق هنا، أعتقد أنه قليل من دعابة الدماغ. إذا كان لدي أرقام في النطاق بين 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. بعض التشبع في النهاية، لكنني رأيت ذلك أثناء حسابه أيضا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top