MATLAB supports the use of logical masking in order to perform selection on a matrix without the use of for loops or if statements.
A logical mask is defined as a matrix composed of only 1
and 0
.
For example:
mask = [1 0 0; 0 1 0; 0 0 1];
is a logical matrix representing the identity matrix.
We can generate a logical mask using a predicate to query a matrix.
A = [1 2 3; 4 5 6; 7 8 9];
B = A > 4;
We first create a 3x3 matrix, A
, containing the numbers 1 through 9. We then query A
for values that are greater than 4 and store the result in a new matrix called B
.
B
is a logical matrix of the form:
B = [0 0 0
0 1 1
1 1 1]
Or 1
when the predicate A > 4
was true. And 0
when it was false.
We can use logical matrices to access elements of a matrix. If a logical matrix is used to select elements, indices where a 1
appear in the logical matrix will be selected in the matrix you are selecting from.
Using the same B
from above, we could do the following:
C = [0 0 0; 0 0 0; 0 0 0];
C(B) = 5;
This would select all of the elements of C
where B
has a 1
in that index. Those indices in C
are then set to 5
.
Our C
now looks like:
C = [0 0 0
0 5 5
5 5 5]
We can reduce complicated code blocks containing if
and for
by using logical masks.
Take the non-vectorized code:
A = [1 3 5; 7 9 11; 11 9 7];
for j = 1:length(A)
if A(j) > 5
A(j) = A(j) - 2;
end
end
This can be shortened using logical masking to the following code:
A = [1 3 5; 7 9 11; 11 9 7];
B = A > 5;
A(B) = A(B) - 2;
Or even shorter:
A = [1 3 5; 7 9 11; 11 9 7];
A(A > 5) = A(A > 5) - 2;