Matlab简单矩阵操作

时间:2015-07-07 12:15:33

标签: matlab if-statement matrix

我是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

5 个答案:

答案 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