• No results found

Att spara och läsa tillbaks innehållet i workspace

Litet om program, villkorssatser, flödeskontroll och funktioner

5.2 Att spara och läsa tillbaks innehållet i workspace

Om man sitter mitt i en komplicerad beräkning i MATLAB kan det vara väldigt besvärligt att avbryta arbetet eftersom MATLABs workspace innehåller alla variabler som är definierade och deras värden.

Har vi knappat in priserna för femton olika godissorter så vill man inte gärna ha det arbetet ogjort och

7 Att "välja" i en meny som den ovan innebär att vi klickar en gång på den rad vi vill välja. Om all går som det ska visas den valda raden mot en mörk bagrund.

börja om igen bara för att kompisen vill att man skall logga ut och följa med och fika. I dylika nödsituationer kan man spara hela innehållet i MATLABs workspace till en diskfil. När man sedan vill återuppta arbetet kan man läsa in filens innehåll till MATLABs workspace och enkelt fortsätta med precis samma omgivning som man hade innan man gjorde paus. Sparar man workspace i en AFS-monterad katalog som kan nås från alla datorer så kan man till och med fortsätta på vilken dator som helst.

För att spara innehållet i workspace ger man helt enkelt kommandot save filnamn i kommandofönstret. Innehållet i workspace sparas då till en fil med namnet "filnamn.m" i den aktuella katalogen (matlab lägger automatiskt till ändelsen ".m"). För att läsa tillbaks innehållet i filen till workspace ger man kommandot load filnamn (utan ändelse). För att detta skall fungera måste filen "filnamn" finnas antingen i den aktuella katalogen eller i någon av de kataloger som ingår i MATLABs sökväg.

Ett bättre sätt att göra dessa operationer, bättre för att det är lättare att kontrollera i vilken katalog filen hamnar, är att i "File" menyn välja "Save workspace as". I den dialogrutan som då kommer upp kan man välja både vilket namn man vill ge filen och i vilken katalog den skall sparas. Det omvända kommandot är "Import Data" i file menyn som öppnar en dialogruta där man kan ange vilken fil som skall laddas in i workspace.

5.3 M-filer

Det absolut smidigaste sättet att använda MATLAB är att konsekvent jobba med så kallade "m-filer". I en m-fil kan man skriva in alla kommandon man kan skriva i MATLABs kommandofönster och spara dessa till hårddisken. När man sedan skriver namnet på m-filen i MATLABs kommandofönster så utförs alla kommandon som står i filen och resultatet visas i MATLABs kommandofönster. Genom att utnyttja m-filer kan vi spara en otrolig mängd arbete. Vi kan till exempel skriva in alla rådata från en laboration i en m-fil, sedan steg för steg skriva in alla operationer för att göra mätvärdesbehandling på laborationen. Därefter skriver vi in de kommandon som krävs för att producera de grafer vi skall redovisa i laborationsredogörelsen. Vi kan när som helst i den här processen ta paus, spara filen till disk och fortsätta vid ett senare tillfälle. Det är också enkelt att ändra ett enstaka kommando om man har fått någon formel om bakfoten, eller om man vill ändra någon detalj i ett histogram.

Det bästa man kan göra som student är att bygga upp ett förråd av små m-filer som gör avgränsade uppgifter, till exempel en anpassning till en andragradskurva eller en beräkning av chi-kvadrat.

Eftersom en m-fil kan kalla en m-fil kan filer som utför klart definierade uppgifter enkelt återanvändas när liknande problem skall lösas.

5.3.1 Editorn för M-filer

MATLAB har ett särskilt fönster som används för att skapa och ändra m-filer. Du kan hitta fullständig information om MATLABs editor vid

?/MATLAB/Using¬MATLAB/Development¬Environment/Editing¬and¬Debugging¬M-files,

här ger vi den information som behövs för att komma igång och jobba. Det finns många sätt att starta verktyget:

• Om vi klickar på ikonen som visar ett tomt vitt pappersark längst till vänster i verktygslisten öppnas editerings önstret och vi kan börja skriva in våra kommandon. Startar vi editorn på det här sättet finns inget filnamn definierat för den nya m-filen, så när vi sparar filen kommer MATLAB

att begära att vi anger ett namn.

• I menyn "File" klickar vi på "New" och sedan "M-file" för att uppnå samma resultat.

