[MUSIC] We've been doing comparisons in
the conditions of if statement with expressions like x equals equals 2. The double equal is an example of
a so-called relational operator. Relational means the result depends
on the relation between the operands. This table lists all six
MATLAB's relational operators. We seen how to use these operators inside
if statements, what maybe surprising is that they can also be used outside
if statements and they produce values. Let's take a look at this other
way to use relational operators. Let's see. 10 double equals 20, answer equals 0. 3 double equals 35 minus 32, answer equals 1. In the first example,
we asked MATLAB to calculate the value of the expression 10 double equals 20 and
it told us that the value's 0. In MATLAB, when the operator double
equals finds that its first operand, like 10 is not equal to its
second operand, like 20. It returns the value zero,
which means false. In the second example,
we found that the value of the expression 3 double equals 35 minus 32 is 1, because 35 minus 32 is 3 and
so 3 double equals 3 is true. And when the double equals operator
finds that its first operand is equal to its second operand, it returns
the value one, which means true. In fact, every relational operator returns
zero when its expression is false and one when its expression is true. And when we say, zero and one,
we mean the numbers zero and one. Here's an example to drive home the fact that the result for relational operation is a number. In this expression, 16 times 64 ,which evaluates to 1,024 is greater than 1,000. So the relational expression in
parenthesis evaluates to one, which is true of course. We then add 9 to 1 and get 10. So the value of 16 times 64 greater
than a 1, 000 is a 1, a normal 1. The kind of one that you can do
arithmetic with not some special one that has some special sort of truthiness
attribute attached to it. The parentheses have
an important effect here. If we omit them,
we get a different answer. This time, the addition operator is
executed before the greater than operator. That happens, because the precedence of plus is higher
than the precedence of greater than. So this operation is carried out first. In fact, all the arithmetic
operators have a precedence than all the relational operators, we'll talk
more about this later in this lesson. So the result of the addition is 1,009,
but the value of the operand on
the left of the greater than sign, which as before is 1,024
is still greater than the value of the operand over
here on the right, 1,009. So the relational operator produces
the value one, which means true as before. Since nothing is added this time, the
result of the entire expression is one. Let's take a look at this
little function called if test, which helps us test what MATLAB considers
true and what it considers false. This function uses an if
statement to decide whether x, the input argument here is true or false. It's true, it prints it's true. If it's false, it prints it's false. Let's try calling with
a few different values. Well, zero is false and we knew that. Let's try it with ten. Ten is true, it's non-zero. What about minus 1? It's non-zero, but it is negative. Now, it's non-zero, so it's true. And one, well, we knew that was true too. What about this? That is a small number. I wonder if it's big enough to be true. It's awful close to zero, true. You can easily see the pattern. If it's zero, MATLAB takes it as false. For anything else be a negative integer or
not big or small. MATLAB takes it as true. Okay.
We're done with our if test function. No matter,
we don't need this stuff anymore. But we're not quite done
with relational operation, there's one important feature
that we need to look at. Relational operators work on arrays too. First, let's remember how
array operations work. Let's do array multiplication on two vectors, like this. MATLA applies the dot star operation
to each corresponding pair of elements. First, 4 times 5 gives 20. Here we go. 4 times 5 gives 20. And minus 1 times minus 8 gives 9. Minus 1 times minus 9 gives 9 and
so forth. And the resulting matrix is the same
size as the input matrices, which in this case were
five element row vectors. Now to replace the array multiplication
operator with the relational operator, the greater than, like this. As with the dot star array operator,
MATLAB applies a relational operation one by one to each
corresponding pair of elements. First, four greater than five gives zero. So here's the four greater
than five gives zero. Since four is not greater than five and
zero represents false. Then minus 1 greater than minus 9 gives 1. Since minus 1 Is greater than minus 9 and
so forth. And again, the resulting matrix is
the same size as the input matrices, five element rovector. As with the arithmetic array operators,
the upper ends of the relational operators must in fact, have the same
exact size, except for one special case. It's the same special case we saw
with the arithmetic array operators. And that's when one of the operands
is a scalar, like this. In that case, each element of the array in turn serves
as one operand of the relational operator. While the single scalar
serves as the other operand. And the results, an output array of
the same size as the input array. So, 4, less than or equal, 4 is evaluated,
which is true and gives 1. Then minus 1 is less than or equal 4 is
evaluated, that's true, that gives 1. Then 7 is less than or equal to 4,
which is false, gives 0, and so on. And the result is an output array that's
the same size as the input array. And finally, look at this tricky one. Can you see what we're doing here? We're counting the elements in
the vector that are equal to 14. As you can see,
there are two of them, here and here. And we got the right answer, 2. Can you see how this works? First, the argument of
the sum is evaluated. That's this thing in parenthesis here. It's an expression involving
a relational operator, double equals. It has its input, a vector and a scalar. As we've just seen,
the relational operator compares each element of the vector
in turn to the scalar. Since the relational operator is
a double equals, we'll get a one for each element, that is equal to 14 and
a zero everywhere else. Since there are two of them equal to 14,
we get two ones and four zeroes as our output. Now, you don't see that vector,
but you know it's there. That vector of two ones and four zeroes is
then sent to sum as its input argument. Sum adds them up and gets 2. And the overall effect is to count
the elements of the vector that are equal to 14. Cool, huh? This is a great example of Matlab
programming, a single line of code that does something that would take five or
six lines in most programming languages. And if you're a Matlab programmer,
this version is clearer too. Lets recap the subject of logical values
because it's a really important concept. If Matlab is asked to consider
a non zero input as logical, it'll interpret it as true. If MatLab is asked to consider
the input zero as logical, it will interpret that as false. And when MatLab outputs illogical faults,
it outputs the value zero. But when MatLab outputs a logical true,
it always outputs the value 1. Note that this means that you can give
any value to Matlab to be interpreted as logical. If you give it a value
that's neither zero nor one, say 98.6 or minus 30, that's fine. Matlab will treat it as true,
but it will always return one for true and zero for false. You may have thought about whether we can
combine multiple logical values somehow. Yes, we can, using logical operators. The table here shows
three logical operators. These are the operators that Matlab has,
and, or, and not. Two ampersands mean and. Two vertical bars mean or. And the single tilde means not. So how do they work? Not is a unary operator, meaning
that it takes only a single operand. It simply flips the value given to it. If you give it a true, it'll return false. If you give it a false, it'll return true. And and or are binary operators. They combine the value of two operands. The result of and is true if and
only if both of its operands are true. Otherwise, it's false. Or works the opposite way. The result of or is false, if and
only if, both of its operands are false. Otherwise, it's true. This table is called a truth table. It specifies how logical operators
work in a bit more formal manner. The four rows show all possible
combinations of input values. And there are two columns of outputs,
one for and and one for or, over there on the right. They show the result of the operator for
each input combination. And here's a version showing the inputs
from the standpoint of Matlab, where zero means fault and
non zero means true. As you can see, there's a 1,
which means true, in the and column, only when both
inputs are non-zero. And there's a 0 for false in the or
column, only when both inputs are 0. Now let's see some examples. Suppose we want a function
that takes three inputs and returns one of the following three values. A one, if its three inputs are in
increasing order, a minus one, if they are in decreasing order,
and a zero, otherwise. Well, we've already written a function
that does that, called order3, over here. Let's have a look at it. It uses an if, else if,
else statement with a logical and operator, here and here. And here's how it works. The first condition in the if else
if statement says, x less than or equal to y, ampersand ampersand,
y less than or equal to z. This double ampersand is the logical and
operator. As you may remember from the truth table,
this and operator returns true only if
both of its operand are true. This is the first operand,
x less than or equal to y. This is the second operand,
y less than or equal to z. So in this case, x has to be less than or
equal to y, and, and at the same time, y needs to be less than or equal to z
in order for this condition to be true. Notice how I use the word and to specify
what's happening here in English. It's not an accident that this
logical operator is called and. If you think about it, these two
conditions together mean that x, y, and z are in increasing order. Well, if you think about it a little more,
though, that's not precisely correct, because if x is equal to y,
then those two numbers aren't increasing. And if y is equal to z,
they're not increasing, either. But at least we know that
they're not decreasing. So to be more precise we should say that
x, y, and z are in non-decreasing order. And that's a thing,
by the way, non-decreasing. It's the precise mathematical description. Anyway, if they are non-decreasing,
the and operator returns true. The variable a is set to 1. The if else if else statement terminates,
and so does the function. And since the function
returns A as you can see up here then the function returns a 1. So that's what happens
if x is less than or equal to y, and
y is less than or equal to z. But if either of these relationships
is false, then the and is false and we take the else-if branch. It's condition is x greater than or equal
to y, and y greater than or equal to z. This condition is very similar to
the first condition the only difference is that the relations are reversed here. We still use the and operator. In this case, in order to get true,
x has to be greater than or equal to y, and y at the same time has to
be greater than or equal to z. If both of these relationships are true,
the and operation will return true and we know that the three numbers
are in nonincreasing order. In that case, A is set equal to minus 1. The if else if else statement
terminates and so does the function, and since it returns A,
the function returns a minus 1. Finally, if neither of
the two conditions is true. This one or this one,
we go to the else branch down here. This is the catch all case. The numbers are out of order, and for
that case, a is set equal to zero, and the function returns a zero. Okay, we've seen an example for
the and operator. Now lets see one for the or operator. Not smallest function. A job of not smallest, is to determine
whether it's first input argument is smaller than both of it's
other two input arguments. It it's not smaller than both of them, than it returns one,
meaning it's not the smallest. Hence, the name of the function. Otherwise, it returns 0. To do this, it uses an if l statement,
whose condition uses the or operator, which is symbolized by
this double vertical bar here. As you may remember from the truth table,
the or operator returns false only if
both its operands, are false. To put that another way,
it returns true if and only if one or
both of its operands are true. In this example, the first operand right here is the relational operation
x greater than or equal to y. And the second operand is the relational
operation, x greater than or equal to z. In English, this condition reads,
x greater than or equal to y or
x greater than or equal to z. And that makes sense,
because if x is greater than or equal to y or z, or both for
that matter, then it's not the smallest. In that case, the or
operator returns true. This statement is executed. A is assigned the value 1. And the function returns that 1. Otherwise, we skip to the else branch. A is assigned to value 0,
and the function returns 0. Well, let's try our functions. We'll do the last one first. Well, that makes sense. Three is not smaller than two and one. And that makes sense because minus
one is smaller than two and one. And finally, that looks good because
two is not smaller than two and one. Okay let's pull up our
order three function again. There it is. And we'll remember that it's supposed to
give a one if they're increasing order or more specifically non decreasing order. A minus one if they're decreasing or more specifically non increasing and
a zero otherwise. [NOISE] Well that looks good because
they're in non decreasing order. [SOUND] That's also good non-decreasing. [SOUND] Whoops. Picked the wrong function, but
MATLAB guessed what I wanted. So, we'll go with that. And that looks good These
are decreasing or more precisely, non increasing. [NOISE] Also non increasing and
let's do one out of order. [NOISE] I hesitated after that
parentheses to give MATLAB enough time to give me the hint that there
are three arguments for this function. [SOUND]. And the three arguments that I gave it
were out of order which means we should get a zero and we did get a zero. So it appears that both our
little functions are working. We've seen how to use logical operators,
and, and, or, inside if statements. Well, they can be used
outside of if statements too. In the same way, as we saw earlier,
that relational operators can. Let's clear the screen and look at some examples of logical
operators used in this way. [NOISE]. We'll just type some expressions
directly in to the command window. No surprises here. When both of the operands,
the and operator, are non-zero, which is equivalent to true, the operator
gives true in the form of the number one. But if either or both of the operands
are zero, which is equivalent to false, then the operator gives false
in the form of the number zero. Now let's give the same operands to the or
operator. Here again, we get what we would expect. When either or both of the operands
of the or operator are nonzero, which is equivalent to true, the operator
gives true in the form of the number one. But if both of the operands are zero,
which is equivalent to false, then the operator gives false
in the form of the number zero. Now, let's build a more
complicated expression and get the logical NOD operator involved too. [NOISE] Let's see why D is zero. Since both A and B are non zero,
they're both true. So, A and B is true too. Then when the not operator is applied
to that true, it's changed to false. The operation b and c is false, too, because c is false, as we can see here. So the or operator here,
is given two operands that are false. False, and false. So it gives fault in
the form of the number zero. That value of zero, is then assigned a d. Let's make one tiny change. We'll replace the second and
operator here by or. [SOUND] The result is
different because b or c, unlike b and c, gives a true value. That true value becomes the operand of
this first or, which then gives true. All really as we would expect. In fact, logical operators
tend to act well, logically. They do what you'd expect them to do. Because we're so
familiar with the concepts band and or. But as with the relational operators, it's a bit unexpected to find that they can
be mixed with the arithmetic operators. [SOUND] What happens here is that the expression in parenthesis is true. Because b is equal to 2 and
2 falls between 0 and 10. So the and operator gives 1. And then b is multiplied by 1 to get b,
which equals 2. Okay, as we said earlier, when we were mixing arithmetic
with relational operators, this shouldn't be surprising, because one
is well, you know, a 1 and 2 times 1 is 2. So why would you want to
mix arithmetic and logic? Well, suppose you wanted to add up
numbers that were between zero and ten? You could initialize your total like this. [SOUND] And
then every time you get a new value for b, you get at it like this. [SOUND] Five is greater than zero and less than ten, so it gets added in. [SOUND] The same holds for three. [NOISE] But 11 fails the test,
so 0 is added. So as you can see, b is added
only when it's inside the limits, just what we wanted to do. You can do the same thing
with an if statement, but it's simpler to just do
it in this one line. By the way, the parenthesis are important,
because the precedence of and, and also of or,
are lower than the arithmetic operators. And here we need and
to go before multiplication. In fact, the logical operators
are at the bottom of the list. Everything else goes first, as we'll see when we revisit
the precedence table in a few minutes. There's one last feature of logical
operators that we need to consider, they're used with arrays. We can see how it works with vectors,
so we'll start off with those. We'll start the the not operator. Let's get a clean slate. [SOUND]
There. Okay here's a nice vector. [SOUND] Now let's apply
the not operator to it. It changes true to false and vice versa. And that's what's happened here. The nonzero numbers 1 pi and
minus 2 represent true. So they're changed to faults
in the form of a zero. And the zero here is changed to a one. Since not operates on individual elements
in an array, it's an array operator. Now let's try the and
operator with arrays. [NOISE] Hm. Operands to the or and, and operators must
be convertible to logical scaler values. What does that mean? Well it means that the operands of
these operators have to be scalers. They can't be arrays. Well, it's time to reveal the MATLAB
actually has two versions of the logical operators. The versions you've not seen yet
are array operators. Here's what the array versions of and,
and or look like. First, let's get the original version and then we'll alter it,
then we'll alter that one. And there we have it. As you can see, there's a single ampersand
for and, and a single vertical bar for or. You might expect to see a dot show up in
the array versions of these operators. After all, for
the arithmetic operations multiply and divide as you remember, each array
version adds a dot to the operator. But for the array versions of and,
and or, there's only one ampersand for the and operator instead of two. And only one vertical bar for
the or operator, instead of two. These single symbol versions of
the operators work just fine with arrays, as long as there are two operands
have the same dimensions, which is the same rule as for
all array operators. And they work with scaler
array combinations too. [SOUND]. Here we can see that in
the first expression, two was ANDed with each one
the elements of the array. And in the second expression, two was
ORed with each element of the array. And lets get a little bit fancier. [SOUND] Before I hit return, can you figure out the answer? Spoiler alert,
I'm about to walk you through it. Okay. The first relational operator, 1.4 less
than the square root 2, will give true, since 1.4 is a little bit
less than the square root 2. Inside the vector over here, the first
element, which is the expression pi greater than 3, will be true,
since pi is indeed greater than 3. And the second element,
minus 1 greater than 1 is obviously false. So the elements of the vector are true and
false. Which in the land of MATLAB,
is one and zero. Now the true value from
this expression over here, 1.4 less than square root of 2
will be ANDed with the true and with the false elements of the vector,
to give true and false. Which in MATLAB land are one and zero. Okay time to hit return. And we get a vector with one and
zero as its elements. The order in which
the operators less than and ampersand are applied has
an important effect on the result. Let's check that by inserting extra
parentheses around the less than operator and its operands to force the less than
operation to go before the and operation. This operation before this one. Well, that's the same result we got
without the extra parentheses, because this order agrees with MATLAB's precedence
rules, as we'll see in a minute. Now, let's force the ampersand
to go before the less than. Here, we put parentheses around everything
over here after the less than right here, so that everything inside these
parentheses is done first, and then, fed in as the right hand
operand of the less than operation. And this is what we get. The expression inside
the parentheses that we added to the right produces the vector 0, 1. Yet again, the less than, which as we
learned earlier is an array operator, is applied to each one of those elements. Since 1.4 is not less than 0 or 1, the result is a couple of falses. In other words, a couple of 0's. Now that we've seen relational and
logical operators, it's time to revisit operator precedence,
which you may remember is the set of rules that governs the order
in which operations are executed. This precedence table shows that order. Lower numbers mean earlier execution. For example, relational operators at six
are executed before logical operators at seven, eight, nine, and ten. An addition at four is executed
before the colon operator at five. Remember that surprising
example a few lessons ago? Chances are, you're not going to
learn this table by heart. But you can get it any time you want it by
giving MATLAB the command Help Precedence. This is the table that shows up. It omits parentheses, but it's pretty easy to remember that
they outrank everything else. By the way,
when you're not sure about precedence, you should probably use parentheses
to force the order that you want, because it'll improve
the readability of your program. [MUSIC]