Как преобразовать матрицу 2X2 в матрицу 4X4 в MATLAB? - PullRequest
4 голосов
/ 29 октября 2009

Мне нужна помощь в преобразовании матрицы 2X2 в матрицу 4X4 следующим образом:

A = [2 6;
     8 4]

должно стать:

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

Как бы я это сделал?

Ответы [ 7 ]

23 голосов
/ 29 октября 2009

В более новых версиях MATLAB (R2015a и новее) самый простой способ сделать это - использовать функцию repelem:

B = repelem(A, 2, 2);

Для более старых версий короткая альтернатива другим (в значительной степени) решениям, основанным на индексировании, состоит в использовании функций kron и 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
12 голосов
/ 29 октября 2009

Может быть сделано даже проще, чем решение Джейсона:

B = A([1 1 2 2], :);  % replicate the rows
B = B(:, [1 1 2 2]);  % replicate the columns
9 голосов
/ 29 октября 2009

Вот еще одно решение:

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

, который использует индексирование для всего и не зависит от размера или формы A.

4 голосов
/ 29 октября 2009

Это работает:

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

Это просто двумерная интерполяция ближайших соседей A (x, y) из x, y ∈ {1,2} в x, y ∈ {0.5, 1, 1.5, 2}.

Редактировать : Прыгая с решений Джейсона С и Мартина, я думаю, что это, вероятно, самое короткое и ясное решение:

A = [2 6; 8 4];
B = A([1 1 2 2], [1 1 2 2]);
2 голосов
/ 24 февраля 2011

Вот метод, основанный на простом индексировании, который работает для произвольной матрицы. Мы хотим, чтобы каждый элемент был расширен до подматрицы MxN:

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

Пример:

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

Чтобы увидеть, как работает метод, давайте подробнее рассмотрим индексирование. Начнем с простого вектора строки последовательных чисел

>> m=3; 1:m

ans =

     1     2     3

Далее мы расширяем его до матрицы, повторяя это M раз в первом измерении

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

I =

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

Если мы используем матрицу для индексации массива, то элементы матрицы используются последовательно в стандартном порядке Matlab:

>> I(:)

ans =

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

Наконец, при индексации массива ключевое слово 'end' оценивается по размеру массива в соответствующем измерении. В результате в примере следующие значения эквивалентны:

>> 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])
2 голосов
/ 29 октября 2009
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!
0 голосов
/ 29 октября 2009

Существует функция Reshape (), которая позволяет вам делать это ...

Например:

reshape(array, [64, 16])

И вы можете найти отличный видеоурок здесь

Приветствия

...