【问题标题】:Matlab simple matrix manipMatlab简单的矩阵操作
【发布时间】:2015-07-07 21:03:47
【问题描述】:

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

如果有人能帮我解决这个愚蠢的问题,那就太好了! 谢了

【问题讨论】:

  • 您需要在elseif 语句中使用and 运算符。
  • 感谢您的回复 HamtaroWarrior,我确信有大于 110 的值,因为矩阵来自我在 Matlab 上处理的图像......非常奇怪
  • 其实excaza是对的,没注意到你的条件缺少算子。
  • 正确!这不是第一次发生在我身上,已经花了很多时间试图找出错误在哪里,我忘了检查基础知识。谢谢你excaza

标签: matlab if-statement matrix


【解决方案1】:

您不应在 MATLAB 中使用 100&lt;mg(i,j)&lt;=110 等表达式。相反,请使用 100&lt;mg(i,j) &amp;&amp; mg(i,j)&lt;=110 之类的内容。

目前,MATLAB 将表达式 100&lt;mg(i,j)&lt;=110 计算为 (100&lt;mg(i,j))&lt;=110(100&lt;mg(i,j)) 将是一或零(真或假),因此总是


编辑:虽然这个答案解释了您遇到的具体问题,但您可能应该改用逻辑索引,这比双 for 循环更有效(在 MATLAB 中更惯用)。请参阅@excaza 或@Benoit_11 的答案以获取相关示例)。

【讨论】:

    【解决方案2】:

    如 cmets 中所述,您需要在 elseif 语句中使用逻辑运算符。如您所知,您可以使用以下相同的逻辑运算符对整个 for 循环进行矢量化:

    让我们像定义 mgc 一样定义 mgc2

    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;
    

    【讨论】:

    • 谢谢!您知道如何将这种逻辑索引方法与 3D 矩阵一起使用吗?
    • 不客气!其实这几乎是一样的!尝试使用一个小的 3D 矩阵并玩弄它;逻辑索引非常强大,您一定会喜欢使用它:)
    【解决方案3】:

    你需要使用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;
    

    返回相同的矩阵。

    【讨论】:

      【解决方案4】:

      这是因为任何大于 100 的值都会在第一个 elseif 语句中返回 true。 100

      【讨论】:

        【解决方案5】:

        当你想做一个双重条件时,你必须使用&amp;操作符否则你可能有错误的陈述

        >> x = 4
        
        >> res = 2<x<=3
        
        res =
        
             1
        
        %%Using the `&` operator instead 
        
        >> res = 2<x && x<=3
        
        res =
        
             0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-23
          • 2012-09-27
          • 2016-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-24
          相关资源
          最近更新 更多