【问题标题】:What does it mean to use logical indexing/masking to extract data from a matrix? (MATLAB)使用逻辑索引/屏蔽从矩阵中提取数据意味着什么? (MATLAB)
【发布时间】:2015-04-14 03:08:58
【问题描述】:

我是 matlab 新手,我想知道使用逻辑索引/屏蔽从矩阵中提取数据意味着什么。

我正在尝试编写一个接受矩阵和用户输入值的函数,以计算和显示矩阵第 2 列中与用​​户输入匹配的值的总数。

函数本身应该没有返回值,稍后将在另一个循环中调用。

但除了那些喧嚣之外,有人建议我在这种情况下使用逻辑索引/屏蔽,但从未告诉我它究竟是什么或如何在我的特定情况下使用它。

【问题讨论】:

  • The Mathworks 的logical indexing examples 是一个很好的介绍(虽然简洁)。而这个blog post 给出了一个很好的、具体的图像示例。
  • @14ya 是否有任何答案解决了您的疑惑?如果是,请点击答案左侧的复选标记接受。

标签: matlab function matrix user-input logical-operators


【解决方案1】:

编辑:既然你更新了问题,我正在更新这个答案。

thisthis 中对逻辑索引进行了很好的解释。总的来说,我怀疑,如果有时间的话,我是否能做得更好。但是,我会尝试将您的问题与逻辑索引联系起来。

让我们声明一个数组A,它有两列。第一列是索引(如1,2,3,...),第二列是它的对应值,一个随机数。

A(:,1)=1:10;
A(:,2)=randi(5,[10 1]); //declares a 10x1 array and puts it into second column of A
userInputtedValue=3; //self-explanatory

您想检查 A 的第二列中的哪些值等于 3。想象一下,如果您正在进行查询,而 MATLAB 正在给您二进制响应,是 (1) 或否 (0)。

q=A(:,2)==3 //the query, what values in second column of A equal 3?

现在,对于答案为“是”的索引,您要提取 A 的第一列中的数字。然后进行一些处理。

values=A(q,2); //only those elements will be extracted: 1. which lie in the 
              //second column of A AND where q takes value 1.

现在,如果您想计算值的总数,只需执行以下操作:

numValues=length(values);

我希望您现在对逻辑索引很清楚。但是,请阅读我之前提到的 Mathworks 帖子。


我过度简化了代码,并编写了比需要更多的代码来解释事情。它可以在单行中实现:

sum(mat(:,2)==userInputtedValue)

【讨论】:

    【解决方案2】:

    我会给你一个例子来说明什么是逻辑索引:

    array = [1 2 3 0 4 2];
    array > 2
    ans:  [0 0 1 0 1 0]
    

    使用逻辑索引,您可以过滤满足特定条件的元素

    array(array>2)  will give:  [3 4]
    

    您也可以仅对这些元素进行更改:

    array(array>2) = 100;
    array(array<=2) = 0;
    

    将导致“数组”等于

    [0 0 100 0 100 0]
    

    【讨论】:

      【解决方案3】:

      逻辑索引意味着拥有一个与您正在考虑的矩阵大小相同的logical / 布尔矩阵。您可以将其用作您正在考虑的矩阵的输入,并且true 的任何位置都将成为输出的一部分。 false 的任何位置都不是输出的一部分。要执行logical 索引,您需要使用logical / 布尔运算符或条件来方便选择矩阵中的元素。

      让我们专注于向量,因为它是最容易处理的。假设我们有以下向量:

      >> A = 1:9
      
      A =
      
           1     2     3     4     5     6     7     8     9
      

      假设我想检索所有大于或等于 5 的值。 logical 条件为 A &gt;= 5。我们要检索A 中大于或等于5 的所有值。因此,如果我们执行A &gt;= 5,我们会得到一个logical 向量,它告诉我们A 中的哪些值满足上述条件:

      >> A >= 5
      
      ans =
      
           0     0     0     0     1     1     1     1     1
      

      这肯定会告诉我们在A 的哪个位置满足条件。最后一步是将其用作A的输入:

      >> B = A(A >= 5)
      
      B =
      
           5     6     7     8     9
      

      酷!如您所见,不需要for 循环来帮助我们选择满足条件的元素。让我们更进一步。如果我想找到A 的所有偶数值怎么办?这意味着如果我们除以 2,余数将为零,即mod(A,2) == 0。让我们提取出这些元素:

      >> C = A(mod(A,2) == 0)
      
      C =
      
           2     4     6     8
      

      不错!所以让我们回到你的问题。给定您的矩阵A,让我们提取第 2 列。

      >> col = A(:,2)
      

      现在,我们要检查 #2 列中是否有任何一个等于某个值。那么我们可以为此生成一个logical 索引数组。让我们尝试使用 3 的值:

      >> ind = col == 3;
      

      现在您将有一个逻辑向量,告诉您哪些位置等于 3。如果您想确定 有多少 等于 3,您只需 sum 向上计算值:

      >> s = sum(ind);
      

      就是这样! s 包含多少个值等于 3。现在,如果您想编写一个函数,只显示多少个值等于某个用户定义的输入并显示此事件,您可以执行以下操作:

      function checkVal(A, val)
          disp(sum(A(:,2) == val));
      end
      

      很简单,我们提取A 的第二列,看看有多少值等于val。这会产生一个logical 数组,我们简单地总结一下有多少个 1。这将为您提供等于 val 的元素总数。


      Troy Haskin 向您指出了一个非常好的链接,该链接更详细地讨论了 logical 索引:http://www.mathworks.com/help/matlab/math/matrix-indexing.html?refresh=true#bq7eg38。阅读该文章以了解有关如何掌握 logical 索引的更多详细信息。


      祝你好运!

      【讨论】:

        【解决方案4】:
        %% M is your Matrix
        M = randi(10,4)
        %% Val is the value that you are seeking to find
        Val = 6
        %% Col is the value of the matrix column that you wish to find it in
        Col = 2
        
        %% r is a vector that has zeros in all positions except when the Matrix value equals the user input it equals 1
        r = M(:,Col)==Val
        %% We can now sum all the non-zero values in r to get the number of matches
        n = sum(r)
        
        
        M =
        
         4     2     2     5
         3     6     7     1
         4     4     1     6
         5     8     7     8
        
        
        Val =
        
         6
        
        
         Col =
        
         2
        
        
         r =
        
         0
         1
         0
         0
        
        
         n =
        
         1
        

        【讨论】:

          猜你喜欢
          • 2012-07-10
          • 2023-03-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多