Difference between revisions of "MATLAB1"
Line 55: | Line 55: | ||
==Preallocation of Vectors== | ==Preallocation of Vectors== | ||
+ | |||
+ | Consider the following two MATLAB scripts. | ||
+ | |||
+ | '''noprealloc.m''': | ||
+ | <source lang="matlab"> | ||
+ | tic; | ||
+ | for i=1:3000, | ||
+ | for j=1:3000, | ||
+ | x(i,j)=i+j; | ||
+ | end | ||
+ | end | ||
+ | toc | ||
+ | </source> | ||
+ | |||
+ | '''prealloc.m''': | ||
+ | <source lang="matlab"> | ||
+ | tic; | ||
+ | x=zeros(3000); | ||
+ | for i=1:3000, | ||
+ | for j=1:3000, | ||
+ | x(i,j)=i+j; | ||
+ | end | ||
+ | end | ||
+ | toc | ||
+ | </source> | ||
+ | |||
+ | When we run these two scripts (on BCp2), we see a marked difference in the runtime: | ||
<pre> | <pre> | ||
− | + | >> noprealloc | |
+ | Elapsed time is 14.317089 seconds. | ||
+ | >> prealloc | ||
+ | Elapsed time is 0.279115 seconds. | ||
</pre> | </pre> | ||
Revision as of 11:00, 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
There are two main ways to improve the performance of your MATLAB code:
- Replace 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-allocate memory where appropriate.
You can assess the performance of a portion of a MATLAB script using the timing functions tic and toc:
tic <do some work> toc
The call to toc will cause the elapsed time to be reported.
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.