NERC Numerical Earth Science Modelling Short Course: Lecture 2 – Loops and conditions

Dr Simon A Mathias

Department of Earth Sciences

Durham University

This week’s leaning objectives

At the end of the week you should be able to:

• Repeat operations using a “for” loop.
• Define logical statements.
• Compare arrays using logical statements.
• Select data using logical statements.
• Use sum, mean, std, max and min.

Repeat operations using a “for” loop

Last week we learnt how to store and access data in arrays. We also learnt how to write long lists of instructions in a script file. Sometimes we want to do the same or a similar thing many times. Instead of repeating the code many times we can use a “for” loop.

Open MATLAB.

Click on “File”, “New”, “Script”. The “Editor” window should now appear.

At the top of the window type the following:

function ExamplesFromLecture2
%This is a script file containing examples from lecture 2

Type the following code in your new mfile and run (by pressing the green arrow at the top of the editor window).

A=2;
A=A+5;
A=A+5;
A=A+5;
%Display the value of A in the Command Window
A
A =

17

What we have done is added 5 onto 2, three times. Another way of doing this is to use a for loop. Add the following to your mfile and run:

A=2;
for i=1:3
%Display the value of i in the Command Window
i
%Add 5 onto A and display in the Command Window
A=A+5
end
i =

1

A =

7

i =

2

A =

12

i =

3

A =

17

Exactly the same result is achieved. We have added 5 onto 2, three times. So what exactly is happening? We are stepping through a loop. In the first step, i=1. In the second step, i=2, in the third step, i=3. Then the loop is stopped. During each step 5 is added onto A.

Recall that

1:3
ans =

1     2     3

At the beginning of the loop we state for i=1:3. This tells MATLAB to make i=1, then 2 and finally 3. Anything written in between the for and end is repeated until the sequence of i values is achieved.

A=2;
%Add 5 on to A 1000 times
for i=1:1000
A=A+5;
end
%Display the value of A in the Command Window
A
A =

5002

We have repeated the calculation 1000 times!

Defining logical statements

Another fantastic aspect of scientific programming is the ability to apply logical statements.

Conditions usually contain the following:

% ==    equal to
% <     less than
% <=    less than or equal to
% >     greater than
% >=    greater than or equal to
% ~=    not equal to

MATLAB denotes true as 1 and false as 0. For example, type the following into the Command Window:

5<6
ans =

1

Indeed it is “true” that 5<6, therefore MATLAB returned a 1.

Type the following into the Command Window:

5>6
ans =

0

It is “false” that 5>6, therefore MATLAB returned a 0.

Type the following into the Command Window

x=[1 3 4 8 6 5 3 2 2]
x<3
x =

Columns 1 through 8

1     3     4     8     6     5     3     2

Column 9

2

ans =

Columns 1 through 8

1     0     0     0     0     0     0     1

Column 9

1

The x<3 leads to a row of ones and zeros. There is a one for every value of x which is < 3 and a zero for every value of x which is greater than or equal to 3.

Now type:

x<=3
ans =

Columns 1 through 8

1     1     0     0     0     0     1     1

Column 9

1

Now there is a one for every value of x which is less than or equal to 3 and a zero for every value of x which is > 3.

What about if we want find out which values are equal to 3? Type

x=[1 3 4 8 6 5 3 2 2]
x=3
x =

Columns 1 through 8

1     3     4     8     6     5     3     2

Column 9

2

x =

3

Oh dear, now x = 3. The makers of MATLAB realised this is the case and so introduced the == term.

Now type:

x=[1 3 4 8 6 5 3 2 2]
x==3
x =

Columns 1 through 8

1     3     4     8     6     5     3     2

Column 9

2

ans =

Columns 1 through 8

0     1     0     0     0     0     1     0

Column 9

0

We get a one for every value of x which is equal to 3. Now type

x~=3
ans =

Columns 1 through 8

1     0     1     1     1     1     0     1

Column 9

1

Now we get a one for every value of x which is not equal to 3.

Comparing arrays using logical statements.

We use these statements to compare different arrays. However, the arrays must be the same size. Type

x=[1 3 4 8 6 5 3 2 2]
y=[3 3 1 5 3 2 8 4 2]
x==y
x =

Columns 1 through 8

1     3     4     8     6     5     3     2

Column 9

2

y =

Columns 1 through 8

3     3     1     5     3     2     8     4

Column 9

2

ans =

Columns 1 through 8

0     1     0     0     0     0     0     0

Column 9

1

We get a one for every value of x which is equal to the corresponding value of y.

Another two useful symbols are

% &    and
% |    or

Suppose we want to know about which values of x are equal to y and are also greater than 2. Type

x==y & x>2
ans =

Columns 1 through 8

0     1     0     0     0     0     0     0

Column 9

0

Suppose we want to know which values of x are greater than y or equal to 2. Type

x>y | x==2
ans =

Columns 1 through 8

0     0     1     1     1     1     0     1

Column 9

1

We can make these statements as complicated as we like. For example:

x>y | x==2 | y==8
ans =

Columns 1 through 8

0     0     1     1     1     1     1     1

Column 9

1

Selecting data using logical statements

We can use logical statements to select data from arrays using the find command. Type

x=[1 3 4 8 6 5 3 2 2]
y=[3 3 1 5 3 2 8 4 2]
condition=y>2
ind=find(condition)
x =

