14ya
14ya

Reputation: 27

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

I am new to matlab and I was wondering what it meant to use logical indexing/masking to extract data from a matrix.

I am trying to write a function that accepts a matrix and a user-inputted value to compute and display the total number of values in column 2 of the matrix that match with the user input.

The function itself should have no return value and will be called on later in another loop.

But besides all that hubbub, someone suggested that I use logical indexing/masking in this situation but never told me exactly what it was or how I could use it in my particular situation.

Upvotes: 0

Views: 2198

Answers (4)

Autonomous
Autonomous

Reputation: 9075

EDIT: since you updated the question, I am updating this answer a little.

Logical indexing is explained really well in this and this. In general, I doubt, if I can do a better job, given available time. However, I would try to connect your problem and logical indexing.

Lets declare an array A which has 2 columns. First column is index (as 1,2,3,...) and second column is its corresponding value, a random number.

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

You want to check what values in second column of A are equal to 3. Imagine as if you are making a query and MATLAB is giving you binary response, YES (1) or NO (0).

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

Now, for the indices where answer is YES, you want to extract the numbers in the first column of A. Then do some processing.

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.

Now, if you want to count total number of values, just do:

numValues=length(values);

I hope now logical indexing is clear to you. However, do read the Mathworks posts which I have mentioned earlier.


I over simplified the code, and wrote more code than required in order to explain things. It can be achieved in a single-liner:

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

Upvotes: 0

ShadowMan
ShadowMan

Reputation: 381

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

Upvotes: 0

rayryeng
rayryeng

Reputation: 104464

Logical indexing means to have a logical / Boolean matrix that is the same size as the matrix that you are considering. You would use this as input into the matrix you're considering, and any locations that are true would be part of the output. Any locations that are false are not part of the output. To perform logical indexing, you would need to use logical / Boolean operators or conditions to facilitate the selection of elements in your matrix.

Let's concentrate on vectors as it's the easiest to deal with. Let's say we had the following vector:

>> A = 1:9

A =

     1     2     3     4     5     6     7     8     9

Let's say I wanted to retrieve all values that are 5 or more. The logical condition for this would be A >= 5. We want to retrieve all values in A that are greater than or equal to 5. Therefore, if we did A >= 5, we get a logical vector which tells us which values in A satisfy the above condition:

>> A >= 5

ans =

     0     0     0     0     1     1     1     1     1

This certainly tells us where in A the condition is satisfied. The last step would be to use this as input into A:

>> B = A(A >= 5)

B =

     5     6     7     8     9

Cool! As you can see, there isn't a need for a for loop to help us select out elements that satisfy a condition. Let's go a step further. What if I want to find all even values of A? This would mean that if we divide by 2, the remainder would be zero, or mod(A,2) == 0. Let's extract out those elements:

>> C = A(mod(A,2) == 0)

C =

     2     4     6     8

Nice! So let's go back to your question. Given your matrix A, let's extract out column 2.

>> col = A(:,2)

Now, we want to check to see if any of column #2 is equal to a certain value. Well we can generate a logical indexing array for that. Let's try with the value of 3:

>> ind = col == 3;

Now you'll have a logical vector that tells you which locations are equal to 3. If you want to determine how many are equal to 3, you just have to sum up the values:

>> s = sum(ind);

That's it! s contains how many values were equal to 3. Now, if you wanted to write a function that only displayed how many values were equal to some user defined input and displayed this event, you can do something like this:

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

Quite simply, we extract the second column of A and see how many values are equal to val. This produces a logical array, and we simply sum up how many 1s there are. This would give you the total number of elements that are equal to val.


Troy Haskin pointed you to a very nice link that talks about logical indexing in more detail: http://www.mathworks.com/help/matlab/math/matrix-indexing.html?refresh=true#bq7eg38. Read that for more details on how to master logical indexing.


Good luck!

Upvotes: 0

R. Schifini
R. Schifini

Reputation: 9313

I'll give you an example that may illustrate what logical indexing is about:

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

using logical indexing you could filter elements that fullfil a certain condition

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

you could also perform alterations to only those elements:

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

will result in "array" equal to

[0 0 100 0 100 0]

Upvotes: 0

Related Questions