Como faço para converter uma matriz 2X2 a matriz 4x4 em MATLAB?
Pergunta
Preciso de ajuda na conversão de uma matriz 2X2 a uma matriz 4X4 da seguinte maneira:
A = [2 6;
8 4]
deve tornar-se:
B = [2 2 6 6;
2 2 6 6;
8 8 4 4;
8 8 4 4]
Como eu faria isso?
Solução
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!
Outras dicas
Em versões mais recentes do MATLAB (R2015a e mais tarde) a maneira mais fácil de fazer isso é usando o repelem
função:
B = repelem(A, 2, 2);
Para versões mais antigas, a uma curta alternativa para os outros (em grande parte) soluções baseadas em indexação é usar as funções kron
e 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
Pode ser feito ainda mais fácil do que a solução de Jason:
B = A([1 1 2 2], :); % replicate the rows
B = B(:, [1 1 2 2]); % replicate the columns
Aqui está mais uma solução:
A = [2 6; 8 4];
B = A( ceil( 0.5:0.5:end ), ceil( 0.5:0.5:end ) );
que usa indexação para fazer tudo e não depende do tamanho ou forma de um.
Isso funciona:
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');
Esta é apenas bidimensional interpolação de vizinho mais próximo de A (x, y) a partir de x, y ? {1,2} para x, y ? {0,5, 1, 1,5, 2}.
Editar : Springboarding off de soluções de Martijn Jason S e, penso que esta é provavelmente a solução mais curto e mais claro:
A = [2 6; 8 4];
B = A([1 1 2 2], [1 1 2 2]);
Aqui está um método baseado na indexação simples que funciona para uma matriz arbitrária. Queremos que cada elemento a ser expandido para uma submatriz MXN:
A(repmat(1:end,[M 1]),repmat(1:end,[N 1]))
Exemplo:
>> 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
Para ver como o método funciona, vamos dar uma olhada mais de perto a indexação. Começamos com um vetor linha simples de números consecutivos
>> m=3; 1:m
ans =
1 2 3
Em seguida, estendê-lo para uma matriz, repetindo-M vezes na primeira dimensão
>> M=4; I=repmat(1:m,[M 1])
I =
1 2 3
1 2 3
1 2 3
1 2 3
Se usarmos uma matriz para indexar uma matriz, em seguida, os elementos de matriz são usados ??consecutivamente na ordem Matlab padrão:
>> I(:)
ans =
1
1
1
1
2
2
2
2
3
3
3
3
Finalmente, ao indexar uma matriz, avalia-chave o 'fim' para o tamanho da matriz na dimensão correspondente. Como resultado, no exemplo a seguir são equivalentes:
>> 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])
Há uma função Reshape () que permite que você faça isso ...
Por exemplo:
reshape(array, [64, 16])
E você pode encontrar um grande vídeo tutorial aqui
Felicidades