Заменить значения из определенной строки по столбцам - PullRequest
1 голос
/ 21 мая 2019

У меня есть 10x5 двойная матрица mat. У меня также есть 1x5 вектор строки start_rows. В mat я хотел бы заменить все числа из определенных строк, используя start_rows. Я мог бы использовать цикл и заменить все числа столбец за столбцом. Однако я уверен, что есть какое-то векторизованное решение.

mat = nan(10, 5);
start_rows = [3,5,1,7,2];

% How to avoid that loop
for idx = 1 : numel(start_rows)
    mat(start_rows(idx):end, idx) = 1;
end

1 Ответ

2 голосов
/ 21 мая 2019

Эту проблему можно решить, сравнив массив следующей формы с вашим start_rows вектором:

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

, который будет возвращать логический массив для выполнения условия (используется неявное расширение широковещательной АКА).


Если mat всегда содержит нули, и вы заменяете их нулями:

(1:size(mat,1)).'+ mat >= start_rows;

Если mat отлично от нуля:

(1:size(mat,1)).'+ 0*mat >= start_rows;             % option 1
(1:size(mat,1)).'+ zeros(size(mat)) >= start_rows;  % option 2

При замене на значения, отличные от 1 (или true):

((1:size(mat,1)).'+ 0*mat >= start_rows) * newVal;
...