使用逻辑 indexing/masking 从矩阵中提取数据是什么意思? (MATLAB)

What does it mean to use logical indexing/masking to extract data from a matrix? (MATLAB)

我是 matlab 的新手,我想知道使用逻辑 indexing/masking 从矩阵中提取数据是什么意思。

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

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

但除了那些喧嚣之外,有人建议我在这种情况下使用逻辑 indexing/masking 但从未告诉我它到底是什么或者我如何在我的特定情况下使用它。

编辑:由于您更新了问题,我正在更新这个答案。

this and this 中对逻辑索引的解释非常好。总的来说,我怀疑如果有可用的时间,我是否能做得更好。但是,我会尝试将您的问题与逻辑索引联系起来。

让我们声明一个有 2 列的数组 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?

现在,对于answer为YES的索引,你想提取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)

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

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;

将导致 "array" 等于

[0 0 100 0 100 0]

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

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

>> A = 1:9

A =

     1     2     3     4     5     6     7     8     9

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

>> 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 循环来帮助我们 select 找出满足条件的元素。让我们更进一步。如果我想找到 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 向您指出了一个非常好的 link,其中更详细地讨论了 logical 索引:http://www.mathworks.com/help/matlab/math/matrix-indexing.html?refresh=true#bq7eg38。阅读这篇文章,了解有关如何掌握 logical 索引的更多详细信息。


祝你好运!

%% 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