我是Matlab的新手,我希望实现一个非常简单的操作:我有一个名为mg的792 x 1046 uint8矩阵,并希望将其单元格值(从0到255)转换为1到4之间的值(1 ,2,3,4)在一个名为mgc的新矩阵中,相应于简单条件。
奇怪的是,新矩阵只填充了1s和2s,但没有任何3s或4s ......
这是我的代码:
[x,y]=size(mg);
mgc = zeros(x,y);
for i=1:x
for j=1:y
if (mg(i,j)<=100)
mgc(i,j)=1;
elseif (100<mg(i,j)<=110)
mgc(i,j)=2;
elseif (110<mg(i,j)<=120)
mgc(i,j)=3;
else
mgc(i,j)=4;
end
end
end
如果有人能帮我解决这个愚蠢的问题,那就太好了! THX
答案 0 :(得分:1)
你不应该在MATLAB中使用100<mg(i,j)<=110
等表达式。相反,请使用100<mg(i,j) && mg(i,j)<=110
。
目前,MATLAB正在将100<mg(i,j)<=110
表达式评估为(100<mg(i,j))<=110
。 (100<mg(i,j))
将为1或0(true或false),因此将始终为&lt; = 110。所以它永远不会超过第二个,你的数组都是1或2。
编辑:虽然这个答案解释了您所遇到的具体问题,但您可能应该使用逻辑索引,这比双循环(在MATLAB中更惯用)更有效。请参阅@excaza或@ Benoit_11的答案,了解其中的例子。
答案 1 :(得分:1)
如评论中所述,您需要在elseif
语句中使用逻辑运算符。您知道,您可以使用以下相同的逻辑运算符对整个for循环进行矢量化:
让我们像mgc2
一样定义mgc
:
mgc2 = zeros(x,y);
然后你可以这样填写mgc2
:
mgc2(mg<=100) =1;
mgc2(mg>100 & mg<=110) =2;
mgc2(mg>110 & mg <=120) =3;
mgc2(mg>120) =4;
答案 2 :(得分:1)
您需要使用and
运算符:
% Dummy data
mg = [10 115; 125 140];
[x,y]=size(mg);
mgc = zeros(x,y);
for i=1:x
for j=1:y
if (mg(i,j)<=100)
mgc(i,j)=1;
elseif (100 < mg(i,j) && mg(i,j) <= 110)
mgc(i,j)=2;
elseif (110 < mg(i,j) && mg(i,j) <= 120)
mgc(i,j)=3;
else
mgc(i,j)=4;
end
end
end
返回:
mgc =
1 3
4 4
你也不需要在这里使用循环,而是可以利用MATLAB的logical indexing代替:
% Dummy data
mg = [10 115; 125 140];
mgc = zeros(size(mg));
mgc(mg <= 100) = 1;
mgc((mg > 100 & mg <= 110)) = 2;
mgc((mg > 110 & mg <= 120)) = 3;
mgc(mg > 120) = 4;
返回相同的矩阵。
答案 3 :(得分:0)
这是因为对于第一个elseif语句,任何大于100的值都将返回true。 100&lt;我的(i,j)返回1.
答案 4 :(得分:0)
如果要执行双重条件,则必须使用&
运算符,否则可能会出现错误语句
>> x = 4
>> res = 2<x<=3
res =
1
%%Using the `&` operator instead
>> res = 2<x && x<=3
res =
0