كيف يمكنني تحويل مصفوفة 2X2 4X4 إلى مصفوفة في MATLAB؟
سؤال
وانا بحاجة الى بعض المساعدة في تحويل مصفوفة 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 "> هنا
وهتاف