ما هو بناء الجملة الصحيح لتطبيق دالة للعناصر الفرعية من مصفوفة دون استخدام حلقة؟
-
19-09-2019 - |
سؤال
لدي وظيفة محددة (GetDepth) التي تقوم بشيء تافه إلى حد ما، مثل مصفوفة 2x4 وتخرج مصفوفة 2x1. بعد ذلك، لدي مصفوفة 2x4xn أريد تطبيقها على ذلك، وأتوقع أن أتيكل مصفوفة 2x1xn.
ما هو بناء الجملة الصحيح لتطبيق وظيفتي على المصفوفة دون اللجوء باستخدام حلقة؟
إد. على النحو المطلوب، إليك مثال على الشيء الذي أحاول القيام به:
function [bidWSize, askWSize] = getWSizes(m, bookSizeHistory)
bidWSize = sum(bookSizeHistory(2:4, 1, m));
askWSize = sum(bookSizeHistory(2:4, 2, m));
end
حاليا أنا ثم احتلال وتغذية في إخراج 2x1xn
المحلول
سيكون عليك كتابة الوظيفة حتى تتمكن من التعامل مع مصفوفات NX2X4. إذا كان الأمر بالفعل يفعل شيئا تافها، فلا ينبغي أن يكون من الصعب للغاية. إذا كان لديك أي مشكلة في ذلك، فيمكنك نشرها هنا وطلب المساعدة.
تعديل:
المبلغ هو وظيفة تعمل بشكل جيد مع المصفوفات، حتى تتمكن من تحقيق ما تريد تلخيصه فقط على المصفوفة، واللعب بالأبعاد. لا تحتاج إلى الوظيفة على الإطلاق:
sum(bookSizeHistory(2:4, 1:2, :))
مبالغ على البعد الأول (مثل ما تفعله في الوظيفة)، لذلك افتراض bookSizeHistory
حجم KX2XN، إخراج هذا المبلغ هو 1x2xn. يمكنك إضافة تصريح لإعادة ترتيب الأبعاد كما تتمنا:
permute(sum(bookSizeHistory(2:4, 1:2, :)), [2 1 3])
يجب أن تعطيك ما تحتاجه.
نصائح أخرى
يمكنك إجراء وظائف على العناصر الفردية باستخدام "." المشغل أو العامل. على سبيل المثال، جلب كل عنصر إلى بعض الطاقة، وسوف تستخدم:
C=A.^B;
بدلا من:
[rows,cols]=size(A);
for i=1:rows
for j=1:cols
C=A(i,j)^B;
end
end
هذا يعطي كود أقصر بكثير من حلقة مع نفس النتائج. يشار إليها عادة باسم التعليمات البرمجية "الموجهة"، والتي تستفيد من وظائف Blas. خلاف ذلك ماتلاب هو أكثر مثل لغة تفسير، وهو أبطأ بكثير. وظائف أخرى تؤدي العمليات على جميع الصفوف أو الأعمدة في صفيف. إذا كانت مجموعة ثنائية الأبعاد (2،4)، فإن المبلغ (أ) من شأنه أن يمنح مجموع كل عمود. حيث يمكن العثور على مجموع المبلغ بطرق مختلفة:
A_temp=reshape(A,[1,8]);
B=sum(A_temp);
أو
A=sum(sum(A));
قد يكون هناك بعض الوظائف الأخرى في الأمر SUM يتيح القيام بذلك بدعوة واحدة مع بعض الوسيطة الإضافية، ولكن هذا لا يزال طريقة سريعة لائق للقيام بذلك.