So in this lecture we're going to talk
about for loops, while loops, and if-else
statements in matlab. The first thing I'm
going to talk about is the basic syntax
of a for loop. So the basic syntax of a
for loop is for i= some array
of numbers, so it can be anything.
So, for argument's sake i'm going to use
just a bunch of random numbers [1 3 5 4 10 7] and then
I'm just going to display them to the output.
Ok, so all that does is it sets i to
the first number for the first
iteratio, it sets i to the second
number for the second iteration, and so
on.
We've seen before that matlab can create
ranges with the colon though which is
probably a more common use of the for
loop, so you want to count from one to a
thousand or 1 to 10 and so the way you
would do that is for i=1:10
which actually in MATLAB is generating the
array 1 2 3 4 5 6 7 8 9 10. So I'm just going to
display(i) again and you can see that
it goes through every value of i.
So now that we have the basic for loop
syntax in matlab, what I want to do is go
through a little more complicated
example. You've heard of a concept called
the mean squared error. If you haven't
let me show it to you on Google. So the mean
squared error is if you're trying to
predict something you're going to have
some error for all the data points
between the true values and the
predicted values, and so the mean squared error
basically takes the difference between
your prediction and the actual value
squares them all,
sums them together, and divides it by
the number of points. So you can see
how we might be able to use for loops to
implement that. So now since we don't
have any data or any error
we're just going to pretend that we do.
So I'm going to use the rand and
function to create an array of size 1000
by one, these error points are going to
be normally distributed which is often
an assumption that we make any way with
statistical models.
Ok, so now I have a 1000 length array of
errors which represents the difference
so i don't have to calculate the
difference in this equation, and so now
we can go ahead and calculate the error.
So the first thing we want is the sum of
square error, right, so that's just the sum of
all the individual elements. So I can do
that by first initializing the sum of
squared error to zero, and I'm going to
do a for loop from 1 to 1,000 to accumulate
the sum of squared error being a square of each
individual error.
Ok, and so now that I have the sum of
squared error I'm going to divide that by 1,000
to give me the mean squared error.
So one thing to note about MATLAB is
that for loops, while loops and if
statements are actually very inefficient,
so you don't want to use them unless you
absolutely have to, and so I want to
demonstrate how that is the case. So we
have this mean squared error example,
I've pre-written the code, and I use a
statement called tick and talk to time
how long it takes. So you basically you
start your code with tic, you put all
your actual code after that, and then you
put a talk at the end and then it will
tell you the elapsed time it took to run
that code. So I've already pre written it
so i'm going to paste it out here, tic
t-i-c, toc t-o-c, ok. So that took
.005668 seconds. Now if we look
again carefully at the mean squared
error we notice that we want to square
each element and then sum them all
together, and so that sounds a lot like
the dot product, right. So if you take the
dot product of a vector with itself
you're just squaring each element and
then summing them altogether. So
if I wanted to do the mean squared error
equation in a more compact way, what I
might want to do is the dot product
between e and itself which is e
transpose times e as a matrix and then divided by
a thousand, right, and so that gives us the
same answer as before, and so if I put a
tic and a toc around that I get
.002896 seconds. So it's significantly
faster than using a for loop.
Ok, so that's for loops, now we're going
to talk about if statements. So what I
want to do is I want to visit I want to
revisit the is even problem that we
talked about in an earlier tutorial. So
if you recall what I did was I created a
function that returns one for all the
entries of X that are even and return 0
otherwise.
So you could do this with if statements
let's say X = 1:10,
alright and we want to say Y is
initialized to a an array of zeros, and
we will do for i=1:10 if mod(x(i),2)
== 0 then x is even, right.
So, that means we're going to set Y(i) = 1;
else Y(i) = 0. So we don't really
need that else since Y(i) is already 0,
but I'm including it so you know what an else
looks like. Okay, so now if we look at Y
has the ones where we expect it which is
where x is even. Ok, so now let's do a
similar example also using for loops and
if statements. So the example is the
problem is let's say I want to sum all
the elements of an array that are
divisible by 3, so let's just use the
same X as before, let's reinitialize Y
to all zeros,
sorry we don't even need to do
that, let's set S = 0;
and so now I'm going to loop through all
X's again for i=1:10. So if
mod(X(i),3 == 0
so if it's divisible by 3 we want
to sum that element. S = S
+ X(i); and now this time we're not
going to include the else. So is 18
which is equal to 3 + 6 + 9 which
we expect so that's the correct answer.
Now of course there is another way to do
this, so if you only want to look at the
elements in X so notice how whenever we
use i we're actually saying x(i) we can
just do this for x=X
right because the little x is going to
just go through every element in the big
X.
We were going to start again so we're
going to reinitialize S = 0, say for x=X,
if mod(x,3) ==0,
S = S + x; end. So if we
look at sum again we still get 18. So
now let's look at another problem.
So suppose we want to find an element
within a matrix. So suppose again we have
the same X and I want to find the number
8, so I can use a while loop for that.
So I can say I can set a variable
called found = 0 meaning false,
and then I can say while not found, so
I'm going to initialize an index i = 0,
gonna say while ~found,
i = i + 1 if X(i) == 8
which is the thing I'm looking for.
disp('I found it\n'); end
Ok, so I made a little mistake there we
went out of bounds because i went to 11
and the size of X is only 10, so what we
did was we forgot to set found to true
after we found x(i) == 8. So I'm going
to reset this code, i = i + 1 if
X(i) == 8, disp('I found it!');
set found to true found = 1; now end the if statement,
right. So now we go up to 8, printout
i found it, and then we quit the while loop. So
while loops only go until the condition
after the while is false, so it will
continue to go while it's true, and then
when it's false it will stop. Another way
we could do this though is we could
again use a for loop. So generally
speaking
whenever you can use a while loop you
can also use a for loop, it's just the
syntax that will change and a little bit
of the structure of the code. Suppose I
want to look through all of X again, so I
want to say if X(i) == 8
disp('I found it!')
So now this works but there's a problem
right because in the original while loop
we would only go up to 8 and then we
would quit, versus this for loop goes from 1
to 10 so that's inefficient because it's
doing extra steps. So what we can do to
avoid that is use the break statement. So
just to prove to you that it works i'm
going to print out for i=1:10
so again if X(i) == 8
disp('I found it!'); break; and so
now you see I only goes up to 8. It
finds 8, it breaks, and then it doesn't
go to 9 and 10.