ما هو بناء الجملة الصحيح لتطبيق دالة للعناصر الفرعية من مصفوفة دون استخدام حلقة؟

StackOverflow https://stackoverflow.com/questions/2239022

  •  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 يتيح القيام بذلك بدعوة واحدة مع بعض الوسيطة الإضافية، ولكن هذا لا يزال طريقة سريعة لائق للقيام بذلك.

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