Question

J'ai besoin d'aide pour convertir une matrice 2X2 en une matrice 4X4 de la manière suivante:

A = [2 6;
     8 4]

devrait devenir:

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

Comment ferais-je cela?

Était-ce utile?

La solution

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!

Autres conseils

Dans les versions les plus récentes de MATLAB (versions R2015a et ultérieure), la méthode la plus simple consiste à utiliser repelem fonction:

B = repelem(A, 2, 2);

Pour les versions plus anciennes, une solution de rechange aux solutions (largement) basées sur l'indexation consiste à utiliser les fonctions kron et ceux :

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

Peut être fait encore plus facilement que la solution de Jason:

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

Voici une autre solution:

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

qui utilise l'indexation pour tout faire et ne repose pas sur la taille ou la forme de A.

Ceci fonctionne:

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

Il s’agit d’une interpolation au plus proche voisin à deux dimensions de A (x, y) de x, y ? {1,2} à x, y ? {0.5, 1, 1.5, 2}.

Modifier : À propos des solutions proposées par Jason S et Martijn, je pense que cette solution est probablement la plus courte et la plus claire:

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

Voici une méthode basée sur une indexation simple qui fonctionne pour une matrice arbitraire. Nous voulons que chaque élément soit étendu à une sous-matrice MxN:

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

Exemple:

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

Pour voir comment la méthode fonctionne, examinons de plus près l'indexation. Nous commençons avec un simple vecteur ligne de nombres consécutifs

>> m=3; 1:m

ans =

     1     2     3

Ensuite, nous l'étendons à une matrice, en la répétant M fois dans la première dimension

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

I =

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

Si nous utilisons une matrice pour indexer un tableau, les éléments de la matrice sont utilisés consécutivement dans l'ordre standard de Matlab:

>> I(:)

ans =

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

Enfin, lors de l'indexation d'un tableau, le mot clé 'end' correspond à la taille du tableau dans la dimension correspondante. Par conséquent, dans l'exemple, les éléments suivants sont équivalents:

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

Il existe une fonction Reshape () qui vous permet de le faire ...

Par exemple:

reshape(array, [64, 16])

Et vous trouverez un excellent didacticiel vidéo ici

A bientôt

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top