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;