从某行开始逐列替换值

时间:2019-05-21 10:10:19

标签: matlab matrix multidimensional-array replace vectorization

我有一个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 个答案:

答案 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;