سؤال

لدي هذا السطر من التعليمات البرمجية في MATLAB، كتبه شخص آخر:

c=a.'/b

أحتاج إلى ترجمته إلى بايثون.a، b، و c كلها صفائف.الأبعاد التي أستخدمها حاليًا لاختبار الكود هي:

أ:18x1,
ب:25x18,

الذي يعطيني ج بأبعاد 1x25.

المصفوفات ليست مربعة، لكنني لا أريد أن يفشل الكود إذا كانت كذلك.هل يمكن لأي شخص أن يشرح بالضبط ما يفعله هذا السطر (رياضيًا)، وكيفية القيام بذلك في بايثون؟(أي ما يعادل وظيفة mrdivide المضمنة في MATLAB إذا كانت موجودة في Python؟)

هل كانت مفيدة؟

المحلول

وخط

c = a.' / b

ويحسب الحل من المعادلة <ط> ج ب = أ <سوب> T ل <ط> ج . نمباي لم يقم المشغل أن يفعل ذلك مباشرة. وبدلا من ذلك يجب ايجاد حل <ط> ب <سوب> T ج <سوب> T في ل <ط> ج <سوب> T وتبديل النتيجة:

c = numpy.linalg.lstsq(b.T, a.T)[0].T

نصائح أخرى

الرمز / هو مشغل القسمة اليمنى للمصفوفة في MATLAB، والذي يستدعي mrdivide وظيفة.من الوثائق، يرتبط التقسيم الصحيح للمصفوفة بـ مصفوفة القسمة اليسرى بالطريقة الآتية:

B/A = (A'\B')'

لو A هي مصفوفة مربعة، B/A يساوي تقريبًا B*inv(A) (على الرغم من أنه يتم حسابه بطريقة مختلفة وأكثر قوة).خلاف ذلك، x = B/A هو الحل بمعنى المربعات الصغرى لنظام المعادلات غير المحدد أو المفرط x*A = B.ويرد المزيد من التفاصيل حول الخوارزميات المستخدمة لحل نظام المعادلات هنا.عادة ما تحب الحزم لاباك أو بلاس تستخدم تحت غطاء محرك السيارة.

ال حزمة NumPy لبيثون يحتوي على روتين lstsq لحساب حل المربعات الصغرى لنظام المعادلات.من المحتمل أن يمنحك هذا الروتين نتائج مماثلة لاستخدام mrdivide وظيفة في MATLAB، ولكن من غير المرجح أن يكون بالضبط.من المحتمل أن تؤدي أي اختلافات في الخوارزميات الأساسية التي تستخدمها كل وظيفة إلى إجابات تختلف قليلاً عن بعضها البعض (أي:قد يُرجع أحدهما قيمة 1.0، بينما قد يُرجع الآخر قيمة 0.999).الحجم النسبي لهذا الخطأ استطاع سينتهي بك الأمر إلى أن تصبح أكبر، اعتمادًا كبيرًا على نظام المعادلات المحدد الذي تحله.

ليستخدم lstsq, ، قد تضطر إلى تعديل مشكلتك قليلاً.يبدو أنك تريد حل معادلة النموذج البنك المركزي = أ, ، أين ب هو 25 × 18، أ هو 1 × 18، و ج هو 1 في 25.تطبيق أ تبديل موضع لكلا الجانبين يعطيك المعادلة بتجت = أت, ، وهو نموذج أكثر معيارية (أي. الفأس = ب).الحجج ل lstsq يجب أن يكون ( بهذا الترتيب ) بت (مصفوفة 18 × 25) و أت (مصفوفة مكونة من 18 عنصرًا). lstsq يجب أن يُرجع مصفوفة مكونة من 25 عنصرًا (جت).

ملحوظة:في حين أن NumPy لا يميز بين مصفوفة 1-by-N أو N-by-1، فإن MATLAB يفعل ذلك بالتأكيد، وسوف يصرخ عليك إذا لم تستخدم المصفوفة المناسبة.

في ماتلاب، A.' يعني نقل المصفوفة.إذن، رياضيًا، ما يتم تحقيقه في الكود هو Aت/ب.


كيفية البدء في تنفيذ تقسيم المصفوفة في بايثون (أو أي لغة) (ملحوظة:دعونا نتناول تقسيمًا بسيطًا للنموذج A/B;على سبيل المثال الخاص بك سوف تحتاج إلى القيام بـ Aت أولا ثم أت/B بعد ذلك، ومن السهل جدًا إجراء عملية النقل في Python |left-as-an-exercise :)|)

لديك معادلة مصفوفة C*B = A (تريد العثور على C كـ A/B)

القسمة اليمنى (/) هي كما يلي:

ج**بت)=أ*بت

يمكنك بعد ذلك عزل C عن طريق قلب (B*بت)

أي.،

ج = أ*بت**بت)' ----- [1]

ولذلك، لتنفيذ تقسيم المصفوفة في بايثون (أو أي لغة)، احصل على الطرق الثلاث التالية.

  • ضرب المصفوفة
  • تبديل المصفوفة
  • مصفوفة معكوسة

ثم طبقها بشكل متكرر لتحقيق القسمة كما في [١].

فقط، ما عليك القيام به هو Aت/B، وبالتالي فإن العملية النهائية بعد تنفيذ الطرق الأساسية الثلاثة يجب أن تكون:

أت*بت**بت)'

ملحوظة:لا تنس القواعد الأساسية لأسبقية عامل التشغيل :)

[تحرير] كما أشار Suvesh بها، وكنت خاطئ تماما من قبل. ومع ذلك، نمباي لا يزال بسهولة تفعل الإجراء يعطي في منصبه:

A = numpy.matrix(numpy.random.random((18, 1))) # as noted by others, your dimensions are off
B = numpy.matrix(numpy.random.random((25, 18)))
C = A.T * B.T * (B * B.T).I

ويمكنك أيضا أن هذه باستخدام الزائفة معكوس B ثم الرد بضرب تلك النتيجة مع A. حاول استخدام numpy.linalg.pinv ثم الجمع بين هذا مع مصفوفة الضرب عبر numpy.dot :

c = numpy.dot(a, numpy.linalg.pinv(b))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top