MATLAB Vad är MATLAB? En kalkylator för linlär algebra. Ett programspråk liknande t.ex Java. Ett grafiskt verktyg. 1
När används MATLAB? Några exempel: För små beräkningar när en räknedosa inte riktigt räcker till. För litet större beräkningar. Vid utveckling av större program. Man kan skriva prototypprogram som man sedan översätter till Java etc. 2
< 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. 3 >> 2+4 ans = 6 >> 2^5, 2*(3+7)
ans = 32 4 ans = 20 >>
Aritmetiska operationer I prioritetsordning 1. ^ upphöjt till 2. * multiplikation / högerdivision \ vänsterdivision 3. + addition - subtraktion Alla operationer utförs med flyttalsaritmetik. Matematiska funktioner abs(x), sign(x), sqrt(x), sin(x), besselj(n,x),... 5
Datatyper Grundläggande datatyp är matriser med reella eller komplexa element. Variabler föds i det ögonblick man tilldelar dem ett värde. Ex. >> a=1 a = 1 >> z=sqrt(-25) z = 0 + 5.0000i Normalt visas bara fem värdesiffror, men matlab räknar alltid med ungefär 15 värdesiffror. För att se dessa skriver man >> format long >> pi ans = 3.14159265358979 format short återställer till visning av fem siffror. 6
Matriser och vektorer skrivs med hakparenteser och semikolon. >> A=[1 2;3 4] A = 1 2 3 4 Varje tilldelning skrivs ut på skärmen, om inte raden avslutas med ; Så här kommer man åt matriselement: >> A(2,2) ans = 4 Elementen i en matris numreras kolumnvis: >> A(3) ans = 2 7
Matriser allokeras dynamiskt. Därför kan man skriva >> A(3,3)=5 A = 1 2 0 3 4 0 0 0 5 Utrymme för de nya elementen skapas. Dynamisk allokering är tidskrävande. Stora matriser bör därför på något sätt initieras till rätt storlek. Ex. >> B=zeros(1000,200); Detta skapar en matris av storleken 1000 200 med nollor. En följd av heltal kan enkelt skapas med : -notationen: >> serie=3:8 serie = 3 4 5 6 7 8 8
Matrisoperationer Genom : -notationen kan man komma åt 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 9
De aritmetiska operationerna är definierade enligt räknereglerna från linjär algebra. Vänsterdivision \ används för att lösa linjära ekvationssystem Ax = b För att lösa 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 10
Andra matrisoperationer >> size(a) ans = 2 2 ger antalet rader och kolumner i A. >> length(x) ger längden av x, eller den största dimensionen om x hade varit en matris. Fler exempel >> eig(a), det(a), rank(a), cond(a),... >> norm(a), LU(A), expm(a),... 11
Att skapa matriser Nya matriser kan skapas på flera olika sätt. 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ämnt fördelade tal i intervallet [a, b]. Funktioner kan operera på vektorer och matriser: >> y=sin(linspace(0,2*pi,125)) ger en vektor y innehållande sinus av 125 jämnt fördelade vinklar i intervallet [0, 2π]. 12
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örs genom att man skriver dess namn på kommandoraden. >> mittprog kör filen mittprog.m. Variabler som används i en kommandofil finns kvar i den globala arbetsarean efter att programmet har körts. 13
if-satsen % Om alla element i första kolonn % i A är 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 14
Relationsoperatorer Relationsoperatorerna i matlab är: skrivsätt == = ~= < < <= > > >= betydelse Dessa operatorer jämför element och returnerar 0 eller 1 beroende på omjämförelsen är sann eller falsk. 15
Repetitionssatser I matlab finns for- och while-konstruktioner, for k=1:10... end % Varning för i och j eller for k=1:2:9 % k antar värdena 1, 3, % 5, 7, 9... end eller helt enkelt for k=v... end om v är en radvektor innehållande de värden k skall anta. 16
for-slingan kan avslutas med break for k=1:1000 if errorval break end end while fungerar som: % så länge a<=b och c är skilt från d while (a<=b & c~=d)... end 17
Funktioner Funktionesfiler kan definieras. En enkel funktionsfil kan se ut som function y =minfunk(x) % MINFUNK beräknar minfunk av % elementen i x. y = sin(2*x)+cos(2*x); Variabler som avänds i funktioner är lokala, dvs de lever inte utanför funktionen. Motsatsen gäller också. Långa rader Långa rader kan brytas med...: sum1 = sum1 + 0.5*(a + b)*... linspace(a,b,n) + c*d/(k + l + m); 18
Glesa matriser Antag att vi vill arbeta med en tridiagonal matris A av storleken 1000 1000 element. Lagring av alla dessa element skulle kräva 1000 1000 8 byte = 8 Mb, men bara ungefär 300 av dessa är nollskilda. MATLAB:s glesa format sparse gör det möjligt att bara lagra de nollskilda elementen i A. Några användbara kommandon: >> spalloc(m,n,nzmax) Allokerar en gles m n matris med plats för nzmax nollskilda element. >> sparse(a) ger den glesa representationen av A. 19
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å plats u i,v i är a i. 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. 20
Effektiv programmering I stället för for Imånga fall är det lämpligt att ersätta for-satser med vektoroperationer. Ex: Antag att vi har en vektorf med värden f =(f 1,f 2,f 3,...,f n ) Vi vill beräkna f 1 +2f 2 +...+2f n 1 + f n. Följande två sätt är i princip ekvivalenta: % metod 1: tmp = f(1); for k = 2:n-1 tmp = tmp + 2*f(k); end sum = tmp + f(n); 21
Den andra metoden baseras på observationen att summan kan skrivas som en skalärprodukt mellan två vektorer. sum =(1, 2, 2,...,2, 1) % metod 2: sum = [1 2*ones(1,n-2) 1]*f ; % observera -tecknet f 1 f 2. f n 1 f n I de flesta fall är operationer av den andra typen att föredra, då de exekveras mycket fortare än for-slingor. 22
.-notation matlab:s så kallade punktnotation är mycket användbar. Punktnotation får operatorer att verka på 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å x-axeln lagrade i vektorn x. Dessutom har vi koordinaterna för e n punkt (x 0,y 0 ). Beräkna avstånden mellan (x 0,y 0 ) och alla punkterna i x. %Pythagoras sats: dist = sqrt((x-x0).^2+y0^2); Resultatet av operationen är en vektor avst innehållande de intressanta avstånden. Även punktnotation u tförs mycket snabbare än en motsvarande for-konstruktion. 23
Ett slående exempel Betrakta följande funktion som beräknar sinus av en vektor på tre olika sätt 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); 24
Med profile-verktyget, kan man mäta prestanda för funktionsfiler. Ett anrop av sinvec med en vektor av längd 20 000 gav följande 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); 25
Hur man skriver effektiva program Skriv på hög abstraktionsnivå Behandla matriser som vilka variabler som helst Använd.- och:-anrop. Använd sparse formatet för att lagra glesa matriser. Undersök funktioner med profile-verktyget. Skriv hjälptext till dina funktioner. Kommentera dina program. Kommentera dina program. Oavsett hur smart en algoritm var när den en gång skrevs blir den värdelös när ingen längre minns vad den var till för eller hur den fungerade. ( en gång =förra veckan). 26
Grafik >> plot(v) ritar värdena i vektorn v som funktion av index. >> plot(x,y) Ritar y som funktion av x. x och y måste vara lika långa. >> mesh(a) ritar värdena i matrisen A som höjden ovanför en rektangel. >> surf(a) ritar matrisen A som en ytgraf. mesh och surf kan också användas med argument som specificerar nodernas x- och y-koordinater. 27
>> hold on Gör att man kan rita flera kurvor i samma ritområde utan att de gamla raderas. >> axis([xmin xmax ymin ymax]) Sätter om axelskalorna så att de löper mellan xmin och xmax samt ymin och ymax. >> title( Min graf ); xlabel( x-axel ); >> ylabel( y-axel ) anger titel och namn på axlarna. >> legend( Kurva 1, Kurva 2 ) Lägger in en liten ruta med förklarande text till kurvorna i ett ritområde. 28
>> print -dps min_graf.ps skapar en PostScript-fil innehållande aktuell figur. Filen kan skrivas ut som vanligt: $ lp -d pr2446 min_graf.ps >> figure skapar en ny figur. >> figure(n) gör figur nr. n till aktuell figur. >> clf tömmer grafikfönstret 29
Interaktivt arbete med MATLAB Några små tips pl format compact ctrl-c Piltangent uppåt återkallar tidigare kommando. Återkallar senaste kommandot vars namn började med pl. Minskar mellanrummet mellan svarsraderna. Avbryter exekveringen av ett kommando eller en.m-fil, men stoppar inte matlab. 30
>> clear raderar alla variabler. >> who visar alla definierade variabler. >> whos visar alla definierade samt deras storlekar. >> help kommando ger hjälptext för kommando. >> lookfor ord Ger en lista övre alla kommandon där ord förekommer i beskrivningen. Kom ihåg att allt som görs i en kommandofil påverkar den globala arbetsarean. 31
Enstaka programrader testas enkelt genom kopiering och klistring mellan terminalfönstren. Utvecklingsmiljö Det finns ett editerings/felsökningsverktyg som kan startas genom att man skriver >> edit minfunk Verktyget gör det möjligt att följa exekveringsgången, sätta brytpunkter, kolla värdet på variabler osv. 32