Matlab简单矩阵manip
我是Matlab新手,我想实现一个非常简单的操作:我有一个792x1046UINT8矩阵,名为mg,我想根据简单的条件将其单元格值(从0到255)转换为一个名为mgc的新矩阵中1到4(1,2,3,4)之间的值 奇怪的是,新矩阵中只填充了1和2,而没有任何3或4 这是我的密码:Matlab简单矩阵manip,matlab,if-statement,matrix,Matlab,If Statement,Matrix,我是Matlab新手,我想实现一个非常简单的操作:我有一个792x1046UINT8矩阵,名为mg,我想根据简单的条件将其单元格值(从0到255)转换为一个名为mgc的新矩阵中1到4(1,2,3,4)之间的值 奇怪的是,新矩阵中只填充了1和2,而没有任何3或4 这是我的密码: [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
[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
[x,y]=尺寸(mg);
mgc=零(x,y);
对于i=1:x
对于j=1:y
如果(mg(i,j)您不应该使用100之类的表达式,这是因为对于第一个elseif语句,任何大于100的值都将返回true。
100如果要执行双重条件,必须使用&
运算符,否则可能会出现错误的语句
>> x = 4
>> res = 2<x<=3
res =
1
%%Using the `&` operator instead
>> res = 2<x && x<=3
res =
0
>x=4
>>res=2 res=2如注释中所述,您需要在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;
mgc2(mg100&mg110&mg120)=4;
您需要使用和
运算符:
% 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
您也不需要在此处使用循环,而是可以利用MATLAB:
%虚拟数据
mg=[10115;125140];
mgc=零(尺寸(mg));
mgc(mg100&mg110&mg120)=4;
它返回相同的矩阵。您需要在elseif
语句中使用运算符。感谢您的回复HamtaroWarrior,我确信有大于110的值,因为矩阵来自我在Matlab上处理的图像…非常奇怪,事实上,excaza是对的,没有注意到您的条件中缺少运算符。对!不是f我第一次遇到这种情况,已经花了太多时间试图找出错误的地方,以至于我忘记了检查基础。谢谢你,excazaThx!你知道如何在3D矩阵中使用这种逻辑索引方法吗?不客气!实际上几乎是一样的!试着用一个小的3D矩阵,然后玩一下它;在德兴功能非常强大,您肯定会喜欢使用它:)
mgc =
1 3
4 4
% 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;