MATLAB
Vad ¨ ar MATLAB?
• En kalkylator f¨or linl¨ar algebra.
• Ett programspr˚ak liknande t.ex Java.
• Ett grafiskt verktyg.
N¨ ar anv¨ ands MATLAB?
N˚agra exempel:
• F¨or sm˚a ber¨akningar n¨ar en r¨aknedosa inte riktigt r¨acker till.
• F¨or litet st¨orre ber¨akningar.
• Vid utveckling av st¨orre program. Man kan skriva prototypprogram som man sedan
¨
overs¨atter till Java etc.
< M A T L A B >
Copyright 1984-1999 The MathWorks, Inc.
Version 5.3.0.10183 (R11) Jan 21 1999
To get started, type one of these: helpwin, helpdesk, or demo.
For product information, type tour or visit www.mathworks.com.
>> 2+4
ans =
6
3
ans =
32
ans =
20
>>
4
Aritmetiska operationer
I prioritetsordning 1. ^ upph¨ojt till 2. * multiplikation
/ h¨ogerdivision
\ v¨ansterdivision 3. + addition
- subtraktion
Alla operationer utf¨ors med flyttalsaritmetik.
Matematiska funktioner
abs(x), sign(x), sqrt(x), sin(x), besselj(n,x), ...
Datatyper
Grundl¨aggande datatyp ¨ar matriser med reella eller komplexa element. Variabler ”f¨ods” i det
¨
ogonblick man tilldelar dem ett v¨arde.
Ex.
>> a=1 a =
1
>> z=sqrt(-25) z =
0 + 5.0000i
Normalt visas bara fem v¨ardesiffror, men matlab r¨aknar alltid med ungef¨ar 15
v¨ardesiffror. F¨or att se dessa skriver man
>> format long
>> pi ans =
3.14159265358979
format short ˚aterst¨aller till visning av fem siffror.
Matriser och vektorer skrivs med hakparenteser och semikolon.
>> A=[1 2;3 4]
A =
1 2
3 4
Varje tilldelning skrivs ut p˚a sk¨armen, om inte raden avslutas med ;
S˚a h¨ar kommer man ˚at matriselement:
>> A(2,2) ans =
4
Elementen i en matris numreras kolumnvis:
>> A(3) ans =
2
Matriser allokeras dynamiskt. D¨arf¨or kan man skriva
>> A(3,3)=5 A =
1 2 0
3 4 0
0 0 5
Utrymme f¨or de nya elementen skapas.
Dynamisk allokering ¨ar tidskr¨avande. Stora matriser b¨or d¨arf¨or p˚a n˚agot s¨att initieras till r¨att storlek. Ex.
>> B=zeros(1000,200);
Detta skapar en matris av storleken 1000 × 200 med nollor.
En f¨oljd av heltal kan enkelt skapas med
”:”-notationen:
>> serie=3:8 serie =
3 4 5 6 7 8
Matrisoperationer
Genom ”:”-notationen kan man komma ˚at delar av en matris. Ex.
>> A(:,1) ans =
1 3 0
>> A(2:3,2:3) ans =
4 0
0 5
En matris transponeras med ’ :
>> A’
ans =
1 3 0
2 4 0
0 0 5
De aritmetiska operationerna ¨ar definierade enligt r¨aknereglerna fr˚an linj¨ar algebra.
V¨ansterdivision \ anv¨ands f¨or att l¨osa linj¨ara ekvationssystem
Ax = b F¨or att l¨osa
1 2 3 4
x =
3.3 4.5
kan man skriva
>> A=[1 2;3 4];
>> b=[3.3;4.5];
>> x=A\b x =
-2.1000 2.7000
Andra matrisoperationer
>> size(A) ans =
2 2
ger antalet rader och kolumner i A.
>> length(x)
ger l¨angden av x, eller den st¨orsta dimensionen om x hade varit en matris.
Fler exempel
>> eig(A), det(A), rank(A), cond(A), ...
>> norm(A), LU(A), expm(A), ...
Att skapa matriser
Nya matriser kan skapas p˚a flera olika s¨att. Ex:
>> ones(m,n)
ger en m × n-matris med ettor.
>> eye(n)
ger enhetsmatrisen av ordning n.
Vektorer kan skapas med linspace.
>> x=linspace(a,b,n)
ger en radvektor med n j¨amnt f¨ordelade tal i intervallet [a, b].
Funktioner kan operera p˚a vektorer och matriser:
>> y=sin(linspace(0,2*pi,125))
ger en vektor y inneh˚allande sinus av 125 j¨amnt f¨ordelade vinklar i intervallet [0, 2π].
Programmering i MATLAB
MATLAB-kommandon kan lagras i en
kommandofil, med suffixet .m De flesta satser i t.ex C++ eller Java har motsvarigheter i
MATLAB.
Kommandofilen k¨ors genom att man skriver dess namn p˚a kommandoraden.
>> mittprog
k¨or filen mittprog.m.
Variabler som anv¨ands i en kommandofil finns kvar i den globala arbetsarean efter att
programmet har k¨orts.
if-satsen
% Om alla element i f¨orsta kolonn
% i A ¨ar noll, ta bort kolonnen if abs(A(:,1)) < eps
A = A(1:end,2:end);
end
if-satsen kan kombineras med else och elseif enligt
if ...
...
elseif ...
...
else ...
end
Relationsoperatorer
Relationsoperatorerna i matlab ¨ar:
skrivs¨att betydelse
== =
~= 6=
< <
<= ≤
> >
>= ≥
Dessa operatorer j¨amf¨or element och returnerar 0 eller 1 beroende p˚a om j¨amf¨orelsen ¨ar sann eller falsk.
Repetitionssatser
I matlab finns for- och while-konstruktioner, for k=1:10 % Varning f¨or i och j
...
end eller
for k=1:2:9 % k antar v¨ardena 1, 3,
% 5, 7, 9 ...
end
eller helt enkelt for k=v
...
end
om v ¨ar en radvektor inneh˚allande de v¨arden k skall anta.
for-slingan kan avslutas med break for k=1:1000
if errorval break end
end
while fungerar som:
% s˚a l¨ange a<=b och c ¨ar skilt fr˚an d while (a<=b & c~=d)
...
end
Funktioner
Funktionesfiler kan definieras. En enkel funktionsfil kan se ut som
function y =minfunk(x)
% MINFUNK ber¨aknar ’minfunk’ av
% elementen i x.
y = sin(2*x)+cos(2*x);
Variabler som av¨ands i funktioner ¨ar lokala, dvs de ”lever” inte utanf¨or funktionen.
Motsatsen g¨aller ocks˚a.
L˚anga rader
L˚anga rader kan brytas med ...:
sum1 = sum1 + 0.5*(a + b)*...
linspace(a,b,n) + c*d/(k + l + m);
Glesa matriser
Antag att vi vill arbeta med en tridiagonal matris A av storleken 1000 × 1000 element.
Lagring av alla dessa element skulle kr¨ava 1000 × 1000 × 8 byte = 8 Mb, men bara ungef¨ar 300 av dessa ¨ar nollskilda.
MATLAB:s glesa format sparse g¨or det m¨ojligt att bara lagra de nollskilda elementen i A.
N˚agra anv¨andbara kommandon:
>> spalloc(m,n,nzmax)
Allokerar en gles m × n matris med plats f¨or nzmax nollskilda element.
>> sparse(A)
ger den glesa representationen av A.
Ex.
>> u=[1 2 4];v=[2 3 5];a=[2.2 3 3i];
>> sparse(u,v,a)
ans =
(1,2) 2.2000
(2,3) 3.0000
(4,5) 0 + 3.0000i
skapar en gles matris. Elementet p˚a plats ui, vi
¨
ar ai.
e = ones(n,1);
A = spdiags([e -2*e e], -1:1, n, n);
skapar den glesa representationen av den
klassiska andra ordningens differensoperatorn i N punkter (Moment i senare delen av kursen)
>> full(A)
ger den fulla ”representationen” av A.
Effektiv programmering
I st¨allet f¨or for
I m˚anga fall ¨ar det l¨ampligt att ers¨atta for-satser med vektoroperationer.
Ex: Antag att vi har en vektorf med v¨arden f = (f1, f2, f3, . . . , fn)
Vi vill ber¨akna f1 + 2f2 + . . . + 2fn−1 + fn. F¨oljande tv˚a s¨att ¨ar i princip ekvivalenta:
% metod 1:
tmp = f(1);
for k = 2:n-1
tmp = tmp + 2*f(k);
end
sum = tmp + f(n);
Den andra metoden baseras p˚a observationen att summan kan skrivas som en skal¨arprodukt mellan tv˚a vektorer.
sum = (1, 2, 2, . . . , 2, 1)
f1
f2
... fn−1
fn
% metod 2:
sum = [1 2*ones(1,n-2) 1]*f’;
% observera ’-tecknet
I de flesta fall ¨ar operationer av den andra typen att f¨oredra, d˚a de exekveras mycket fortare ¨an for-slingor.
.-notation
matlab:s s˚a kallade punktnotation ¨ar mycket anv¨andbar. Punktnotation f˚ar operatorer att verka p˚a matriser och vektorer elementvis. Ex:
prod1 = A^2 %matrisprodukten A*A prod2 = A.^2 %ger matrisen {aij^2}
Ex: Antag att vi har ett antal punkter p˚a x-axeln lagrade i vektorn x. Dessutom har vi koordinaterna f¨or e n punkt (x0, y0). Ber¨akna avst˚anden mellan (x0, y0) och alla punkterna i x.
%Pythagoras sats:
dist = sqrt((x-x0).^2+y0^2);
Resultatet av operationen ¨ar en vektor avst inneh˚allande de intressanta avst˚anden. ¨Aven punktnotation u tf¨ors mycket snabbare ¨an en motsvarande for-konstruktion.
Ett sl˚ aende exempel
Betrakta f¨oljande funktion som ber¨aknar sinus av en vektor p˚a tre olika s¨att
function [x,y,z]=sinvec(v)
for k=1:length(v) x(k)=sin(v(k));
end
y=zeros(size(v));
for k=1:length(v) y(k)=sin(v(k));
end
z=sin(v);
Med profile-verktyget, kan man m¨ata prestanda f¨or funktionsfiler. Ett anrop av sinvec med en vektor av l¨angd 20 000 gav f¨oljande resultat:
100% of the total time was spent on lines:
[4 9 5 10 12 7]
3: for k=1:length(v) 86.27s, 94% 4: x(k)=sin(v(k));
0.68s, 1% 5: end 6:
0.20s, 0% 7: y=zeros(size(v));
8: for k=1:length(v) 3.47s, 4% 9: y(k)=sin(v(k));
0.44s, 0% 10: end 11:
0.27s, 0% 12: z=sin(v);
Hur man skriver effektiva program
• Skriv p˚a h¨og abstraktionsniv˚a
Behandla matriser som ”vilka variabler som helst”
Anv¨and .- och :-anrop.
• Anv¨and sparse formatet f¨or att lagra glesa matriser.
• Unders¨ok funktioner med profile-verktyget.
• Skriv hj¨alptext till dina funktioner.
• Kommentera dina program.
• Kommentera dina program.
Oavsett hur smart en algoritm var n¨ar den en g˚ang skrevs blir den v¨ardel¨os n¨ar ingen l¨angre minns vad den var till f¨or eller hur den
fungerade. (”en g˚ang”=f¨orra veckan).
Grafik
>> plot(v)
ritar v¨ardena i vektorn v som funktion av index.
>> plot(x,y)
Ritar y som funktion av x. x och y m˚aste vara lika l˚anga.
>> mesh(A)
ritar v¨ardena i matrisen A som h¨ojden ovanf¨or en rektangel.
>> surf(A)
ritar matrisen A som en ytgraf.
mesh och surf kan ocks˚a anv¨andas med argument som specificerar nodernas x- och y-koordinater.
>> hold on
G¨or att man kan rita flera kurvor i samma ritomr˚ade utan att de gamla raderas.
>> axis([xmin xmax ymin ymax])
S¨atter om axelskalorna s˚a att de l¨oper mellan xmin och xmax samt ymin och ymax.
>> title(’Min graf’); xlabel(’x-axel’);
>> ylabel(’y-axel’)
anger titel och namn p˚a axlarna.
>> legend(’Kurva 1’,’Kurva 2’)
L¨agger in en liten ruta med f¨orklarande text till kurvorna i ett ritomr˚ade.
>> print -dps min_graf.ps
skapar en PostScript-fil inneh˚allande aktuell figur. Filen kan skrivas ut som vanligt:
$ lp -d pr2446 min_graf.ps
>> figure
skapar en ny figur.
>> figure(n)
g¨or figur nr. n till aktuell figur.
>> clf
t¨ommer grafikf¨onstret
Interaktivt arbete med MATLAB
N˚agra sm˚a tips
↑ Piltangent upp˚at ˚aterkallar tidigare kommando.
pl ↑ ˚Aterkallar senaste kommandot vars namn b¨orjade med ”pl”.
format Minskar mellanrummet compact mellan svarsraderna.
ctrl-c Avbryter exekveringen av ett kommando eller en .m-fil, men stoppar inte matlab.
>> clear
raderar alla variabler.
>> who
visar alla definierade variabler.
>> whos
visar alla definierade samt deras storlekar.
>> help kommando
ger hj¨alptext f¨or kommando.
>> lookfor ord
Ger en lista ¨ovre alla kommandon d¨ar ord f¨orekommer i beskrivningen.
Kom ih˚ag att allt som g¨ors i en kommandofil p˚averkar den globala arbetsarean.
Enstaka programrader testas enkelt genom
kopiering och klistring mellan terminalf¨onstren.
Utvecklingsmilj¨ o
Det finns ett editerings/fels¨okningsverktyg som kan startas genom att man skriver
>> edit minfunk
Verktyget g¨or det m¨ojligt att f¨olja
exekveringsg˚angen, s¨atta brytpunkter, kolla v¨ardet p˚a variabler osv.