Come posso convertire una matrice 2X2 in una matrice 4X4 in MATLAB?
Domanda
Ho bisogno di aiuto per convertire una matrice 2X2 in una matrice 4X4 nel modo seguente:
A = [2 6;
8 4]
dovrebbe diventare:
B = [2 2 6 6;
2 2 6 6;
8 8 4 4;
8 8 4 4]
Come lo farei?
Soluzione
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!
Altri suggerimenti
Nelle versioni più recenti di MATLAB (R2015a e successive) il modo più semplice per farlo è utilizzare repelem
funzione:
B = repelem(A, 2, 2);
Per le versioni precedenti, una breve alternativa alle altre (in gran parte) soluzioni basate sull'indicizzazione è utilizzare le funzioni kron
e quelli
:
>> 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
Può essere fatto anche più facilmente della soluzione di Jason:
B = A([1 1 2 2], :); % replicate the rows
B = B(:, [1 1 2 2]); % replicate the columns
Ecco un'altra soluzione:
A = [2 6; 8 4];
B = A( ceil( 0.5:0.5:end ), ceil( 0.5:0.5:end ) );
che utilizza l'indicizzazione per fare tutto e non dipende dalla dimensione o dalla forma di A.
Funziona:
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');
Questa è solo l'interpolazione bidimensionale del vicino più vicino di A (x, y) da x, y ? {1,2} a x, y ? {0,5, 1, 1,5, 2}.
Modifica : trampolino di lancio delle soluzioni di Jason S e Martijn, penso che questa sia probabilmente la soluzione più breve e chiara:
A = [2 6; 8 4];
B = A([1 1 2 2], [1 1 2 2]);
Ecco un metodo basato su una semplice indicizzazione che funziona per una matrice arbitraria. Vogliamo che ogni elemento sia espanso in una sottoscheda MxN:
A(repmat(1:end,[M 1]),repmat(1:end,[N 1]))
Esempio:
>> 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
Per vedere come funziona il metodo, diamo un'occhiata più da vicino all'indicizzazione. Iniziamo con un semplice vettore di righe di numeri consecutivi
>> m=3; 1:m
ans =
1 2 3
Successivamente, lo estendiamo a una matrice, ripetendolo M volte nella prima dimensione
>> M=4; I=repmat(1:m,[M 1])
I =
1 2 3
1 2 3
1 2 3
1 2 3
Se utilizziamo una matrice per indicizzare una matrice, gli elementi della matrice vengono utilizzati consecutivamente nell'ordine Matlab standard:
>> I(:)
ans =
1
1
1
1
2
2
2
2
3
3
3
3
Infine, quando si indicizza un array, la parola chiave 'end' valuta la dimensione dell'array nella dimensione corrispondente. Di conseguenza, nell'esempio sono equivalenti:
>> 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])
Esiste una funzione Reshape () che ti permette di farlo ...
Ad esempio:
reshape(array, [64, 16])
E puoi trovare un ottimo video tutorial qui
Saluti