• I kommandofönstret skriver man "Edit" för att få upp ett fönster och en ny fil.

• Alternativt kan man i kommandofönstret skriva "Edit filnamn". Om det existerar en fil med det namnet någonstans inom MATLABs sökväg så öppnas denna. Om inte så presenterar MATLAB en dialogruta där vi får svara på om vi vill skapa en ny fil med det namnet. Svarar vi nej så öppnas inget editor-fönster.

Låt oss börja med att säga hej, öppna editorn för m-filer på något av ovanstående sätt. Skriv sedan in raden:

disp ('Hej Världen') 5.3.2 Att spara en m-fil på disk

Hela poängen med att skapa en m-fil är ju att den skall sparas på hårddisk. För att göra det går vi in i

"File" menyn och väljer "Save". Om filen vi vill spara är nyskapad och inte har något namn så kommer MATLAB att öppna en dialogruta där vi kan ange filens namn och i vilken katalog den skall ligga. Har vi ändrat i en redan existerande fil så sparas den ändrade versionen med samma namn som den ursprungliga. Observera att det här innebär att den ursprungliga versionen är förlorad för gott. Det kan därför vara klokt, särskilt om man vill ändra i en komplicerad redan fungerande fil, att istället för att spara den med samma namn som förr spara en kopia med ett annat namn så att den ursprungliga, oförändrade versionen av filen finns kvar på hårddisken. Detta gör man genom att istället för att ange

"Save" väljer "Save as…" under "File"-menyn. Vi får även i det här fallet upp dialogrutan där vi kan välja namn och katalog för filen. När man väl har introducerat alla ändringar och fått dem att fungera som man önskar kan man slänga den gamla filen och döpa om den nya till det gamla namnet om man så önskar.

En genväg för att spara filen är att klicka på diskett-symbolen i verktygsraden. För en ny fil får vi då upp dialogrutan och kan välja namn och katalog, en gammal fil sparas med det gamla namnet.

Ta nu och spara din första m-fil genom någon av metoderna ovan. Lägg filen i en lämplig katalog (kanske "MATLAB/pass2" ?) på din afs-area. Ge filen namnet "hej". Du behöver inte själv lägga till ändelsen ".m" det sköter MATLAB själv.

5.3.3 Läsa in och köra en m-fil

Enklaste sättet att köra en m-fil är att bara skriva dess namn i kommandofönstret. Om filen finns antingen i den aktuella katalogen eller i någon katalog i sökvägen8 så kommer de kommandon som finns i filen att utföras. Prova:

>> hej Hej Världen

Du kan också köra en m-fil direkt från editor-fönstret genom att antingen klicka på symbolen till höger eller också gå till menyn "Debug" och välja "Run". Om det finns ändringar i

editor-fönstret som inte är sparade till hårddisk (detta markeras genom en asterisk brevid filnamnet högst upp

8 Minns att om det finns fler filer med samma namn i olika kataloger som finns i sökvägen så väljer matlab den som kommer först. Om resultatet inte blir vad man tänkt sig kan det bero på att det finns en namne till den fil vi egentligen vill köra.

på listen till editor-fönstret) så sparas först filen till disk innan kommandona utförs. När man håller på och jobbar med en komplicerad m-fil som till exempel när man vill få ett visst utseende på en graf och håller på och provar sig fram så är det bekvämt att köra filen från editor-fönstret på det här sättet.

5.3.4 Kommentarer.

I princip är det ingen skillnad på hur MATLAB hanterar kommandon som skrivs in i kommandofönstret och kommandon som läses in via en m-fil. Det finns ändå ett antal kommandon som man knappast använder i kommandofönstret men som spelar en stor roll när vi jobbar med m-filer. Viktigast av dessa är ett av de allra viktigaste MATLAB kommandot - kommentarer.

Kommentarer inleds med ett procent-ecken "%" och följs av godtycklig text. När MATLAB utför kommandon ignorerar programmet procenttecknet och vad som följer efter det. Syftet med kommentarer är att det skall göra det enklare att titta i en m-fil och kunna följa med vad programmet gör, och hur. Detta är användbart både om man använder program skrivna av andra, men också när man ett år senare (kom ihåg att ni skall spara alla era gamla m-filer!) återvänder till filer man själv har skrivit, det kan vara nog så svårt att minnas vad man själv tänkt och gjort! Kommentarer används

