These notes cover writing
if loops and
if statement is a control statement that chooses whether lines of code are executed or not. The format for writing an
if loop is this:
if condition lines of code end
The condition is an expression that is either true or false, which we covered in Tutorial 2. If the condition is a logical true, then the “lines of code” will be executed. If the condition is a logical false, then the “lines of code” will be skipped over. The loop stops at the
end, such that the code is bracketed by the
end. The lines of code to be executed if the condition is true is usually indented.
An example of an
myNumber = input('Enter a number: '); if myNumber > 0 disp('Your number is greater than zero!') end
The above code asks the user to enter a number in the command window and saves it as
myNumber. If the condition (
myNumber > 0) is true, then the command will display the text ‘Your number is greater than zero!’. If the number input is less than or equal to zero, the function will not execute anything. Try copying the code into your command window and entering a positive and negative value as inputs.
You will note that in the above
if loop that no output is shown when the condition is not met (i.e. false). A second set of code can be specified to run in the situations where the
if condition is not met, using the
else statement. The general form for using an
else statement is this:
if condition first set of code else second set of code end
if condition is evaluated first. If the condition is met (i.e. true), the first set of code is executed. If the condition is not met (i.e. false), the second set of code is executed instead.
Note that the
end statements are kept on the same level of indentation, with the executed code indented. This programming architecture is good practice to make sure that the loops are clearly bracketed, and the executed code is clear. Additionally, certain programming languages such as Python require the loops be indented properly to function!
Adding to our example, we can have the console say that the number input is not greater than zero (when the
if condition is false):
myNumber = input('Enter a number: '); if myNumber > 0 disp('Your number is greater than zero!') else disp('Your number is not greater than zero!') end
Try inserting a positive and negative number as inputs. You’ll find that inserting a negative number as an input will now generate a response.
if else loop allows choosing to execute one of two sets of code. There are two ways of writing loops to choose from more than two sets of code.
Nested loops are loops that are written inside another loop. Let’s say for our
myNumber example that when the number input is zero, we want the console to state that! In the
else section of the loop, we can specify another
if loop to do that:
myNumber = input('Enter a number: '); if myNumber > 0 % This will be executed if myNumber is greater than zero disp('Your number is greater than zero!') else % This section will be executed if myNumber is not greater than zero if myNumber == 0 disp('Your number is zero!') else disp('Your number is less than zero!') end end
Try inserting a positive number, a negative number and zero as your values for
Starting from the top of the
if loop, the first condition is checked: is
myNumber greater than zero? If that is true, it will execute the first section of code. If it is not true, the
else section of the first
if loop will be executed.
So, in that case, the nested
if loop is executed. If
myNumber equals zero, it will execute
disp('Your number is zero!') , and if it doesn’t, it will execute
disp('Your number is less than zero!').
Note how the second
if loop has been indented. This helps distinguish it from the overall
if loop and also allows the second
if loop to be organised. Also note how both
if loops have an
end statement to denote where the loop has finished.
A more efficient method of choosing between more than two options of code is using the
elseif statement. It is used following an initial
if statement in this general form:
if condition first set of code elseif second condition second set of code else third set of code end
if condition is evaluated and if it is not satisfied, the second condition (next to
elseif) is then evaluated. If that condition is satisfied, the second set of code is executed. If not, it moves on to the
else section of the loop.
Rewriting the above example of nested
if loops using the
elseif is a bit more efficient:
myNumber = input('Enter a number: '); if myNumber > 0 disp('Your number is greater than zero!') elseif myNumber == 0 disp('Your number is equal to zero!') else disp('Your number is less than zero!') end
Note that the elseif statement has no space, which is not the case in other languages such as R and Python. Try inputting a positive number, a negative number and zero as inputs for
myNumber in this loop.
Let’s say we are trying to write some code that will square root a number that the user inputs. The normal
sqrt() function will give the imaginary square number but let’s make our function say you cannot square a negative number. Open a new script and save it as ‘sqrtinput.m’ and try to write the loop!
We use the
for loop when we need to repeat lines of code or a function. Every time we repeat the loop is called an iteration. We iterate through a loop variable for a defined number of times. A
for loop is usually formatted this way:
for loopVariable = range function end
The range here is the range of values that the loop variable will iterate the function. Just like
for loops require an end. Here’s an exmaple:
for i = 1:3 fprintf('I will not fall asleep.\n') end
This will output the string
I will not fall asleep three times, once for each of the times that our loop variable
i is iterated. Usually for loops contain the loop variable within the code. It is common for programmers to use
i as their loop variable, but I prefer to use a variable name that is informative. This is helpful when preallocating values to a vector or matrix. Here is an example of using a
for loop to preallocate values:
numTrials = 3; for thisTrial = 1:numTrials myNumberVector(thisTrial) = randi(10); end disp(myNumberVector)
This code will pick a random integer between 1 and 10, and save it to
myNumberVector. Following the end of the
myNumberVector will be displayed in the console.
We define the number of iterations (‘trials’) before the
for loop starts (a handy habit to have is to initialise the parameters you’ll use such that later code still functions with any changes to the parameter value). Try running this code again but change
numTrials to a different number above zero. You’ll notice the vector corresponds to
numTrials (i.e. the number of iterations!).
We can combine these control statements into the same loop. Let’s try write a code that asks the user to input three different numbers and returns if they’re even or odd.
A very useful function for this is the
mod function, short for ‘modulus’ and similar to a remainder function. It takes two arguments, the number to-be-divided and the number to divide by. Try this and see if you make sense of this:
Let’s try write a function that takes inputs from the user and returns if the number is even or odd!
numTrials = 3; for thisTrial = 1:numTrials myNumber = input('Enter a number: '); if mod(myNumber,2) == 0 disp(Your number is even!) else disp(Your number is odd!) end end
if loop is nested within the
for loop (note the programming architecture where the
end statements are level with their beginning control statements). We repeat the
if loop on each iteration of
thisTrial and it checks whether
myNumber is even. If so, it says so! If not, it says the number is not!
for loop within a
Imagine you are running a change detection task with four colours for three blocks of 100 trials. On each trial, one of these four colours changes. You’ll predetermine which colour changes on each trial.
A useful function that will help us do this is the
randi function, which produces a random integer. Let’s try save the output of each iteration to a matrix, where each row is a block, and each column is a trial.
numBlocks = 3; % Number of blocks numTrials = 100; % Number of trials allChanges = NaN(numBlocks,numTrials); % Creates a matrix to save the changes for thisBlock = 1:numBlocks for thisTrial = 1:numTrials allChanges(thisBlock,thisTrial) = randi(4); % Random integer from 1 to 4 end end
I have left comments on lines, hopefully explaining what is achieved by each line of code.
Note that this type of preallocation using
randi does not guarantee that each item from one to four is equally represented in each block or across all the trials. We’ll tackle this another time.