Matlab: استخراج أجزاء متعددة من مصفوفة دون استخدام الحلقات

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

  •  05-09-2019
  •  | 
  •  

سؤال

لدي مصفوفة 2D ضخمة وأرغب في استخراج 15 قطعة 100x100 مختلفة من ذلك. لدي جهازين X و Y حيث يتم حفظ أعلى المؤشرات اليسرى للأجزاء. لقد استخدمت شيئا مثل هذا:

result = cam1(x(1:end):(x(1:end)+99), y(1:end):(y(1:end)+99));

ولكن النتيجة هي مجرد مصفوفة 100x100 بدلا من 15x100x100. لماذا ا؟

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

هل لديك أي حل أنيق؟ شكرا.

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

المحلول

هناك عدد من الطرق التي يمكنك القيام بذلك دون حلقات. معظم الحلول تنطوي على توسيع ناقلات عاشر و Y. في مصفوفات أكبر من المؤشرات، ومن المرجح أن تستخدم واحدة أو أكثر من الوظائف repmat., bsxfun., ، أو Sub2ind.. وبعد يمكن العثور على برنامج تعليمي جيد لمفهرس المصفوفة هنا.

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

indexFcn = @(r,c) cam1(r:(r+99),c:(c+99));
result = arrayfun(indexFcn,x,y,'UniformOutput',false);
result = cat(3,result{:});

تفسير:

الخط الأول يخلق وظيفة مجهولة. وبعد هذه هي وظيفة سطر واحدة بسيطة يمكن إنشاؤها على ذبابة دون الحاجة إلى وضعها في ملف M. تعرف الوظيفة مدخلتين رديئة و جيم التي تستخدم لاستخراج Submatrix 100-100 من cam1.. وبعد المتغير indexfcn. مخازن A. وظيفة مقبض الذي يستخدم لاستدعاء الوظيفة. لاحظ أن قيم cam1. تستخدمها الوظيفة المجهولة هي ثابتة. وبعد حتى لو كانت القيم في المتغير cam1. التغيير، وظيفة مجهولة لا تزال تستخدم القيم التي كانت في cam1. عند إنشاء الوظيفة.

السطر الثاني يجعل مكالمة إلى Arrayfun، والتي تنطبق على وظيفة لكل عنصر من عناصر صفيف. عرافسون الحلقات على كل دخول في عاشر و Y., ، اجتياز القيم ل indexfcn.. وبعد يتم تخزين الناتج في نتيجة, ، مجموعة خلية 15 عنصر حيث تحتوي كل خلية على مصفوفة 100 بواسطة 100.

يستخدم السطر الثالث وظيفة CAT لتسلسل المصفوفات 100 بنسبة 100 في مصفوفة 100 بوصة 100 بنسبة 15.

نصائح أخرى

نظرا لأن هذا هو الواجبات المنزلية بوضوح، لن أعطيك الإجابة الكاملة.

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

A = rand(5,6)
A =
      0.81472      0.09754      0.15761      0.14189      0.65574      0.75774
      0.90579       0.2785      0.97059      0.42176     0.035712      0.74313
      0.12699      0.54688      0.95717      0.91574      0.84913      0.39223
      0.91338      0.95751      0.48538      0.79221      0.93399      0.65548
      0.63236      0.96489      0.80028      0.95949      0.67874      0.17119

A(3:4,3:4)

سيعود إلى Submatrix 2x2 من A. ولكن يمكننا أيضا أن نجد ذلك

reshape(A([13 14 18 19]),[2 2])
ans =
      0.95717      0.91574
      0.48538      0.79221

لماذا اخترت مجموعة الفهرس هذا؟ للإجابة، ستحتاج إلى القراءة حول Sub2ind.

[I,J] = ndgrid(3:4,3:4);
sub2ind([5 6],I(:),J(:))
ans =
    13
    14
    18
    19

في النهاية، يبدو أنك تريد مجموعة 15x100x100 من الأجزاء المستخرجة. لذا قم ببناء مجموعة الفهرس الضرورية لأعلى من القطع التي أظهرتها. ستحتاج إلى القيام بإعادة تشكيل نهائي في النهاية لجعله الشكل المناسب.

هذا يجب أن يمنحك ما يكفي من بداية لإنهاء واجباتك المنزلية.

تفكر في كل شيء من الصعب، جرب هذا واحد: Mat2Cell

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