我定义了一个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的行,但结果对我来说似乎不对!任何想法?
答案 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;