2009-10-29 3 views

ответ

2
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

Ницца! Я думал, что должен быть какой-то способ сделать это с repmat и перестановкой столбцов и строк, но мой мозг все еще находится в полусмерти. – las3rjock

+0

Решение gnovice с использованием функции Kroneker KRON лучше - это более прямолинейно и понятно - «преднамеренное программирование» – Mikhail

+0

Мне нравится ответ Мартинна лучше, но это только я. –

-4

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

Например:

reshape(array, [64, 16]) 

И вы можете найти большое видео учебник here

Приветствия

+1

reshape не будет работать для этого - это требует, чтобы входные и выходные матрицы имели одинаковое количество элементов. – las3rjock

+0

спасибо за быстрый, но я думаю, что для изменения количества элементов не должно измениться. Здесь у меня есть матрица 2X2, то есть 4 элемента, и я хочу сделать матрицу 4X4 так 16 элементами. Нет элементов разных. Ват делать? – anubhav

+0

Желаете ли вы создать процесс Reshape для добавления соответствующих данных элемента во вновь созданное пространство? –

4

Эта работа:

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

Edit: Springboarding от Джейсона S и решений Мартейна, я думаю, что это, вероятно, самое короткое и ясное решение:

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

будет работать для любой общей матрицы 2X2 или только для этой матрицы 2X2. – anubhav

+0

Это будет работать для любой общей матрицы 2x2. – las3rjock

12

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

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

Однослойный: A = [2 6; 8 4]; B = A ([1 1 2 2], [1 1 2 2]); – las3rjock

9

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

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

который использует индексацию, чтобы сделать все, и не зависит от размера или формы А.

+4

Это странно! так или иначе ключевое слово «end» знает о матрице A, хотя это аргумент ceil(). Я понятия не имею, как это работает, но это так. –

+0

Я даже не знаю, как это делается, но это удобно! – Edric

+0

сумасшедшее, уродливое и самое красивое решение в то же время – Mikhail

23

В новых версиях 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 
+0

короче, хотя для обобщения больших матриц есть ненужное умножение, которое может замедлить работу. –

+0

@Jason S: Верно, но для больших матриц вам также придется немного поработать над созданием индексов, необходимых для других решений здесь. – gnovice

2

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

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

>> 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]) 
Смежные вопросы