Föreläsning M: Introduktion till MATLAB (Föreläsningen är gjord för kursen TDDD87 som har ett litet MATLAB-moment instucket emellan Ada-laborationer. Studenterna känner till, variabler, satser, typer, styrsatser, underprogram och fält, i Ada. Föreläsningen gör sig förmodligen best om föreläsaren kör en MATLAB-prompt live för studenterna.) På den här föreläsningen skall jag introducera er för verktyget MATLAB. Det används inom många ingenjörsmässiga situationer och ni kommer ha nytta av det i kommande kurser. Föreläsningen är också förberedande för de MATLAB-uppgifter som skall genomföras i den här kursen. Nu kan det kännas tungt att börja med något helt nytt, särskilt när vi just har kommit igång med Ada. Lyckligtvis kan man trösta sig med att det finns två ljusa sidor med att ta upp ett nytt programmeringsspråk. Det första är att det är väldigt nyttigt för att förstå programmering i allmänhet. Det som är nytt kan föra med sig nya tankesätt och ger förmodligen nya insikter i hur man kan lösa problem. Den andra fördelen är att mycket är likt det ni redan har lärt er. Detta är egentligen inte en slump, utan alla programmeringsspråk fungerar på mer eller mindre samma sätt. Huruvida MATLAB är ett programmeringsspråk kan man diskutera. Låt oss inte göra det. Låt mig istället berätta att MATLAB är ett verktyg för att utföra matematiska beräkningar. MATLAB är alltså i sig ett program. Det finns dock en kommandoprompt i MATLAB där man kan skriva in kommandon. När man trycker enter så exekveras kommandot. Låter det bekant? Just det - det är precis så som ett terminalen (kallas också för kommandoskal) fungerar. Vi säger att MATLAB interpreterar dessa kommandon. Det finns även möjlighet att gruppera ihop kommandon så att de blir små program. När man kör sådana program så kommer MATLAB helt enkelt gå igenom kommandona ett och ett och exekvera dem, precis som om de hade skrivits in i kommandofönstret. Hittills är vi vana vid ett kompilerande språk, men nu går vi alltså över till något som interpreteras. Istället för en kompilator, har man en interpretator. Oavsett vilket man har fungerar ju detta som en tolk. Tänk er att jag skall agera tolk mellan min mormor (som bara talar engelska) och min farmor (som bara talar svenska). Om min mormor vill skriva ett långt brev till min farmor, då tar jag brevet i handen, går hem på kammaren och översätter allt ihop och lämnar över resultatet till farmor nästa dag - det är kompilering. Däremot om min mormor bara vill säga ett par meningar till farmor, så tar jag nog dem en och en - precis som interpretering. Ni förstår säkert att dessa två angreppssätt har lite olika fördelar och nackdelar. Vid kompilering kan man upptäcka lite mer "övergripande" problem, och kanske till och med rätta till dem, innan man levererar slutresultatet. Vid interpretering har man dock istället större möjlighet att testa sig fram när man skall göra något. Rent praktiskt blir det inte jättestor skillnad dock. Ni kommer skriva er kod på ett ställe, i det vi kallar för ett skript eller en funktion. Och ni kommer att kunna köra dem på ett annat. Detta är ju mycket likt hur vi redan har arbetat i kursen. Vi kan börja med att titta lite på hur MATLAB hanterar variabler. Först av allt skall det sägas att man i MATLAB inte behöver deklarera sina variabler. Man kan helt enkelt hitta på ett variabelnamn och tilldela variabeln med en gång. Zimsalabim - så finns den! Här har vi ett par exempel: namn = 'Anna­Maria Karlsson'; alder = 32; skostorlek = 38.5 simkunnig = true turnummer = [19 55 2 196]; Vi ser här exempel på lite olika data, en sträng, ett heltal, ett flyttal, en boolean och en vektor (mer om dessa senare). Kommandona ovan är alltså tilldelningar, inte lika-med-jämförelser. Vill man kontrollera huruvida något är lika med något annat så får man skriva ==, men vi kommer tillbaka till det om en stund. Det är viktigt att veta att man i MATLAB skiljer på små och stora bokstäver. Skriver jag "SKOSTORLEK", är detta alltså inte samma variabel som "skostorlek". Vi har nu fem variabler. Om vi skrev in dessa kommandon i kommandofönstret så finns detta variabler tillgängliga på MATLABs "globala nivå". Semi-kolonen på varje rad har inte riktigt den funktion som man kanske hade gissat. I Ada betyder ju semi-kolon att satsen är slut, här är det istället tvång på att varje sats måste stå på en egen rad. Själva semi-kolonet undertrycker den automatiska utskrift som MATLAB alltid gör när ett kommando exekveras. När man tilldelar variabler på detta sätt skulle MATLAB bara bekräfta detta genom att skriva ut variabelns värde om man inte hade haft semi-kolonet på slutet. I sina program vill man därför ofta ha semi-kolon efter alla satser, annars blir det hejdlöst många utskrifter! Jag återkommer till in- och utmatning om en stund. Om man nu verkligen vill låta en sats gå över flera rader så kan man bryta den, genom att skriva "...". Detta betyder att satsen fortsätter på nästa rad. Nästa stora skillnad från tidigare är att MATLAB inte är hårt typat. Det finns datatyper i MATLAB men variabler är inte begränsade till den typ de var från början. D.v.s jag kan nu utan problem göra detta: alder = 27.5; Det gamla värdet i variabeln "alder" försvinner och den får 27.5 istället. Hokus pokus - så har jag förvandlat en integer till en float. Vilket trolleri! Vi fortsätter och tittar på lite fler tilldelningar: pi = 3.14 x = pi / 2 y = sin(x) positive = abs(x * ­y) i = 3 / 2 i = ceil(3 / 2) i = floor(3.0 / 2.0) i = mod(3, 2) i = i + 1 i = '2' i = '0' + '1' b = true b = (i < 8) % En kommentar % i blir 97 % b blir 1 % b blir 0 Här behövs det förmodligen lite förklaring. Vi börjar uppifrån. Första tilldelningen är inget konstigt, vi skapar en ny variabel "pi" som vi sätter till 3.14. Det finns redan en variabel "pi" i MATLAB som är bra mycket mer precis än våra ynka två decimaler. Nu har vi dock tyvärr skrivit över den! Lyckligtvis kan man "glömma" variabler genom att använda kommandot "clear pi" eller "clear". Det senare "glömmer bort" alla variabler som man har skapat. Gör vi detta så får vi tillbaka vårt ursprungliga pi. Tilldelning nummer 2 hade inte gått så bra i ett hårt typat språk, men är nu helt okej. Tilldelning nummer 3 använder sig av den inbyggda funktionen sin (sinus-funktionen). Man behöver inte importera några paket i MATLAB, allt finns från start. Tilldelning nummer 4 använder sig av en annan inbyggd funktion abs (absolutbelopp). Tilldelning nummer 5 hade gett resultatet 1 i Ada - det är ju heltalsdivision. MATLAB är inte så kinkigt med detta och vi får helt enkelt 1.5. Tilldelning nummer 6 och 7 är exempel på avrundningar. nedåt och uppåt. I tilldelning nummer 8 använder vi operatorn mod. I MATLAB måste man dock anropa detta som en funktion med två parametrar. Tilldelning nummer 9 behöver ingen extra förklaring. I tilldelning nummer 10 ser vi återigen ett exempel på hur en variabel hux flux kan byta typ. Här ser vi också exempel på hur man skriver en kommentar i MATLAB. Tilldelning nummer 11 ser mystisk ut. Man kan faktiskt addera två tecken i MATLAB. I grund och botten representerar MATLAB allt data som flyttal om man inte explicit anger något annat. Alltså går det fin fint att skicka två tecken till operatorn '+'. Som svar får man summan av tecknens asciivärde. Vi kan även använda booleans i MATLAB, tilldelning 12 och 13 är exempel på detta. Värdena true och false är dock bara konstanter som står för talen 1 och 0. Vi går vidare och tittar nu lite på in- och utmatning. Det finns i princip två kommandon som är bra att känna till när man skall skriva ut data. Den första heter disp och kan hantera i princip vilken typ av data som helst. x = 199; disp(x); % Skriver ut 199 i % kommandofönstret Dessutom får man alltid en nyrad efter utskriften med disp. Disp är dock ganska primitiv, den klarar bara av att skriva ut en sak i taget. Vill man utföra lite mer intrikata utskrifter kan man använda sig av kommandot fprintf. fprintf tar alltid en sträng som första parameter. Strängen kommer att skrivas ut utan nyrad. Man kan dock tvinga fram en ny rad genom att inför tecknen "\n" någonstans i strängen. "\n" är en speciell markör som talar om att vi vill ha ett radslut där. Det finns andra markörer som gör att man kan infoga t.ex. tal i strängen: y = 2.5; z = 'pelle'; fprintf('%d är primtal,%3.3f är flyttal,\njag heter %s.', x, y, z); Vi får då utskriften: 199 är primtal, 2.500 är flyttal, jag heter pelle. Jag vill också påminna om det tredje sättet att skriva ut saker; att helt enkelt inte avsluta en sats med ett semikolon, då skriver MATLAB automatiskt ut resultatet. 315 % Skriver ut: % ans = % 315 Vad det gäller inmatning finns det egentligen bara ett kommando som ni behöver, input. N = input('Mata in ett tal: '); Här måste man komma ihåg att det som matas in måste vara ett korrekt MATLAB-uttryck. T.ex. måste strängar matas in med sina citationstecken. För det mesta behövs inte in- och utmatningsrutinerna dock, eftersom MATLAB-funktioner kan anropas direkt från kommandofönstret med sina parametrar, och det resultat som returneras automatiskt skrivs ut om semi-kolon inte används. Nu går vi vidare och tittar på fler satser. Vi börjar med if-satsen. Den ser ut på följande sätt: if Villkor Satser elseif Satser else Satser end; Precis som i Ada så kan "Satser" vara vilken sekvens av satser som helst. Det är också lätt att glömma att det heter "elseif" i MATLAB, inte "elsif" som i Ada. I övrigt ser det nästan precis ut som Ada, vi har tappat ett "then" och "if" efter "end", men man vänjer sig ganska snabbt vid detta. Vi tar direkt ett exempel: choice = input('Enter a number: '); if choice == 42 || choice == 9 some_text = 'right'; else some_text = 'wrong'; end disp(some_text); Här låter vi användaren mata in ett tal. Om talet är 42 eller 9 sätts variabeln some_text (som inte fanns sedan tidigare!) till 'right' och annars till 'wrong'. "||" innebär alltså eller. Märk också att jag behöver skriva två likmedstecken för att göra en matematisk jämförelse eftersom det enkla likmedstecknet används för tilldelning, lätt att göra fel på... Efter if-satsen skrivs texten ut. En intressant variant här är om vi byter "else" mot "elseif choice == 15". Om vi sedan tänker oss att användaren matar in något helt annat, t.ex. 0, då kommer vi varken gå in i den första if-grenen eller den andra. Detta innebär att variabeln some_text aldrig sätts till ett värde, och på så sätt inte finns när vi kommer ner till disp. Då kraschar programmet! Detta känns lite märkligt. Men ännu märkligare blir det om vi kör programmet igen och matar in 42 - då fungerar det som det skall igen. Om vi sedan kör programmet en tredje gång och matar in 0, då kraschar inte programmet utan texten "right" kommer ut! Det funkar den tredje gången eftersom variabeln some_text ligger kvar sedan en tidigare körning. På detta sätt fungerar det alltid om man kör kod direkt i kommandofönstret eller kör ett skript som man har skrivit. Lyckligtvis får man lokala variabler när man skriver funktioner, tillbaka till det senare. Vi kan kort titta på vilka operatorer som vi har tillgång till. Jag har redan nämnt "==" och "||" (lika med, resp. eller). Här är relationsoperatorerna: == ~= < > <= => Den enda som egentligen ser lite märklig ut är "skiljt ifrån", "~=". De logiska operatorer vi har är || eller && och ~ inte Dessa tre finns också som funktioner, or(villkor1, villkor2), and(villkor1, villkor2), not(villkor). Följande aritmetiska operatorer finns att leka med: + * / ^ .* ./ Vi kommer tillbaka till de sista två senare. Vi går nu vidare på loopar. Vi börjar med for-satsen som ser ut på följande sätt: for styrvariabel = intervall Satser end Ett konkret exempel på detta: for i = 1:4 fprintf('Styrvariabeln är %d\n', i); end % loop Då skrivs följande ut: Styrvariabeln är 1 Styrvariabeln är 2 Styrvariabeln är 3 Styrvariabeln är 4 Ett intervall har alltid formen N:M, där N <= M, eller N:S:M, där S är ett steg. Alltså kan man få i att hoppa fler tal åt gången, t.ex. genom att skriva i=1:2:10. Då får man talen 1, 3, 5, 7, 9. Man kan även få intervallet, och på så sätt också loopen, att gå baklänges genom att ha ett negativt steg. Då måste startvärdet vara större än eller lika med slutvärdet. T.ex. så här 5:-1:1 som ger 5, 4, 3, 2, 1. Man kan också stega med decimaltal om man vill. I övrigt fungerar for-satsen precis som i Ada med undantaget att styrvariabeln i även finns efter att loopen gått klart. Som ni ser så har jag själv lagt till kommentaren % loop efter for-satsens "end". Personligen tycker jag att det blir ganska rörigt med alla "end" i MATLAB-kod, därför markerar jag vad det är för något jag "endar". Samtidigt blir koden ännu mer lika Ada, vilket jag tycker är positivt. I MATLAB finns även while-satsen. while Villkor Satser end Den är helt analog med den while som finns i Ada. Det finns dock ingen "loop"-loop i detta språk. Vill man ha en evig loop får man alltså göra en while med ett villkor som alltid är sant, t.ex. X==X, eller 1==1, eller helt enkelt bara "true". while true disp('Jag älskar dig!'); end % loop Det finns även ett till alternativ här. Man kan faktiskt skriva en for-sats och sätta intervallet från 1 till oändligheten. Man brukar dock få en varning när man sedan kör koden. En sådan for-sats kan vara praktisk för eviga loopar där man även vill ha en varvräknare. for i = 1:inf fprintf('Jag älskar dig'); end % loop Även här finns det en sats för att avbryta en loop inifrån (som Adans "exit"), men här heter den break. Det finns också en sats som heter continue. När man kommer till en sådan sats inne i en loop så går man direkt upp till början av loopen igen. Här kommer ett exempel: A = 10; while A > 0 disp(A); A = A + 1; if mod(A, 2) == 0 continue; elsif A == 7 break; end % if A = A ­ 2; end % loop Hur många varv går denna loop? Rätt bökigt. Mitt tips är att undvika framförallt continue men också break så mycket som möjligt. Alla satser som gör konstiga hopp i koden är av ondo, det är kanske därför continue inte finns i Ada... Nu går vi över till underprogram. I MATLAB finns det bara funktioner. Man kan dock anropa en funktion utan att ta hand om returvärdet, d.v.s. så som man hade skrivit en procedur i Ada. Y = sin(X); sin(X+pi/2); Båda dessa är tillåtna i MATLAB, de är båda anrop till funktionen sin. Vi kommer dock inte få se resultatet av det undre anropet, p.g.a. semikolonet. Funktioner placeras i separata filer, precis som skript. Det som skiljer en funktion från ett skript rent syntaktiskt är att funktionen har ett funktionshuvud längst upp i filen. Här är två exempel: function funktionsnamn Satser end function ret = namn(para1, para2) Satser end Parametrarna skrivs som vanligt i en parentes efter funktionens namn. Eftersom datatyper inte är något som MATLAB egentligen befattar sig med så skriver man inte ut något i den stilen. "in" eller "out" behöver man inte heller fundera på, alla parametrar är "in". Jag repeterar detta sista: det finns inga out-parametrar i MATLAB. Allt som kommer tillbaka från en funktion måste returneras. I MATLAB returnerar man dock inte explicit med satsen return utan använder en returvariabel. Namnet på returvariabeln skrivs i fuktionshuvudet innan namnet på funktionen och ett likmedstecken. I MATLAB fungerar det som så att man sätter returvariabeln till det värde som man vill returnera, när man sedan kommer ner till "end" i funktionen så returneras värdet automatiskt. Man kan faktiskt använda satsen return, men utan värde. Den hoppar direkt ned till slutet av funktionen bara. Både returvariabel och parametrar är frivilligt. Man kan alltså ha en funktion som bara har parametrar: function min_funktion(para1, para2) Satser end Eller bara returvariabel: function returvariabel = min_funktion Satser end Namnet på filen som funktionen ligger i skall vara samma som namnet på funktionen plus ".m". Det senaste exemplet skulle alltså ligga på filen min_funktion.m. Anrop till funktioner ser precis ut som i Ada. D.v.s. man skriver helt enkelt namnet på funktionen och har eventuella aktuella parametrar inom parentes efteråt. Värdet som returneras från funktionen kommer att byta plats med anropet, precis som vi är vana vid. Vi tar ett till exempel: function summa = plus(tal1, tal2) summa = tal1 + tal2; end % plus Denna funktion, som ligger på filen plus.m, kan alltså anropas från kommandofönstret, från ett skript eller från en annan funktion på något av följande sätt: Z = plus(15, 3); plus(Z, 2) plus(1, plus(2, 3)) % Z blir 18 % 20 skrivs ut % 6 skrivs ut Eftersom det inte finns out-parametrar i MATLAB kan det vara besvärligt när man vill få tillbaka flera värden från en funktion. Det finns dock möjlighet att returnera flera värden i MATLAB om man använder klamrar, både i funktionshuvudet och anropet. Här är ett exempel på detta: function [a b] = swap(a, b) c = a; a = b; b = c; end % swap Exempel på anrop till swap: Tal1 = 3; Tal2 = 7; [Tal1, Tal2] = swap(Tal1, Tal2); disp(Tal1); % 7 Skrivs ut disp(Tal2); % 3 Skrivs ut Skulle man anropa en sådan funktion utan klamrarna så får man endast ut det första returvärdet. Som nämnt tidigare är de variabler som skapas inuti en funktion lokala variabler. D.v.s. de kommer endast att existera medan funktionen körs, de ligger inte kvar tills senare. Inuti funktionen kan man heller inte komma åt de variabler som ligger på MATLABs "globala" nivå. Detta är bra då undviker man att konstiga beroenden byggs upp mellan funktionen och den miljö i vilken funktionen exekveras. Om vi nu jämför med skript så är dessa precis tvärt om. De har alltid tillgång till de globala variablerna och kan inte heller ta parametrar eller returnera resultat. Vill man göra ett ordentligt program är det därför oftast bättre att skapa sig en riktig funktion. Man kan lägga flera funktioner på samma fil. Det är behändigt när man vill göra underprogram, till sina underprogram. Det är bara att rada upp dessa underfunktioner under den första funktionen i filen. Man måste då komma ihåg att dessa underfunktioner bara är åtkomliga inom filen. Jag vill passa på att nämna att MATLAB har en bra hjälp-funktion. Skriver man help i kommandofönstret så får man en rad topics att välja bland. Man kan också gå direkt för hjälpen för ett specifikt kommando om man skriver namnet på kommandot efter help. Nu går vi raskt vidare och kollar lite på vektorer. Vektorer i MATLAB är lika de fält/arrayer som vi har jobbat med i Ada. Precis som i Ada kan man ha vektorer med olika innehåll. Man kan ha vektorer av heltal, vektorer av tecken (strängar) o.s.v. En vektor kan ha mer än 1 dimension, i sådana fall kallar vi det för en matris. Att skapa en vektor är inte svårt, man tilldelar helt enkelt en variabel flera värden som man har inom klamrar: v = [ 1 2 3 4 5 ]; v = [ 1, 2, 3, 4, 5 ]; Man kan ha komman mellan varje element, eller inte, resultatet blir detsamma. Värt att veta är att MATLAB skiljer på rad och kolumnvektorer. Dessa två exempel blir båda radvektorer. Man kan skapa en kolumnvektor genom att skilja elementen med ';'. v = [ 1; 2; 3; 4; 5 ]; Eller genom att skriva elementen på egna rader: v = [ 1 2 3 4 5]; De intervall som vi talade om i samband med for-satsen är egentligen också sätt att skapa vektorer på. v = 1:5; v = 1:2:10; v = 5:­1:1; % v blir [1 2 3 4 5] % v blir [1 3 5 7 9] % v blir [5 4 3 2 1] Vi kan se dessa som "snabbsätt" att skapa vektorer som ökar eller minskar. Det finns två inbygda kommandon för att skapa vektorer av bara nollor resp. ettor. v = zeros(1,5); v = ones(5,1); % v blir [0 0 0 0 0] % v blir [1 1 1 1 1] Den första parametern anger alltså hur många rader man vill ha, och den andra hur många kolumner man vill ha. Man kan även skapa en tom vektor så här: v = []; Hakparenteserna innebär en sammanslagning av element. Vi kan ta ett par exempel till: a = 1:5; b = 6:9; v = [a b] v = [v 10] % v blir [1 2 3 4 5 6 7 8 9] % [1 2 3 4 5 6 7 8 9 10] En flerdimensionell vektor (matris) följer samma principer. m = [ 1 2 3; 4 5 6; 7 8 9]; m = [ 1:3; 4:6; 7:8]; m = [ 1 2 3 3 4 5 7 8 9 ]; ones(3) ones(3,3) % båda dessa ger matrisen % [ 1 1 1 1 1 1 1 1 1 ] Utöver detta finns det många andra spännande kommandon: % Skapa enhetsmatris m = eye(3) % m blir [ 1 0 0 0 1 0 0 0 1 ] % Skapa diagonalmatris m = diag([1 2 3]) % m blir [ 1 0 0 0 2 0 0 0 3 ] % Rotation medurs m2 = rot90(m) % Transponat m3 = m2' % m2 blir [ 0 0 1 0 2 0 3 0 0 ] % m3 blir [ 0 0 3 0 1 0 2 0 0 ] Att få ut saker ur vektorer med indexering är också inget som skiljer sig särskilt från i Ada. v = [2 4 6 8 10]; v(1) v(2:3) v([1 5]) v([5 1]) v(5:­1:1) v = [3 1 2]; v(v) % ger 2 % ger [ 4 6 ] % ger [ 2 10 ] % ger [ 10 2 ] % ger [ 10 8 6 4 2 ] disp(v(6)) % Ger FEL! Det finns inget % 6:e element! v(6) = 12; % Helt OK. % v blir [3 1 2 0 0 12] % ger [ 2 3 1 ] Motsvarande för matriser: m(r, k) % Ger elementet på rad r och % kolumn k i matrisen m. m = [ 1 2 3; 4 5 6; 7 8 9]; m(2:3, 2:3) % Ger raderna 2 till 3, och % kolumnerna 2 till 3, dvs: % [ 5 6 % 8 9 ] Man kan använda ordet "end" för att referera till matirsen (eller vektorns) sista kolumn eller rad. m(end, end) % Elementet i det lägre % högra hörnet i m (9). m(1, 1:end) % Ger Översta raden [1 2 3] Om man indexerar med intervall så kan man utelämna siffror i intervallet. Då tolkas detta som första resp. sista indexet. m(2:, :2) % Ger raderna 2 till 3, och % kolumnerna 1 till 2, d.v.s % [ 4 5 % 7 8 ] m(:, 3) % Ger alla rader, och 3:e % kolumnen: % [ 3 % 6 % 9 ] Med vektorer kan vi plocka ut exakt de rader och kolumner som vi vill ha ur matrisen. m([1 3], 2) % Ger [ 2 % 8 ] m([1 end], [1 end]) % Ger [ 1 3 % 7 9 ] Fler skojjiga saker: m = [ 1 2 3 4 5 6 ] l = length(m); % ger största % dimenisionen, d.v.s. 3 n = numel(m); % ger antal element, 6 s = size(v); % ger [ 2 3 ] size(v, 1) size(v, 2) % ger antalet rader, 2 % ger antalet kolumner, 3 Vi kan nu gå vidare och titta lite på hur man kan räkna med vektorer och matriser. Det är här som MATLAB verkligen glänser. v1 = [ 1 2 3]; v2 = v1 * 2; v2 = v1 * v1; v2 = v1 * v1'; v2 = v1 .* 2; v2 = v1 .* v1; v2 = v1' * v1; % v2 blir [ 2 4 6 ] % Fel! (?) % v2 blir 14 % v2 blir [ 2 4 6 ] % v2 blir [ 1 4 9 ] % v2 blir [ 1 2 3 2 4 6 3 6 9 ] v2 = v1 ./ v1; % v2 blir [ 1 1 1 ] v2 = v1 / 2; % blir [ 0.5 1.0 1.5 ] sin(v) cos(v) sum(v1) prod(v1) % [ 0.8415 0.9093 0.1411 ] % % Summan av talen i v1 (6) % Produkten av v1 (6) Operatorerna .* och ./ är alltså "elementvis" multiplicering/division. Då tar man element för element och applicerar den skalära operationen. Kan vara pratkisk i vissa fall. Som ni ser klarar också MATLABs inbyggda kommandon så som sin, cos m.fl. att ta matriser som indata. Vi avslutar med att prata kort om ett av MATLABs verktyg för att visualisera data, nämligen plot. Med kommandot plot kan man rita grafer och figurer. När man anropar kommandot plot kommer det att öppnas ett nytt fönster där figuren hamnar. Nästa anrop till plot hamnar i samma fönster, och den gamla figuren försvinner. Om man vill kan man ändra detta beteende så att figurerna kombineras, det gör man genom att använda satsen "hold". Sätter man "hold" till "on" så kommer nästa figur att ritas ovanpå den gamla. Med "hold off" kommer nästa utritning att återigen få den föregående att försvinna. Vi tar två exempel: plot(x, y); plot([0 1 1 0 0], [0 0 1 1 0]); Om parametrarna till plot är skalärer plottas det bara ut en punkt. Då vektorer skickas så dras det en linjer mellan varje par av koordinater. Den andra satsen kommer att rita ut en kvadrat. Vill man modifiera utseendet, t.ex. byta färg till rött, och få linjen sträckad, så kan man ange en formateringssträng efter de två första parametrarna. plot([0 1 1 0 0], [0 0 1 1 0], 'r­­x'); Med detta blir linjerna röda och streckade, punkterna markeras med kryss. Man kan skicka fler parametrar till plot, för att göra mer avancerade figurer... t = 0.0:0.01:2*pi; u = 0:72:360; plot(cos(t), sin(t), 'r', ... cosd(u), sind(u), 'b'); Dessa tre satser kommer tillsammans att rita ut en röd cirkel med en blå regelbunden femhörning inuti. Vill man visualisera en matris kan man använda kommandot imagesc, detta är praktiskt i er laborationsuppgift "Game of Life".