Comment convertir une matrice 2X2 en matrice 4X4 dans MATLAB?
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?
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