Как преобразовать матрицу 2X2 в матрицу 4X4 в MATLAB?

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

A = [2 6;
     8 4]

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

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

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


person anubhav    schedule 29.10.2009    source источник


Ответы (7)


В более новых версиях 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
person gnovice    schedule 29.10.2009
comment
короче, хотя для обобщения на большие матрицы есть ненужное умножение, которое может замедлить работу. - person Jason S; 29.10.2009
comment
@Jason S: Верно, но для больших матриц вам также придется проделать немного больше работы по созданию индексов, необходимых для других решений здесь. - person gnovice; 29.10.2009

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

B = A([1 1 2 2], :);  % replicate the rows
B = B(:, [1 1 2 2]);  % replicate the columns
person Martijn    schedule 29.10.2009
comment
Однострочник: A = [2 6; 8 4]; В = А([1 1 2 2], [1 1 2 2]); - person las3rjock; 29.10.2009

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

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

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

person Edric    schedule 29.10.2009
comment
это странно! каким-то образом ключевое слово end знает о матрице A, даже если это аргумент для ceil(). Я понятия не имею, как это работает, но это работает. - person Jason S; 29.10.2009
comment
Я тоже не знаю, как это делается, но это удобно! - person Edric; 29.10.2009
comment
сумасшедшее, уродливое и самое красивое решение одновременно - person Mikhail; 30.10.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]);
person las3rjock    schedule 29.10.2009
comment
будет ли это работать для любой общей матрицы 2X2 или только для этой матрицы 2X2. - person anubhav; 29.10.2009

Вот метод, основанный на простом индексировании, который работает для произвольной матрицы. Мы хотим, чтобы каждый элемент был расширен до подматрицы 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])
person Wil Koenen    schedule 24.02.2011

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

Например:

reshape(array, [64, 16])

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

Ваше здоровье

person Anthony M. Powers    schedule 29.10.2009
comment
reshape для этого не подойдет — для этого требуется, чтобы входная и выходная матрицы имели одинаковое количество элементов. - person las3rjock; 29.10.2009
comment
спасибо за быстрый, но я думаю, что для изменения формы количество элементов не должно меняться. Здесь у меня есть матрица 2X2, т.е. 4 элемента, и я хочу сделать матрицу 4X4, поэтому 16 элементов. Никакие элементы не отличаются. Что делать? - person anubhav; 29.10.2009
comment
Вы хотите, чтобы процесс «Изменить форму» добавлял соответствующие данные элемента во вновь созданное пространство? - person Anthony M. Powers; 29.10.2009

person    schedule
comment
Ницца! Я думал, что должен быть какой-то способ сделать это с помощью repmat и замены столбцов и строк, но мой мозг все еще полусонный. - person las3rjock; 29.10.2009
comment
Решение от gnovice с использованием функции Kroneker KRON лучше - оно проще и понятнее - преднамеренное программирование - person Mikhail; 30.10.2009
comment
Мне больше нравится ответ Мартейна, но это только я. - person Jason S; 30.10.2009
comment
Что касается всех решений, основанных на индексировании, я предпочитаю решение Эдрика (это обобщенная форма редактирования las3rjock). - person gnovice; 30.10.2009
comment
Рассматриваемая математическая операция называется произведением Кронекера en.wikipedia.org/wiki/Kronecker_product. Решение gnovice делает именно это напрямую. Другие решения, какими бы умными они ни были, являются обходными путями. - person Mikhail; 30.10.2009
comment
Произведение Кронекера является более общим и допускает умножение. OP хотел воспроизвести матричные элементы, чтобы сформировать блочную матрицу. Документация функции KRON, ИМХО, сбивает с толку, и ее использование для этой цели менее понятно. Но мы можем согласиться не соглашаться. - person Jason S; 30.10.2009