Добавить строку в матрицу - PullRequest
19 голосов
/ 06 ноября 2011

у меня есть матрица A вроде

1 2 3 4 5
6 7 8 9 0

и я хочу дополнить его рядом, чтобы получить

1 1 1 1 1
1 2 3 4 5
6 7 8 9 0 

Я создаю ряд из них с

col_size = size(A, 2); 
ones_row = ones(1, col_size);

Как я могу добавить свой ones_row в матрицу?

Ответы [ 3 ]

39 голосов
/ 06 ноября 2011

Когда у вас есть A и ones_row, вы делаете:

[ones_row; A]

Это возвращает следующее.

1 1 1 1 1
1 2 3 4 5
6 7 8 9 0
2 голосов
/ 28 июня 2018

Я бы, вероятно, сделал это, как предложено в предыдущем ответе , однако в некоторых случаях (когда размеры матрицы становятся очень большими), более дружественным по отношению к памяти решением было бы предварительно выделить матрицу правильного размераи используйте индексирование, чтобы поместить существующие значения в правильное место:

A = [ 1 2 3 4 5; 6 7 8 9 0 ];
B = ones(size(A) + [1,0]); % Create an array of ones that is one row longer
B(2:end,:) = A;            % Replace the elements of B with elements from A

Причина, по которой я говорю, что это более дружественно к памяти, заключается в том, что когда мы создаем ряд единиц, нам нужно выделить память для вектора,и затем, когда мы конкатенируем, нам нужно выделить память снова для результата конкатенации.Когда мы используем индексирование, нет необходимости выделять промежуточный вектор.Это не очень важно в этом примере, но может быть весьма значительным для больших матриц или операций, выполняемых тысячи раз.


В Toolbox для обработки изображений также есть полезная функция - padarray:

A = [ 1 2 3 4 5; 6 7 8 9 0 ];
B = padarray(A,[1 0],1,'pre');
0 голосов
/ 28 июня 2018

Я могу дать решение, которое может работать для любой матрицы.

предположим, что ваша матрица A, A m*n

n = size(A,2)

out = [ones(1,n);A]

Это решение работает для любой матрицы.

...