كيف يمكنني تحويل مصفوفة 2X2 4X4 إلى مصفوفة في MATLAB؟

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

  •  10-07-2019
  •  | 
  •  

سؤال

وانا بحاجة الى بعض المساعدة في تحويل مصفوفة 2X2 إلى مصفوفة 4X4 على النحو التالي:

A = [2 6;
     8 4]

وينبغي أن تصبح:

B = [2 2 6 6;
     2 2 6 6;
     8 8 4 4;
     8 8 4 4]

وكيف أفعل ذلك؟

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

المحلول

A = [2 6; 8 4];
% arbitrary 2x2 input matrix

B = repmat(A,2,2);
% replicates rows & columns but not in the way you want

B = B([1 3 2 4], :);
% swaps rows 2 and 3

B = B(:, [1 3 2 4]);
% swaps columns 2 and 3, and you're done!

نصائح أخرى

في إصدارات أحدث من MATLAB (R2015a وفي وقت لاحق) أسهل طريقة للقيام بذلك هو استخدام في وظيفة repelem :

B = repelem(A, 2, 2);

لالإصدارات القديمة، بديل قصيرة إلى (إلى حد كبير) الحلول الأخرى التي تعتمد على فهرسة هو استخدام وظائف <لأ href = "https://www.mathworks.com/help/matlab/ref/kron.html" يختلط = "نوفولو noreferrer"> kron و ones :

>> A = [2 6; 8 4];
>> B = kron(A, ones(2))

B =

     2     2     6     6
     2     2     6     6
     8     8     4     4
     8     8     4     4

ويمكن أن يتم ذلك حتى أسهل من حل جيسون:

B = A([1 1 2 2], :);  % replicate the rows
B = B(:, [1 1 2 2]);  % replicate the columns

وهنا حل واحد أكثر من ذلك:

A = [2 6; 8 4];
B = A( ceil( 0.5:0.5:end ), ceil( 0.5:0.5:end ) );

والذي يستخدم فهرسة أن تفعل كل شيء ولا تعتمد على حجم أو شكل A.

وهذا يعمل:

A = [2 6; 8 4];
[X,Y] = meshgrid(1:2);
[XI,YI] = meshgrid(0.5:0.5:2);
B = interp2(X,Y,A,XI,YI,'nearest');

وهذا هو فقط ثنائي الأبعاد الاستيفاء أقرب الجار من ألف (س، ص) من س، ص ∈ {1،2} إلى س، ص ∈ {0.5، 1، 1.5، 2}.

تعديل : في Springboarding الخروج من جيسون S والحلول مارتن، وأنا أعتقد أن هذا هو على الأرجح أقصر وأوضح حل:

A = [2 6; 8 4];
B = A([1 1 2 2], [1 1 2 2]);

إليك طريقة على أساس الفهرسة البسيطة التي يعمل لمصفوفة التعسفية. نريد كل عنصر ليتم توسيع إلى submatrix MXN:

A(repmat(1:end,[M 1]),repmat(1:end,[N 1]))

مثال:

>> A=reshape(1:6,[2,3])

A =

     1     3     5
     2     4     6

>> A(repmat(1:end,[3 1]),repmat(1:end,[4 1]))

ans =

     1     1     1     1     3     3     3     3     5     5     5     5
     1     1     1     1     3     3     3     3     5     5     5     5
     1     1     1     1     3     3     3     3     5     5     5     5
     2     2     2     2     4     4     4     4     6     6     6     6
     2     2     2     2     4     4     4     4     6     6     6     6
     2     2     2     2     4     4     4     4     6     6     6     6

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

>> m=3; 1:m

ans =

     1     2     3

وبعد ذلك، نتقدم إلى مصفوفة، من خلال تكرار ذلك مرات M في البعد الأول

>> M=4; I=repmat(1:m,[M 1])

I =

     1     2     3
     1     2     3
     1     2     3
     1     2     3

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

>> I(:)

ans =

     1
     1
     1
     1
     2
     2
     2
     2
     3
     3
     3
     3

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

>> A(repmat(1:end,[3 1]),repmat(1:end,[4 1]))
>> A(repmat(1:2,[3 1]),repmat(1:3,[4 1]))
>> A(repmat([1 2],[3 1]),repmat([1 2 3],[4 1]))
>> A([1 2;1 2;1 2],[1 2 3;1 2 3;1 2 3;1 2 3])
>> A([1 1 1 2 2 2],[1 1 1 1 2 2 2 2 3 3 3 3])

وهناك وظيفة إعادة تشكيل () الذي يسمح لك أن تفعل هذا ...

وعلى سبيل المثال:

reshape(array, [64, 16])

ويمكنك العثور على الفيديو الرائع البرنامج التعليمي <لأ href = "http://blogs.mathworks.com/videos/2009/03/13/reshape-a-matrix-without-using-a-for-loop/ "يختلط =" نوفولو noreferrer "> هنا

وهتاف

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