• som en varudeklaration i början av ett program (i det här sammanhanget är en m-fil att betrakta som ett program) för att beskriva vad programmet gör, vad det heter, vem som har skrivit det och när, samt om programmet behöver någon speciell typ av indata eller levererar någon speciell typ av ut-data.

• för att beskriva vad de viktigaste variablerna står för

• vad de olika programstegen utför

Det går nästan alltid att med ett snabbt ögonkast skilja ett program skrivet av en van programerare från ett skrivet av en nybörjare, även om man inte begriper ett skvatt av programmet gör. Eftersom en av skillnaderna ofta är mängden kommentarer en duktig programmerare skriver mycket kommentarer -så kan man ibland frestas att skriva en kommentar för även triviala steg, vilket inte underlättar läsningen. Exakt hur mycket och vilka avsnitt som skall kommenteras kan vara en smaksak, men ett exempel som författaren tycker är rimligt kan vara:

%---% Volume.m

%

% Beräknar volymen för cylindrar baserat på

% mätt radie och angiven höjd

% Sten Hellman 2002-03-03

%---Radie = [10.2 14.5 17.6 25.3 30.6 43.5]

Hojd = [12.5 22.4 44.5 47.6 54.4 88.4]

Volym = pi*Radie.^2 .* Hojd

%

% Felet i radien är konstant 0.3, felet i höjden

% är 10% av mätetalet

%

DeltaRadie = 0.3 * ones(1,6) DeltaHojd = 0.1 * Hojd

DeltaVolym = Volym * sqrt( (DeltaRadie ./ … (2*Radie) ).^2 +(DeltaHojd ./ Hojd).^2) Däremot vore till exempel

%

% Volymen är pi * r-kvadrat * höjden

%

Volym = pi*Radie.^2 .* Hojd

en överdrift som knappast gör det enklare att följa koden.

5.3.5 In- och Utmatning av data till en m-fil.

En annan skillnad mellan att skriva m-filer och ge kommandon direkt i kommandofönstret är hur data matas in i MATLAB och hur de presenteras för den som utför ett kommando. Kommandot disp är ju till exempel oftast inte särskilt meningsfullt i kommandofönstret. Att få MATLAB att skriva "Hallo World" genom att själv skriva precis samma sak i argumentet till kommandot disp är ju måttligt intressant. I en m-fil som man kör är kommandot däremot mycket nyttigt eftersom det kan användas för att skriva information i kommandofönstret som kan ange resultat av beräkningar eller ange att vi skall mata in information till MATLAB. Vi kommer snart att märka att det finns ett behov av att kunna mata in data till en körande m-fil och att skriva ut data från filen till kommandofönstret. Man kan till exempel tänka sig att m-filen i avsnitt 5.3.4 istället för att beräkna volymen av ett antal cylindrar där vi skriver in radie och höjd i m-filen skriver en mer allmän m-fil som kan användas för att beräkna volymen av en godtycklig cylinder. En sådan m-fil behöver då ha en metod för användaren att mata in ett godtyckligt värde på radien och höjden, och en metod att mata ut resultatet från beräkningen i kommandofönstret. Vi kommer att lära oss hur det går till i avsnitt 10.2 nedan där vi går igenom så kallad formatterad in- och utmatning. Men redan innan vi lärt oss detta kan vi kommunicera med m--filer genom att utnyttja att mm--filer och kommandofönstret använder samma workspace. Om vi till exempel kör m-filen ovan för att beräkna cylindervolymer så kommer variabeln Volym som innehåller resultatet att finnas kvar i workspace. Vi kan alltså genom att skriva Volym i kommandofönstret se resultatet av beräkningen. Omvänt kan man tänka sig att ta bort raden

Radie = [10.2 14.5 17.6 25.3 30.6 43.5]

ur m-filen och istället innan vi kör m-filen tilldela värden i kommandofönstret. Eftersom Radie då existerar i workspace kommer m-filen att fungera precis som vanligt. På det sättet går det enkelt att köra om filen med olika värden på radien, det är bara att skriva in nya värden på Radie.

5.3.6 Utskrift när m-file kör - Echo kommandot.

