Loops in MATLAB
Many programming algorithms require iteration, that is, the repetitive execution of a block of program statements. Similar to other programming languages, MATLAB also has built-in tools for iterative tasks in codes.
For-loop
The for-loop is among the most useful MATLAB constructs. The general syntax of for-loop is,
for variable = expression
statements
end
Usually, expression
is a vector of the form istart:stepSize:iend
where fix((iend-istart)/stepSize+1)
gives the number of iterations requested by the user, assuming iend>istart
. The statements
are the set of programming tasks that have to be repeated. For example consider a script named runForLoop.m
,
for index = istart:stepSize:iend
disp(index);
end
disp( [ 'number of iterations: ', num2str( fix((iend-istart)/stepSize+1) ) ] );
>> istart = -2;
>> iend = 10;
>> stepSize = 3;
>> runForLoop
-2
1
4
7
10
number of iterations: 5
You can also iterate in reverse order,
>> istart = 10;
>> iend = -2;
>> stepSize = -3;
>> runForLoop
10
7
4
1
-2
number of iterations: 5
Breaking a for-loop immaturely
You can also use break
inside a for-loop to get out of it, even before the for-loop finishes the full number of iterations. This is specially useful when you want to ensure if a condition has happened, and if so, then terminate the for-loop. For example,
for integer = 1:10
disp(integer)
if (integer==5)
break
end
end
1
2
3
4
5
Exercise
suppose you want to find the largest prime number that is smaller than a given input value by the user. Write a function that does so, using for-loop, break
, and MATLAB’s intrinsic function isprime()
.
Answer
function integer = getPrime(upper)
if (upper<1)
disp('input value cannot be less than 1. Goodbye!')
return
end
for integer = upper:-1:1
if isprime(integer)
break
end
end
end
Continue statement within for-loops
To skip the rest of the instructions in a loop and begin the next iteration, you can use a continue
statement. For example, the following code prints only integers that are primes,
for integer = 1:10
if ~isprime(integer)
continue
end
disp(['prime detected! ',num2str(integer)])
end
prime detected! 2
prime detected! 3
prime detected! 5
prime detected! 7
Iterating over vectors, matrices, and cell using for-loops
Note that the index of for-loop must not necessarily be an integer. Basically you can use the for-loop index to iterate over anything that is iterable in MATLAB. For example, consider the following,
a = [1,0,2,3,7,-1];
for index = a
disp(class(index))
disp(index)
end
double
1
double
0
double
2
double
3
double
7
double
-1
However, see what happens if we defined a
as a matrix,
a = [1, 2, 3; 4, 5, 6; 7, 8, 9];
for index = a
disp(class(index))
disp(index)
end
double
1
4
7
double
2
5
8
double
3
6
9
What is happening here? The answer is that, MATLAB is a column-wise programming language, just like Fortran, and unlike C, C++ and all of their descendants. MATLAB, by default, iterates over elements of row vectors. Therefore, when you use a matrix as the iterator in for-loops, MATLAB considers an entire column as the index of for-loop. The same is also true for other multidimensional arrays in MATLAB, for example cell arrays,
a = {1, 2, 3; 4, 5, 6; 7, 8, 9};
for index = a
disp(class(index))
disp(index)
end
cell
[1]
[4]
[7]
cell
[2]
[5]
[8]
cell
[3]
[6]
[9]
Therefore, if you want to iterate over elements of a multidimensional matrix or array, you have to first reshape them using MATLAB’s built-in reshape()
function to convert them to vector format, then iterating over them. For example,
a = {1, 2, 3; 4, 5, 6; 7, 8, 9};
a = reshape(a,[1,9]);
for index = a
disp(class(index))
disp(index)
end
cell
[1]
cell
[4]
cell
[7]
cell
[2]
cell
[5]
cell
[8]
cell
[3]
cell
[6]
cell
[9]
Some general advice on for-loop index
-
Avoid using $i$ and $j$ as index variables in for-loops. Note that
i
andj
have special meanings in MATLAB, as described in previous notes. They are used to define complex numbers. Using these variable names as indices in MATLAB for-loops, would overwrite the default meaning of these variables. -
Avoid assigning a value to the index variable within the loop statements. The for statement overrides any changes made to index within the loop.
While-loop
There is another iteration construct in MATLAB, called while-loop which has the following general syntax,
while expression
statements
end
The statements
within the while-loop are executed as long as expression
is true. For example,
x = realmax();
while x>0
xmin = x
x = log(x)
end
xmin
xmin =
1.7977e+308
x =
709.7827
xmin =
709.7827
x =
6.5650
xmin =
6.5650
x =
1.8817
xmin =
1.8817
x =
0.6322
xmin =
0.6322
x =
-0.4585
xmin =
0.6322
Note that, break
and continue
can be used in while-loops in the same fashion as they are used in for-loops, described above. The condition is evaluated before the body is executed, so it is possible to get zero iterations. It’s often a good idea to limit the number of repetitions to avoid infinite loops (as could happen above if x is infinite). This can be done in a number of ways, but the most common is to use break
. For example,
n = 0;
while abs(x) > 1
x = x/2;
n = n+1;
if n > 50, break, end
end
A break immediately jumps execution to the first statement after the loop. It’s good practice to include some diagnostic output or other indication that an abnormal loop exit has occurred once the code reach the break
statement.
Exercise
Write function getFac(n)
using while-loop, that calculates the factorial of an input number n
. For example,
>> getFac(4)
4! = 24
Answer
function getFac(n)
nOrg = n;
fac = n;
while n > 1
n = n-1;
fac = fac*n;
end
disp([num2str(nOrg),'! = ' num2str(fac)])
end
Some general advice on while-loops
-
If you inadvertently create an infinite loop (that is, a loop that never ends on its own), stop execution of the loop by pressing Ctrl+C.
-
If the conditional expression evaluates to a matrix, MATLAB evaluates the statements only if all elements in the matrix are true (nonzero). To execute statements if any element is true, wrap the expression in the
any()
function. -
To exit the loop, use a
break
statement as discussed above. To skip the rest of the instructions in the loop and begin the next iteration, use acontinue
statement. -
When nesting a number of while statements, each while statement requires an
end
keyword.