Matlab中的范围选择

Sup*_*net 1 matlab matrix

我定义了一个6乘6的矩阵,并希望在某些范围内对值进行更改.

c = floor(rand(6,6) * 100)
Run Code Online (Sandbox Code Playgroud)

结果:

22    26    10     2     9     3
38    82    90    42    59     6
58    98    87    31    47    31
25    73    81    16    69    53
29    34    26    17    69    65
61    58    59    42    63    40
Run Code Online (Sandbox Code Playgroud)

然后我跑:

c(c(1:3,:)<17) = 0

22     0     0     2     9     3
38    82    90    42    59     6
58    98    87    31    47    31
25     0     0    16    69    53
29    34     0    17    69    65
61    58    59    42    63    40
Run Code Online (Sandbox Code Playgroud)

我想在1到3之间的行中生成小于17的行,但结果对我来说似乎不对!任何的想法?

DYE*_*YEZ 5

这不起作用,因为您从条件中获得线性索引,并且子矩阵的大小与原始索引的大小不同.您可以先获取下标,然后更改原始矩阵:

c = floor(rand(6,6) * 100)
c =

28    60    24    48    20    99
 0    78    34    80    38    70
49    11    54    37    66     8
98    57     6    51    75     4
73    87    41     9    17    49
31    68    23    90    51    44

[a,b]=find(c(1:3,:)<17);
c(sub2ind(size(c),a,b))=0
c =

28    60    24    48    20    99
 0    78    34    80    38    70
49     0    54    37    66     0
98    57     6    51    75     4
73    87    41     9    17    49
31    68    23    90    51    44
Run Code Online (Sandbox Code Playgroud)

请注意,如果你不从第一行或第一列开始,你应该考虑区别:

[a,b]=find(c(3:6,2:5)<17);
c(sub2ind(size(c),a+2,b+1))=0
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是创建用于替换的标记的掩码矩阵.这也适用于不从第一行或第一列开始的一般情况:

idx = zeros(size(c));
idx(1:3,:) = c(1:3,:)<17;
c(idx==1) = 0
Run Code Online (Sandbox Code Playgroud)

  • 好的解决方案(+1).您还可以在答案中添加可以首先构建用于替换的指标矩阵.这也适用于不从第一行或第一列开始的一般情况.`idx =零(size(c)); idx(1:3,:) = c(1:3,:)<17; c(idx == 1)= 0` (2认同)
  • 如果我理解正确,这会将包含所需条目的矩形归零,但也包括其他条目; 这不是OP想要的 (2认同)
  • 请注意,由于您接受了答案,因此无法将其删除.这是否意味着OP本身不确定他们的要求,或者由于示例数字而感到困惑,当然不确定; 除了删除之外的选项是要求OP编辑他们的帖子以澄清他们的需求,这可能与此答案一致,因为它被接受. (2认同)