2015-04-13 4 views
3

У меня есть переменная A размера m от n. Я хочу сгенерировать B размером m по m*n, например, пример. Пример:Повторите каждую строку матрицы

A = [1 2 3; 
    4 5 6; 
    7 8 9] 

Если результат с

B = [1 2 3 4 5 6 7 8 9; 
    1 2 3 4 5 6 7 8 9; 
    1 2 3 4 5 6 7 8 9] 

Есть ли способ сделать это без использования цикла? m и n является переменной.

ответ

4

Repmat действительно путь здесь, как уже упоминалось @ Nerea. Это решение должно дать тот же ответ, как и его, но лично я считаю, что это будет немного более элегантно:

B=repmat(reshape(A',1,[]),size(A,1),1); 
6

Вы должны использовать repmat Matlab Funtion:

B = repmat(A,M,N) создает большую матрицу В, состоящих из MN матрицы с размерностью черепицы копий A. Размер B составляет [size(A,1)*M, size(A,2)*N]. Заявление repmat(A,N) создает N -by- N плитки.

Для вашего конкретного случая одно решение может быть:

A=A'; 
B=repmat(A(:)',3,1); 

И в общем случае одно решение может быть:

A_aux=reshape(A',1,size(A,1)*size(A,2)); 
B=repmat(A_aux,size(A,1),1); 
+0

Repmat, кажется правильным, но перенося и формирование матрицы как вектор кажется нежелательным. Рассмотрим случай, когда «A = rand (2)», и подумайте над тем, какой должен быть результат. –

+1

Я сформировал матрицу как вектор, потому что я думаю, что @ Meher81 хочет, чтобы матрица B, содержащая матрицу A, была расширена, как вектор в каждой из его строк. –

+0

Я действительно неправильно истолковал вопрос, однако я думаю, что в вашем решении была небольшая ошибка (вывод был бы только 1 столбец), поэтому я позволил обновить этот ответ и слить в некоторые свои элементы. --- Я не уверен, что вы отменили мое редактирование специально, но не забудьте проверить его. –

3

Нет repmat s

[m n] = size(A); 
B = ones(m,1) * reshape(A.', 1, []); 
4

Чтобы включить довольно быстро bsxfun решения:

A = [1 2 3 4; 
    5 6 7 8; 
    9 10 11 12] 

A = A.' %' 
B = bsxfun(@plus,zeros(size(A,2),1),A(:).') 

или использовать kron, но, конечно, медленнее:

A = A.' 
B = kron(A(:),ones(1,size(A,2))).' 

B = 

    1  2  3  4  5  6  7  8  9 10 11 12 
    1  2  3  4  5  6  7  8  9 10 11 12 
    1  2  3  4  5  6  7  8  9 10 11 12 
+1

'bsxfun' так много! – Shai

+3

Вы получаете вешалку 'bsxfun'! :-) –

0

Один подход с repmat, reshape и permute комбо!

out = repmat(reshape(permute(A,[3 2 1]),1,[]),size(A,1),1,1); 

или Другой подход без reshape но становится 2 лайнера

out1 = permute(A,[3 2 1]); 
out = repmat(out1(:).',size(A,1),1,1); 
Смежные вопросы