【问题标题】:Replace values from a certain row onwards column-wise从某一行开始逐列替换值
【发布时间】:2019-10-07 17:05:57
【问题描述】:

我有一个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。

标签: matlab matrix multidimensional-array replace vectorization


【解决方案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 起隐式扩展可用。
猜你喜欢
  • 2017-09-24
  • 2019-12-13
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
相关资源
最近更新 更多