У меня 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 или -1.
Это можно решить, сравнивая массив следующей формы с вашим вектором 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
который вернет логический массив, когда условие будет выполнено (при этом используется широковещательное неявное расширение AKA).
Если 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;
Небольшое дополнение, чтобы предотвратить возможные дополнительные вопросы от людей, использующих более старые версии MATLAB: неявное расширение доступно, начиная с MATLAB R2016b.
Ваша исходная матрица всегда заполнена нулями? Вы всегда заменяете единицами (или если нет - это какое-то постоянное значение)?