我有一个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
答案 0 :(得分:2)
可以通过将以下形式的数组与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:
(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;