Построение матрицы путем объединения одного и того же вектора-строки несколько раз

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

x = [1 2 2 3];

а потом на основе x хочу построить матрицу m = [1 2 2 3; 1 2 2 3; 1 2 2 3; 1 2 2 3]


person Simon    schedule 31.07.2011    source источник


Ответы (2)


Вы ищете функцию REPMAT:

x = [1 2 2 3];
m = repmat(x,4,1);

Вы также можете использовать индексацию для повторения строк:

m = x(ones(4,1),:);

или даже внешний продукт:

m = ones(4,1)*x;

а также с помощью BSXFUN:

m = bsxfun(@times, x, ones(4,1))
person Amro    schedule 31.07.2011
comment
а если я хочу построить m = [1 2 2 3; 2 4 4 6; 3 6 6 9] ? - person Simon; 31.07.2011
comment
используйте решение BSXFUN: m = bsxfun(@times, x, (1:3)') - person Amro; 31.07.2011
comment
Если я правильно помню, использование индексации быстрее, чем использование repmat. Но и гораздо менее читабелен. - person MarkV; 31.07.2011

Вы можете попробовать использовать vertcat, например:

x = [1 2 2 3];
m = vertcat(x,x,x,x);

Или даже просто:

x = [1 2 2 3];
m = [x;x;x;x];

РЕДАКТИРОВАТЬ:

для кратных x вы можете сделать:

x = [1 2 2 3];
m = [x;2*x;3*x];  %  [1 2 2 3; 2 4 4 6; 3 6 6 9]

РЕДАКТИРОВАТЬ2:

Для произвольного числа x в m...

n = 3; % number of repetitions...
x = [1 2 2 3];
m = [];
for i=1:n
    m = [m;x];
end
person Richard Inglis    schedule 31.07.2011
comment
проблема в том, что я хочу передать аргумент с количеством кратных. Я хочу сделать это внутри цикла for, и количество раз для объединения необработанных векторов не определено. - person Simon; 31.07.2011
comment
Ах, вы не упомянули об этом в своем вопросе... (я отредактировал свой ответ) - person Richard Inglis; 31.07.2011