سؤال

وأريد أن تطبيق وظيفة لجميع الأعمدة في المصفوفة مع MATLAB. على سبيل المثال، أود أن تكون قادرة على الاتصال السلس على كل عمود مصفوفة، بدلا من وجود نحو سلس علاج المصفوفة كناقل (والذي هو السلوك الافتراضي في حالة استدعاء smooth(matrix)).

وأنا متأكد من يجب أن يكون هناك طريقة أكثر الاصطلاحية للقيام بذلك، لكنني لا يمكن العثور عليه، حتى لقد تعريف وظيفة map_column:

function result = map_column(m, func)
    result = m;
    for col = 1:size(m,2)
        result(:,col) = func(m(:,col));
    end
end

والتي يمكن أن أدعو مع:

smoothed = map_column(input, @(c) (smooth(c, 9)));

هل هناك أي شيء خطأ مع هذا الرمز؟ كيف يمكن لي أن تحسينه؟

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

المحلول

والحل الخاص بك على ما يرام.

لاحظ أن horizcat يوقع جزاء أداء كبيرة للمصفوفات كبيرة. يجعل رمز يكون O (N ^ 2) بدلا من O (N). للاطلاع على مصفوفة 100x10،000، التطبيق الخاص بك تأخذ 2.6s على الجهاز الخاص بي، وhorizcat واحد يأخذ 64.5s. للاطلاع على مصفوفة 100x5000، وتنفيذ horizcat يأخذ 15.7s.

إذا أردت، يمكنك أن تعميم وظيفة الخاص بك قليلا وجعلها تكون قادرة على تكرار عبر البعد النهائي أو حتى على أبعاد التعسفية (لا الأعمدة فقط).

نصائح أخرى

ووMATLAB "ل" بيان حلقات في الواقع أكثر من الأعمدة من كل ما هو الموردة - عادة، هذا ينتج فقط في سلسلة من سكالارس منذ ناقلات مرت في ل(كما في المثال الخاص بك أعلاه) هو متجه التوالي. هذا يعني أنه يمكنك كتابة التعليمات البرمجية أعلاه كما يلي:

function result = map_column(m, func)
    result = [];
    for m_col = m
      result = horzcat(result, func(m_col));
    end

إذا لم ظائفها يعود متجه العمود، ثم يمكنك إضافة شيء من هذا القبيل

f = func(m_col);
result = horzcat(result, f(:));

لإرغامه على عمود.

وربما يمكن دائما تحويل مصفوفة مع 'المشغل ومن ثم تحويل النتيجة مرة أخرى.

smoothed = smooth(input', 9)';

وهذا يعمل على الأقل مع وظيفة الاتحاد الفرنسي للتنس.

وهناك طريقة لإحداث حلقة ضمنية عبر أعمدة مصفوفة هو استخدام cellfun. وهذا هو، يجب أولا تحويل مصفوفة لمجموعة خلية، كل خلية عقد عمود واحد. ثم استدعاء cellfun. على سبيل المثال:

A = randn(10,5);

ونرى أن هنا لقد احتساب الانحراف المعياري لكل عمود.

cellfun(@std,mat2cell(A,size(A,1),ones(1,size(A,2))))

ans =
      0.78681       1.1473      0.89789      0.66635       1.3482

وبطبيعة الحال، يتم تعيين العديد من الوظائف في MATLAB بالفعل للعمل على صفوف أو أعمدة مصفوفة كما يشير المستخدم. وهذا ينطبق على الأمراض المنقولة جنسيا وبطبيعة الحال، ولكن هذا هو وسيلة مريحة لاختبار أن cellfun عملت بنجاح.

std(A,[],1)

ans =
      0.78681       1.1473      0.89789      0.66635       1.3482

لا تنس أن preallocate المصفوفة نتيجة إذا كنت تتعامل مع مصفوفات كبيرة. على خلاف ذلك وحدة المعالجة المركزية الخاصة بك وسوف تنفق الكثير من دورات مرارا وتكرارا إعادة تخصيص-المصفوفة في كل مرة يضيف صف / عمود جديد.

وإذا كانت هذه هي حالة الاستخدام المشترك للوظيفة الخاص بك، فإنه ربما يكون فكرة جيدة لجعل أعاد ظيفة من خلال الأعمدة تلقائيا إذا كان الإدخال ليس النواقل.

وهذا لا بالضبط حل مشكلتك ولكن سيكون تبسيط استخدام وظائف ". في هذه الحالة، يجب أن يكون الإخراج مصفوفة أيضا.

ويمكنك أيضا تحويل المصفوفة إلى عمود واحد طويل باستخدام m(:,:) = m(:). ومع ذلك، فإنه يعتمد على وظيفة الخاص بك إذا كان هذا من شأنه أن يكون له معنى.

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