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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top