Difference between revisions of "MATLAB1"

From SourceWiki
Jump to navigation Jump to search
Line 24: Line 24:
 
==Finding where your code is slow==
 
==Finding where your code is slow==
  
You can assess the performance of a portion of a MATLAB script using the timing functions '''tic''' and '''toc''':
+
Possibly the simplest way to assess the performance of a sequence of MATLAB operations is to employ the timing functions '''tic''' and '''toc'''.  For example:
  
 
<source lang="matlab">
 
<source lang="matlab">
tic
+
tic;
<do some work>
+
plot(magic(35))
 
toc
 
toc
 
</source>
 
</source>
  
The call to toc will cause the elapsed time to be reported.
+
gives the result:
  
The MATLAB profiler.
+
<pre>
 +
Elapsed time is 7.206756 seconds.
 +
</pre>
 +
 
 +
A more detailed analysis can be elicited from the MATLAB profiler:
  
 
<source lang="matlab">
 
<source lang="matlab">

Revision as of 11:30, 3 September 2013

An Introduction MATLAB

Introduction

Rather than re-invent the wheel, we'll use some tried and tested tutorial material. The following notes from the Maths department at the University of Dundee are concise, comprehensive, but also easy to read: http://www.maths.dundee.ac.uk/ftp/na-reports/MatlabNotes.pdf

Hints and Tips on Performance

A common query is, "How can I speed up my MATLAB code?". People often go on to say that it ran fine when they were developing their code, but now that their ambition has grown and they are working on larger problems, they end up waiting for days to get a result. This is sometimes followed up by, "it'll run faster on the HPC system, right?" Well, not necessarily.

Let's try to pick some of this apart.

There are several aspects of some MATLAB code that can really limit it's performance. For loops are a common limiting factor, as is allocation of memory on-the-fly. These limitations can often be addressed by:

  • Replacing loops over the elements of a vector or matrix with:
    • Scalar and array operations.
    • Built-in functions which take vectors or matrices as arguments.
  • Pre-allocation memory where appropriate.

However, before we get into examples of improved code, we need to determine where your code is spending the majority of it's time. It would not be sensible to invest lots of effort in re-writing a section of your program which took only 1% of the overall runtime. Accordingly, the next section focusses on methods for finding hot spots in your code:

Finding where your code is slow

Possibly the simplest way to assess the performance of a sequence of MATLAB operations is to employ the timing functions tic and toc. For example:

tic;
plot(magic(35))
toc

gives the result:

Elapsed time is 7.206756 seconds.

A more detailed analysis can be elicited from the MATLAB profiler:

profile on
plot(magic(35))
profile viewer
profile off

Scalar and Array Operators

For example, if you would like to perform a scalar operation to a vector, vec, (say, multiply each element by 3) then you do not need to write a loop.

Replace:

for i = 1:length(vec)
  vec(i) = vec(i) * 3;
end

with:

vec = vec*3

Similarly, if you have two vectors or matrices of the same size, you can perform element-by-element operations using, e.g.

m3 = m1 - m2

Note that array versions of the multiplication, division and exponentiation operators are .*, ./ and .^, respectively.

If you wish to apply the same function to all the elements of an array or vector, then you can pass it as an argument to the function. If you write your own functions, ensure that the operators that you use inside the function can handle vectors or matrices.

Built-in Functions

Preallocation of Vectors

Consider the following two MATLAB scripts.

noprealloc.m:

tic;
for i=1:3000,
for j=1:3000,
x(i,j)=i+j;
end
end
toc

prealloc.m:

tic;
x=zeros(3000);
for i=1:3000,
for j=1:3000,
x(i,j)=i+j;
end
end
toc

When we run these two scripts (on BCp2), we see a marked difference in the runtime:

>> noprealloc
Elapsed time is 14.317089 seconds.
>> prealloc  
Elapsed time is 0.279115 seconds.

Timing Examples