我对Matlab很陌生,我想实现一个非常简单的操作:我有一个名为mg的792x1046 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
发布于 2015-07-07 12:29:10
你不应该在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(真或假),因此永远是<=110。所以它永远不会超过第二个,你的数组要么是1,要么是2。
编辑:虽然这个答案解释了你所面临的具体问题,但你可能应该使用逻辑索引,这比双for循环(在MATLAB中更惯用)要高效得多。请参阅@excaza或@Benoit_11中的答案以获得此方面的示例)。
发布于 2015-07-07 12:30:37
正如注释中所述,您需要在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;发布于 2015-07-07 12:31:13
您需要使用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的逻辑索引:
% 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;返回相同的矩阵。
https://stackoverflow.com/questions/31268316
复制相似问题