使用逻辑 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
我是 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