Matlab中的范围选择

时间:2017-07-07 09:57:16

标签: matlab matrix

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

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

结果:

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

然后我跑:

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

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

3 个答案:

答案 0 :(得分: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

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

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

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

idx = zeros(size(c));
idx(1:3,:) = c(1:3,:)<17;
c(idx==1) = 0

答案 1 :(得分:2)

使用从两个条件构建的logical index:element小于阈值,行索引在目标行集合内。

th = 17;                                                  % threshold
rows = [1 2 3];                                           % target rows
ind = bsxfun(@and, c<th, ismember(1:size(c,1), rows).');  % logical index 
c(ind) = 0;                                               % set entries to 0

为您的示例输入

c = [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]

这给出了

c =
    22    26     0     0     0     0
    38    82    90    42    59     0
    58    98    87    31    47    31
    25    73    81    16    69    53
    29    34    26    17    69    65
    61    58    59    42    63    40

答案 2 :(得分:0)

这是另一种将矩阵与逻辑掩码相乘的方法:

c(1:3,:) = c(1:3,:) .* c(1:3,:) >= 17;