När MATLAB kör en m-fil så skriver programmet ut varje kommando i kommandofönstret, följt av svaret på kommandot. Det här kan vara väldigt bra om vi sitter och jobbar med en m-fil som ännu inte fungerar som det var tänkt. Men för en fungerande och litet komplicerad m-fil kan det var väldigt irriterande, kommandofönstret fylls av information som man ofta inte är intresserad av. För att styra detta kan man använda kommandot echo. Skriver vi echo off stängs repetitionen av varje kommando av, skriver vi echo on så sätts den på igen. Fullständig dokumentation av kommandot får du om du skriver help echo.

Att sätta echo till off innebär att vi inte behöver se varje kommando upprepas på skärmen, men fortfarande så kommer MATLAB att visa resultaten, om vi till exempel kör en m-fil med kommandot

Radie = [10.2 14.5 17.6 25.3 30.6 43.5]

med echo on så ser vi

Radie = [10.2 14.5 17.6 25.3 30.6 43.5]

Radie =

10.2 14.5 17.6 25.3 30.6 43.5 i kommandofönstret. Har vi däremot satt echo till off så ser vi

Radie =

10.2 14.5 17.6 25.3 30.6 43.5

i kommandofönstret. Även för en fungerande m-fil kan det vara bra att se vilka värden de viktigaste variablerna har, men vi vill förmodligen inte se alla variabler och vilka värden de antar. För att slippa detta använder vi samma knep som när vi skrev in kommandon direkt i kommandofönstret - vi avslutar raden med semikolon.

5.3.7 Namngivning av m-filer

En viktig detalj att tänka på är att en m-fil inte skall ha samma namn som en variabel som förekommer i filen. Det är lätt hänt att man ger både filen och den viktigaste variabeln ett namn samma namn -som anknyter till den uppgift programmet skall lösa. Det här kan leda till mycket förvirrning. Antag till exempel att vi i avsnitt 5.3.4 hade kallat m-filen volym. Första gången vi kör filen går allt väl, men om vi därefter ändrar någon liten detalj i programmet och försöker köra om så ser vi antagligen inte alls det vi förväntar oss. Orsaken är att programmet själv skriver in vektorn volym i MATLABS

workspace. Nästa gång vi försöker köra programmet med samma namn kommer matlab inte att tolka volym som en referens till programmet, utan till vektorn och som respons på kommandot kommer den att skriva ut innehållet i vektorn. Om ni någon gång sitter och försöker ändra i en m-fil men förändringarna inte slår igenom kan det därför vara idé att kontrollera om det finns en variabel med samma namn som m-filen.

5.4 Villkorssatser

Det är mycket vanligt att ett program skall utföra olika saker beroende på om vissa villkor är uppfyllda eller inte. Varje förgreningspunkt i ett flödesschema svarar mot ett sådant villkor, så till exempel skall vårt program som beräknar primfaktorer göra olika saker beroende på om divisionen går jämnt upp eller inte. Den enklaste formen av en villkorssats har formen:

if (test) ….

end

där test är en logisk test som är sann eller falsk. Om test är sann utförs koden mellan if och end, annars hoppas det avsnittet över. Enklare villkorssatser kan skrivas på bara en rad om man så önskar, med komma emellan kommandona:

if (test), …… , end

Man kan även specificera vad som skall hända om test är falsk genom konstruktionen if (test)

… kod 1 else

… kod 2 end

i det fallet utförs …kod 1 om test är sann, annars …kod 2. Slutligen kan man utföra fler tester med konstruktionen

I en sådan konstruktion utförs den kod som följer efter den första test som är sann, är test1 falsk men test2 sann utförs …kod 2 och så vidare. Om ingen av testerna är sann utförs …kod 4. En viktig sak att komma ihåg är att endast ett parti kod utförs, om fler av testerna är sanna så utförs det kodparti som svarar mot den av de sanna testerna som kommer först i konstruktionen. Är både test1 och test3 sanna i exemplet ovan så utförs bara …kod 1, inte …kod 3.

En test byggs upp av någon av 6 relationsoperatorer:

a < b är sann om a är mindre än b

a <= b är sann om a är mindre än, eller lika med b

a == b är sann om a är lika med b (notera att vi inte kan skriva a = b, det kommandot sätter a till samma värde som b har)

a >= b är sann om a är större än eller lika med b a > b är sann om a är större än b