Columns 1 through 8

1     3     4     8     6     5     3     2

Column 9

2

y =

Columns 1 through 8

3     3     1     5     3     2     8     4

Column 9

2

condition =

Columns 1 through 8

1     1     0     1     1     0     1     1

Column 9

0

ind =

1     2     4     5     7     8

Now the vector ind contains the locations of those values of y which are greater than 2. Now type

y(1,ind)
ans =

3     3     5     3     8     4

MATLAB has returned only those values of y which are greater than 2. Now type

z=x(1,ind)
z =

1     3     8     6     3     2

We have now stored in the array, z, all the values of x whose corresponding values of y are greater than 2.

Using sum, mean, std, max and min

MATLAB has many built in functions of interest. It would be impossible to discuss all of them today. But we can look at a few of interest as we go through the year.

Enter the following 2D array in the Command Window

A=[2 5 8 6; 9 4 3 1; 7 12 10 11]
A =

2     5     8     6
9     4     3     1
7    12    10    11

The sum function adds up all of the elements of an array.

sum(A,1) sums all the columns of A

sum(A,1)
ans =

18    21    21    18

sum(A,2) sums all the rows of A

sum(A,2)
ans =

21
17
40

sum(A(:),1) sums everything in A

sum(A(:),1)
ans =

78

The mean functions works in exactly the same way but finds the arithmetic mean, respectively.

mean(A,1)
mean(A,2)
mean(A(:),1)
ans =

6     7     7     6

ans =

5.2500
4.2500
10.0000

ans =

6.5000

Three other functions also of interest are max, min and std.

max(A,[],1) finds the maximum value in each column of A

max(A,[],1)
ans =

9    12    10    11

max(A,[],2) finds the maximum value in each row of A

max(A,[],2)
ans =

8
9
12

max(A(:),[],1) finds the maximum value in all of A

max(A(:),[],1)
ans =

12

Note the inclusion of the []. This is needed as max has other options, which you are unlikely to consider as you start with MATLAB. Therefore we are leaving that argument as empty, i.e., [].

The functions min and std work in exactly the same way as max but find the minimum value and the standard deviation, respectively.

To find out more about any function simply type help followed by the function name in the Command Window. Try typing help min in the Command Window.

Generating annual rainfall from monthly rainfall

We will now revisit the Durham weather data set from last week. Recall that the data is recorded for every month from 1880 to 2012. The rainfall data represents the total depth of rainfall that landed during each month. It is not so helpful to look at the statistics of monthly data because of the associated effects of seasonality on rain. Instead it would be more interesting to study the total rainfall that landed over the year. In this exercise we will generate a simple mfile to automatically calculate the annual rainfall for each year from 1880 to 2012.

Click on “File”, “New”, “Script”. The “Editor” window should now appear.

At the top of the window type the following:

function AnnualRainfallInDurham
% This is a script to calculate annual rainfall at Durham from a monthly
% rainfall time-series

%Import Durham weather data from excel

%Extract years and store in yyyy
yyyy=data(:,1);

%Extract months and store in mm
mm=data(:,2);

%Extract monthly rainfall and store in rain
rain=data(:,6);

Click on “File”, “Save As…”, browse to “My_mfiles” and save the file as “AnnualRainfallInDurham.m”.

Now add the following code to the file

rain1880=rain(1:12,1)

Press the green arrow to run. You should now see the first 12 rainfall data in the Command Window. Compare with the excel spreadsheet to verify that these are the monthly rainfall data for the year of 1880.

To find the sum for this year, add

sum(rain1880,1)

But what if we had to find the sum of every year?

Lets go back to 1880. Add the following code to your mfile and run:

%Choose year of interest
YEAR=1880;
%Obtain the locations of all yyyy which are equal to value of YEAR
condition=yyyy==YEAR;
ind=find(condition);
%Store all rain data for year of interest in rainYEAR
rainYEAR=rain(ind,1);
%Calculate annual rainfall for that year by summation
rainANNUAL=sum(rainYEAR,1)

We have generalised what we wanted to do for any value stored in YEAR.

Now to look at years from 1880 to 2012 we can use a for loop. Add the following code to your mfile and run:

%Generate a column vector of the years of interest
YEAR=[1880:2012]';
%Count how many years we are interested in and store in M
M=numel(YEAR);
%Perform a loop for each year of interest
for i=1:M
%Obtain the locations of all yyyy which are equal to the ith YEAR
condition=yyyy==YEAR(i,1);
ind=find(condition);
%Store all rain data for year of interest in rain YEAR
rainYEAR=rain(ind,1);
%Calculate annual rainfall for that year by summation and store in the
%ith value of rainANNUAL
rainANNUAL(i,1)=sum(rainYEAR,1);
end

Assignment

1) Extend your code further by finding the a) maximum, b) minimum, c) mean and d) standard deviation of the annual rainfall in Durham for the period 1980 to 2011, respectively.

2) Extend the code to count how many years during that period had above average rainfall.

3) Use MATLAB to generate an appropriately labelled bar chart displaying the annual rainfall for the period 1980 to 2011. Type help bar to find out how to do this. Hint: it is very similar to using the plot command you used last week. Use the bar chart to check your ansers to the previous two tasks.

Published with MATLABĀ® 7.13