Frage

Ich brauche Hilfe eine 2X2-Matrix auf eine 4X4-Matrix in der folgenden Art und Weise bei der Umwandlung:

A = [2 6;
     8 4]

sollte werden:

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

Wie würde ich das tun?

War es hilfreich?

Lösung

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!

Andere Tipps

In neueren Versionen von MATLAB (R2015a und höher) der einfachste Weg, dies zu tun, ist mit der repelem Funktion:

B = repelem(A, 2, 2);

Für ältere Versionen, eine kurze Alternative zu den anderen (weitgehend) Indizierung basierten Lösungen ist es, die Funktionen verwenden kron und 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

Kann noch einfacher als Jasons Lösung getan werden:

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

Hier ist eine weitere Lösung:

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

, die Indizierung verwendet, alles zu tun und beruht nicht auf der Größe oder Form von A.

Das funktioniert:

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');

Dies ist nur zweidimensionale Interpolation nächste Nachbarn von A (x, y) von x, y ∈ {1,2}, um x, y ∈ {0,5, 1, 1,5, 2}.

Bearbeiten : von Jason S und Martijn Lösungen Springboarding aus, ich denke, das ist wahrscheinlich die kürzeste und klarste Lösung:

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

Hier ist eine Methode, die auf einfache Indizierung, die für eine beliebige Matrix funktioniert. Wir wollen jedes Element zu einem MxN Submatrix erweitert werden:

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

Beispiel:

>> 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

Um zu sehen, wie die Methode funktioniert, schauen wir uns die Indizierung einen genaueren Blick. Wir beginnen mit einem einfachen Zeilenvektor von aufeinanderfolgenden Zahlen

>> m=3; 1:m

ans =

     1     2     3

Als nächst wir erweitern es auf eine Matrix, indem sie sie M-mal in der ersten Dimension zu wiederholen

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

I =

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

Wenn wir eine Matrix zu indizieren ein Array verwenden, werden die Matrixelemente nacheinander in dem Standard Matlab verwendet:

>> I(:)

ans =

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

Wenn schließlich ein Array indiziert, wertet die ‚Ende‘ Keyword an die Größe des Feldes in der entsprechenden Dimension. Als Ergebnis ist in dem Beispiel der folgenden äquivalent:

>> 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])

Es gibt eine Reshape () -Funktion, die Sie dies tun können ...

Zum Beispiel:

reshape(array, [64, 16])

Und Sie können ein großes Video-Tutorial hier

Prost

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top