a ~= b är sann om a inte är lika med b

Ett enkelt exempel på villkorssatser är villkorade utskrifter från ett program:

if (x>0)

disp('x är större än noll')

elseif(x<0)

disp('x är mindre än noll') else

disp('x är lika med noll') end

Man kan också kombinera ihop två tester med hjälp av logiska operatorer:

& logisk och a & b är sann om både a och b är sanna

En mycket viktig komponent i datorprogram är slingor, där monotona repetitiva moment upprepas på ett automatiskt sätt. Tag som exempel serieutvecklingen av cosinus-funktionen:

Skall vi för hand göra denna uträkning på en miniräknare måste vi räkna ut varje term för sig och sedan summera alla termer i ett register. Men allt som kan skrivas som en summa på ett så regelbundet sätt som den här formeln kan också kodas på ett enkelt sätt i datorprogram genom att använda så kallade slingor (engelska loop). Det finns två typer av slingor i matlab: for-slingor och while-slingor.

5.5.1 for-slingor

Koden mellan första och sista raden utförs en gång för varje värde på i som anges i första raden. En uträkning av de första tio termerna i serieutvecklingen av cosinus kan skrivas som:

x=pi/4;

(För att beräkna fakulteten använder vi funktionen prod(x) som beräknar produkten av alla element i en vektor x). Att det här är ett fantastiskt ekonomiskt sätt att koda framgår av att det enda vi behöver göra om vi vill tiofaldiga antalet termer i summan är att ändra i=1:9 till i=1:99. Variabeln i

99 Namnet på index-variabeln är godtyckligt, "index" är bara ett möjligt alternativ. För klarhets skull bör man kanske undvika i, eftersom det också är en inbyggd variabel (roten ur -1).

slingan, i det här fallet "index", behöver inte delta i de matematiska operationerna, man kan till exempel räkna till tio genom att använda slingan

summa = 0;

for i=1:10

summa = summa + 1;

end

En annan sak vi noterar är att variabeln behöver inte räknas upp med ett för varje varv i slingan, i=0:2:10 är en legitim konstruktion. Vi behöver inte ens använda heltal, i=0.2:0.1:0.7 är också en möjlig sling-variabel.

5.5.2 while-slingor While slingor har forment while (test)

….

….

end

Där test är något villkor som kan utvärderas, som till exempel i<4, sqrt(x)>sin(x) osv.

Koden i en while-slinga utförs så länge villkoret i test är sant. Det här betyder för det första att vi måste initialisera de variabler som ingår i testen innan while-slingan startar, och för det andra att det är vårt eget ansvar att de variabler som ingår i testen förändras inuti den kod som utförs mellan while och end. Tag till exempel slingan

x=2;

sum=0

while (x<4) sum=sum+1;

end

Denna slinga kommer aldrig att ta slut! Eftersom x är mindre än två när slingan börjar så går vi in i slingan. Men eftersom x inte ändras inuti slingan kommer villkoret alltid att vara sant så slingan kommer bara att fortsätta i all oändlighet. Vi måste alltså tänka oss för när vi använder while-slingor så vi inte får programmet att hänga. (Skulle du någon gång behöva avbryta matlab i en beräkning som spårat ut, t ex genom att fastna i en oändlig loop så gör man det genom att gå till kommandofönstret och där trycka på control-c, dvs control och c samtidigt. Programmet avbryter då vad det håller på med och lämnar tillbaka kontrollen till kommandofönstret). While-slingor är användbara i situationer där vi inte i förväg kan förutsäga hur många varv vi måste löpa igenom en slinga. En sak som gör while-slingor så användbara är att villkoret inte behöver vara ett villkor på en enstaka variabel, utan kan vara mer komplext. Antag till exempel att vi vill undersöka hur många termer vi måsta ta med i summan för cosinus innan skillnaden mellan summan och det verkliga värdet är mindre än något givet värde epsilon. Detta kan vi koda på följande sätt:

x= pi/4; epsilon=1*10^-6;

cosinus=1;

index=1;

while (abs(cos(x)-cosinus) > epsilon)

c o s i n u s = c o s i n u s + ( - 1 ) ^ i n d e x * x^(2*index) / prod(1:2*index);

index=index+1;

end

out= 'Serien konvergerade efter';

disp(out); index

disp(out); index

Related documents