• No results found

namn, inklusive katalogtillhörigheten. Den andra saken vi måste förstå är något som kallas "den atlab

N/A
N/A
Protected

Academic year: 2022

Share "namn, inklusive katalogtillhörigheten. Den andra saken vi måste förstå är något som kallas "den atlab"

Copied!
14
0
0

Loading.... (view fulltext now)

Full text

(1)

5 Pass 2 – Datorer, filnam och mer beräkningar

I det här passet skall vi lära oss litet allmänt om hur datorprogram fungerar och hur de hanterar data på hårddisk och i minnet. Men framför allt skall vi lära oss att använda M-filer och spara dessa på disk.

Vi lär oss mer om hur matlab hanterar vektorer och matriser och börjar göra litet mer avancerade beräkningar.

5.1 Att navigera på datorn

Att hålla ordning på alla filer som skapas under ett projetkt, som till exempel en laboration eller en matlabövning kräver litet disciplin. Det är naturligtvis extra viktigt att man tänker sig för i en miljö som den på övningslab, där många användare använder samma dator. Innan vi går igenom hur man bör arbeta gör vi först en allmän genomgång över hur program på en dator hanterar disk och minne.

5.1.1 Minne och hårddisk på en dator

Ett program som kör på en dator hanterar två typer av information, dels "instruktioner" - det vi i dagligt tal kallar programmet, som styr programmet och på lägsta nivån talar om för programmet hur det skall utföra olika kommandon, dels "data" som är vad programmet opererar på. Sett ur det här perspektivet håller ett program som matlab när vi till exempel skriver "2 + 2" reda på två saker: dels vad instruktionen "x + y" innebär och hur matlab skall genomföra den operationen, denna information är det vi kallar instruktioner. Sedan måste programmet också hålla reda på vad "x" och "y" är i just den aktuella beräkningen, och spara svaret någonstans, den typen av information kallas "data". Den här informationslagringen kan ske på två ställen, antingen på hårddisken eller i datorns internminne. Det finns några skillnader i egenskap hos dessa två lagringsmedia: hårddisken är permanent, i betydelsen att så länge allting fungerar som det skall så finns all information som lagras på hårddisken kvar så länge som man inte uttryckligen raderar den. Internminnet å andra sidan är temporärt i två avseenden, dels så "överlever" ingen information i internminnet att datorn stängs av, men det är till och med så att det ett program som matlab avslutas så raderas all information som programmet sparade i minnet. En annan skillnad mellan hårddisk och internminne är att det går mycket snabbare att komma åt data som finns i minnet (oftast talar man om internminnet som bara "minnet") än på disken.

Med det här som bakgrund kan vi nu förstå litet bättre vad som händer när vi kör matlab. Eftersom matlab måste finnas kvar varje gång vi startar datorn så måste själva programmet finnas lagrat på hårddisken. Men eftersom det tar lång tid att hämta instruktioner som finns lagrade på hårddisken så vill man inte att programmet skall gå och hämta varje instruktion för sig från hårddisken, det skulle dels göra programmet mycket långsamt och dels skulle datorns disk stå och surra hela tiden. Ett program som startar reserverar därför ett stycke minne för instruktioner och kopierar in de mest centrala dit och läser dem direkt därifrån. Skulle matlab träffa på en instruktion som inte finns inkopierad till minnet så går den ut på hårddisken och läser in denna instruktion, men inte bara en enstaka instruktion, utan ett block med instruktioner som ofta används tillsammans. Ett välkonstruerat program behöver därför inte gå ut och läsa från den långsamma disken särskilt ofta, utan håller sig för det mesta till den kopia av instruktionerna som finns i minnet.5

5 När vi lärt oss det här om hur datorer fungerar kan vi föstå två saker: Dels varför vissa program ibland kan gå så sagolikt långsamt. Om minnet "börjar ta slut", det vill säga om det inte finns något ledigt minne kvar att reservera, vilket kan hända när vi kör många program samtidigt, så kan ett program inte reservera tillräckligt stora delar av minnet för att lagra så många instruktioner så att det kan köra effektivt. Istället måste programmet

(2)

Samtidigt reserverar programmet en annan del av minnet för att lagra data. Allt som finns i matlabs workspace lever till exempel i internminnet, när vi skriver klubba = 0.5 så reserveras ett litet område i internminnet för variabel klubba, och värdet 0.5 lagras där. Kommandot clear klubba instruerar matlab att vi inte längre är intresserade av klubba, den delen av minnet flaggas då som ledigt och kan användas av matlab för att spara en ny variabel.

Eftersom instruktionerna bara är en kopia av det som finns lagrat på hårddisken så påverkas inte programmets funktion av en eventuell krasch med efterföljande omstart, det är ju bara att skapa en ny kopia av insturktionerna från hårddsiken. Data däremot flyger all sin väg. När programmet avslutas, frivilligt eller ofrivilligt, så är all information som lagrats i workspace borta. Om man nu har lagrat priserna för ett stort antal olika sorters godis i matlabs workspace och räknar med att behöva använda den listan igen vid ett senare tillfälle så vill man naturligtvis kunna spara listan även efter det att matlab avslutats för den här gången. Det här går givetvis att göra, vi kan från matlab spara innehållet i workspace på hårddisken, vi kan också skapa separata filer med data och/eller matlabkommandom som sparas på hårddisk och som vi sedan läser tillbaks, sk M-filer. Detta kommer att bli det sätt vi normalt arbetar med matlab, genom att spara allt på hårddisk är det enkelt att gå tillbaks och göra smärre korrektioner och modifieringar och framför allt: vi kommer att spara oerhört mycket arbete genom att vi kan återanvända kod-snuttar från tidigare övningar.

5.1.2 Filnamn och Sökvägar

Varje fil på en dator måste ha ett unikt namn som fungerar som en sorts adresslapp. Precis som när vi identifierar personer genom namn och en hirearki av adresser alltifrån gata med portnummer upp till städer och länder så har en datoradress flera nivåer. På den lägsta nivån talar vi om filnamn, som till exempel rapport2.text, laboration4.m osv. Varje fil måste vara placerad i en katalog (engelskans directory, på svenska kan vi också kalla det "mapp"). Katalogen kan i sin tur vara inplacerad i en annan katalog, och så vidare. Det är klokt att försöka organisera en trädstruktur av kataloger som logiskt delar upp de filer man äger i avgränsade undergrupper som i exemplet nedan, Vi ser hur det finns en textfil som heter "utkast1" i katalogen "rapport". Katalogen "rapport" ligger i sin tur i katalogen "lab1", som liger i katalogen "labbar" och så vidare. I en given katalog kan det bara finnas en fil med samma namn, vilket inte är så konstigt, hur skulle datorsystemet annars förstå till exempel vilken fil vi ville skriva ut när vi ger ett print kommando. Men precis som brevärarna inte bara kan hantera en "Sven Andersson" utan kan hålla isär Sven Anderson på Linnégatan från Sven Andersson på Kungsgatan, och Sven Andersson på Linnégatan i Göteborg från Sven Andersson på Linnégatan i Stockholm, Om vi bara ger hela adressen så kan datorsystemet hålla isär en fil som heter "utkast1" i katalogen "rapport" i katalogen "lab2" från en fil som heter "utkast1" i katalogen "rapport" i katalogen

"lab1".

För att vara säkra på att vi och datorn förstår varandra när vi refererar till filer så måste vi reda ut två saker. Dels hur man anger att det är filen utkast1 som finns i trädet under "lab1" och inte filen med samma namn i trädet under "lab2", det vill säga hur bär vi oss åt för att skriva en fils fullständiga ut och titt som tätt läsa instruktioner från den långsamma disken. Det här leder till "sega" program som svarar långsamt på våra kommandon.

Vi förstår nu också varför program "krascher". I nio fall av tio (minst) beror det på att program A (ofta tillverkat av Microsoft) har skrivit till exempel data i en del av minnet som program B reserverat för sina instruktioner. I stället för instruktioner om hur programmet skall hantera "x + y" står det någonting helt annat, som programmet helt oskyldigt försöker genomföra med resultatet att allting hänger sig. Ibland är program A och B identiska, ett program kan skriva över sina egna instruktioner. Det här kallas ibland med datorjargon "minnesläcka".

(3)

namn, inklusive katalogtillhörigheten. Den andra saken vi måste förstå är något som kallas "den

aktuella katalogen" och som avgör hur datorn tolkar våra kommandon när vi bara ger namnet och ingen information om katalogtillhörigheten.

5.1.3 Fullständiga filnamn

Ett fullständigt filnamn i operativsystemet Windows börjar med namnet på hårddisken. Den dator du arbetar på kan nämligen ha mer än en hårddisk6, och det kan också vara så att du över nätverket kan ha tillgång till hårddiskar som inte fysiskt finns på just den datorn du arbetar vid, som till exempel de filer du lagrar "på ditt AFS konto". När du loggat in på ditt AFS konto (se intstruktioner på http://www.physto.se/afs/konton_windows.html) så kommer det att se ut som om de filer du lagrat där ligger på en disk på den dator du jobbar vid med namnet S. I filnamnet följs disknamnet av kolon, därefter \ ("backslash") och sedan namnen på katalogerna, separerade med backslash. Om vi till exempel antar att katalogen "Sten" i exemplet ovan ligger i en katalog "USERS" som inte har någon katalog över sig på D-disken så blir den fullständiga adressen till filen utkast1:

6 Rent fysiskt är det oftast så att på datorer med mer än en hårddisk så finns det egentligen inte mer än en disk, men den är uppdelad i fler avgränsade avdelningar som för datorn ser ut som om de vore helt skilda enheter.

ten

xpkursen

abbar

ab1 ab2

data rafer apport

atlab

Exempel på katalogstruktur

(4)

D:\USERS\Sten\Expkursen\labbar\lab1\rapport\utkast1 . Även kataloger kan adresseras på detta sätt, katalogen för lab1 har adressen D:\USERS\Sten\Expkursen\labbar\lab1 .

5.1.4 Aktuell katalog

Varje gång vi vill spara en fil från ett program så finns det ett förstahandsalternativ, en katalog där programmet vi arbetar i sparar filer om inte användaren aktivt väljer en annan katalog. Denna katalog kallas "aktuell katalog" (engelska "current directory"). Det är alltså här filer hamnar om vi inte aktivt anger en annan katalog. Exakt vilken katalog som är den aktuella kan variera från fall till fall. De flesta program har en katalog någonstans i den katalogstruktur som hör till programmet som används i standardfallet. Öppnar vi Microsoft Word och skapar ett nytt textdokument så sparars det i katalogen XXXXX. Om vi däremot öppnar ett redan exiterande dokument genom att dubbelklicka på det, gör några ändringar och sparar det under ett nytt namn så hamnar det i den katalog där det ursprungliga dokumentet låg. Oftast bereder det oss inte någon större möda att hålla rätt på detta, när vi sparar ett dokument så öppnas ju en dialogruta där vi tydligt kan se i vilken katalog dokumentet hamnar, och vi en rullgardinsmeny kan välja en annan katalog. Men om vi till exempel sparar matlabs workspace genom att ge kommandot save i kommandofönstret så får vi inte upp någon dialogruta utan matlab sparar direkt i det som är den aktuella katalogen.

I matlab finns det en liten ruta högst upp i desktopen som anger vilket som är den aktuella katalogen.

Om vi skriver in adressen till någon annan katalog i rutan så ändras den aktuella katalogen till den nya adress vi skrivit in., vi kan också genom att klicka på pilen till höger om textraden få upp en meny där vi kan välja att gå tillbaka till någon av de kataloger som tidigare under vår session varit den aktuella.

5.1.5 "Current directory browser"

Det finns en panå i matlabs desktop som används just för att navigera bland filer, den heter "Current Directory Browser", och aktiveras på samma sätt som de anra panåerna i desktopen genom att gå in i

"View" menyn och klicka på "Current Directory Browser". I den panå som då öppnas har vi många möjligheter, vi kan bland annat

• få en överblick över vilka filer som finns i den aktuella katalogen

• öppna en godtycklig fil i det program den skapades genom att dubbelklicka på ikonen för filen

• ändra aktuell katalog. Vill vi flytta oss nedåt i strukturen så dubbelklickar vi på ikonen för den katalog vi vill flytta oss till, vill vi flytta oss uppåt så dubbelklickar vi på symbolen

uppe på fönstrets list. Genom att upprepa detta kan vi flytta oss godtyckligt långt upp i katalogträdet och sedan flytta oss ned genom en anna gren genom att dubbelklicka på de kataloger som syns i panån.

(5)

En detaljerad beskrivning av "Current Directory Browser" ges i hjälpsektionen:

?/MATLAB/Using¬MATLAB/Development¬Environment/Running¬MATLAB¬Functions/Workspace, Search Path and File Operationa/File Operations/Current Directory Browser

5.1.6 Var söker matlab efter filer

Matlab har ett antal kommandon som innebär att programmet skall ladda in innehållet i en fil till workspace. Man kan till exempel genom att skriva load filnamn läsa in hela innehållet i filen med namn filnamn in i matlabs workspace, man kan också genom att bara skriva filnamn.m instruera matlab att läsa in och utföra de kommandon som finns sparade i filen filnamn.m För att detta skall fungera krävs givetvis att matlab hittar filen i fråga. Det fungerar givtevis om den fil vi anger ligger i den aktuella katalogen, men utöver det så har matlab en lista med kataloger där den söker efter de filer vi anger i våra kommandon. En sådan lista kallas sökväg (eng. search path). När vi skriver in ett filnamn så kommer matlab att först leta efter filen i den aktuella katalogen, därefter söks efter filen i alla kataloger som finns med i sökvägen, i den ordning som katalogrna står i sökvägen. Det kan alltså vara viktigt i vilken ordning katalogerna är listade i sökvägen, om det finns flera filer med samma namn. Matlab har en meny där man kan se vilka kataloger som finns med i sökvägen. Man kan också

lägga till eller ta bort kataloger, och även ändra ordningsföljden. För att få fram den dialogruta där det sker går vi till menyn "File" och klickar på "set path". Efter att ha valt7 en av katalogerna i fönstret till höger kan vi sedan med hjälp av knapparna till vänster flytta den valda katalogen upp och ner i listan för att på så sätt ändra ordningsföljden mellan dem. Vi kan också ta bort en vald katalog och med

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.

(6)

någon av de två översta knapparna lägga till en katalog till sökvägen. Använder vi den övre knappen när vi lägger till en katalog kommer endast den katalog vi valt att läggas till sökvägen, använder vi den andra knappen lägger vi till en katalog och alla dess underkataloger till sökvägen. Observera att det är nödvändigt att klicka på "Save" när vi är klara för att våra sökvägar skall sparas. Notera också att de ändringar du gör till matlabs sökväg kommer att gälla för alla andra som också använder denna dator, precis som du kommer att kunna ha glädje av alla sökvägar som någon annan lagt in.

5.1.7 Var skall jag spara filer

Eftersom vi arbetar på datorer som används av många personer måste vi vara noggranna med var på hårddisken vi sparar data så att vi inte lämnar efter oss en massa "skräp" som andra inte är intresserade av. Likaledes är det ju inte särskilt attraktivt att behöva återvända till exakt samma dator vid nästa arbetspass. Det finns egentligen bara två areor som inte är "allmänna", det vill säga som används av alla som använder datorn. Den ena är katalogen USERS som ligger antingen på C eller D disken på datorn. För tillfälligt sparande av personliga filer kan man skapa en underkatalog till denna katalog med sitt eget namn. Men kom ihåg att denna katalog bara kan ses på just denna dator. Använd därför den katalogen bara för temporär lagring under ett arbetspass. Filer som man vill spara för längre tid och kunna komma åt oavsett vilken dator man sitter vid skall sparas på AFS-disken, S-disken på övningslabs datorer.

För att ha en rimlig chans att hitta sina sparade data bör man ha en tydlig indelning i olika kataloger som var och en hör samman med ett tydligt "delprojekt". När vi kommit igång med labbandet är det till exempel naturligt att ha en katalog som heter "Laboration 1" med underkataloger "rådata", "m- filer", "rapport" mm. Under övandet med matlab bör man därför skaffa sig kataloger som t.ex "pass 1"

och sedan lägga dem i en katalog som kallas "matlabövningar". Namn på katalogerna är givetvis helt fritt att välja, men det bör vara en logisk struktur där alla filer i en given katalog "hör ihop", och har namn som gör att man förstår vad det är för fil utan att behöva öppna den och titta efter.

Alla filer som sparas på "allmänna" områden riskerar att raderas, antingen av misstag av någon av dina kollegor, eller också av systemansvariga när de städar upp på datorns hårddisk.

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 behöva 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" i den aktuella katalogen. För att läsa tillbaks innehållet i filen till workspace ger man kommandot load filnamn.

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

(7)

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 de 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 (fönstret erbjuder också ett kraftfullt "avlusningsverktyg", ett ämne som vi återkommer till senare). Du kan hitta fullständig information om matlabs editor vid

?/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 fö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 det inte finns någon fil med det namnet 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

(8)

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å mapp-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-file ä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ägen 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 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. Det allra viktigaste av dessa är ett av de allra viktigaste matlab kommandot - kommentarer.

Kommentarer inleds med ett procent-tecken "%" och följs av godtycklig text. När matlab utför kommandon ignorerar programmet procent-tecknet 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ågonspeciell 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

(9)

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:

%---

% Volym.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

(10)

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 kör 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 XXX 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 m-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 exemple 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

(11)

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.4 Inbyggda funktioner

Det finns ett mycket stort antal standardfunktioner inbyggda i matlab, man kan utgå ifrån att den funktion man vill använda också finns inbyggd och bara mycket sällan bli besviken. De vanligast förekommande är grupperade i tre sektioner, elementära funktioner, specialfunktioner och elementära matrisfunktioner. Det enklaste sättet att få reda på vilka funktioner som finns är att i kommandofönstret skriva help elfun, help specfun och help elmat. När man väl hittat den funktion man söker kan man få mer detaljerade information om den genom att skriva help funktionsnamn. Observera att matlab skriver funktionsnamn med versaler i hjälp- dokumentationen, men att du skall använda gemener (små bokstäver) när du ger kommandot i matlab.

5.5 Vektorer

5.5.1 Operationer på vektorer

Matlab har ett antal inbyggda funktioner som opererar på vektorer. Vi har redan sett ett exempel på en sådan, nämligen transponering ', som applicerad på en vektor gör om en radvektor till en kolumnvektor och vice versa.

Andra funkioner är:

zeros, ones, rand, randn

Dessa operatorer kan användas för att skapa vektorer och matriser utan att man behöver tilldela elementen sina värden ett och ett.

zeros(n x m) skapar en n x m matris där alla element är satta till noll. Som ett specialfall kan n eller m vara 1, i vilket fall en radvektor repektive kolumnvektor skapas.

ones (n x m) skapar en n x m matris där alla element är satta till 1.

rand (n x m) och randn (n x m) skapar matriser där elementen är slumpvis fördelade, rand producerar tal som är jämnt fördelade mellan 0 och 1, randn producerar slumptal som är normalfördelade kring 0 med standardavvikelse lika med 1.

linspace

Kommandot linspace(x1, x2, N) skapar en vektor som har N element, x1 som första element och x2 som sista element. Avståndet mellan två på varandra följande elemnt blir lika stort

sum (vektor)

beräknar summan av alla element i vektorn.

(12)

"kolon" - operatorn

"kolon" operatorn är en mycket användbar operator i matlab, både när vi arbetar med vektorer och matriser. Den förekommer i fler olika versioner, vilket i början kan göra det litet förvirrande. Den enklaste formen är a : b viket helt enkelt motsvarar serien av tal från a till b med steget 1 mellan varje tal. Vi kan definiera steget till att vara något annat tal än 1, kolon operatorn ser då ut så här: a : c : b, vilket ger oss en serie tal mallean a och b, med steget c. Några exempel:

>> vektor1 = [ 2 : 6]

vektor1 =

2 3 4 5 6

>> vektor2 = [ 1 : -0.5 : -4]

vektor2 =

1 0.5000 0 -0.5000 -1 -1.5000 - 2 -2.5000 -3 -3.5000 -4

kolonoperatorn är uppenbarligen ett utmärkt verktyg för att skapa vektorer med regelbundna intervall mellan elementet. Vi kommer snart att se att när vi skall producera grafer så är det just precis sådana vektorer som vi kommer att skapa om och om igen.

Något annat som blir väldigt behändigt med hjälp av kolonoperatorn är att adressera en serie element i en vektor:

>> d = [ 11 12 13 14 15 16];

>> d(2:4) ans =

12 13 14

5.6 Matriser

5.6.1 Operationer på matriser

De flesta av vektorfunktionerna opererar också på matriser, men ibland med litet oväntade resultat.

Dessutom finns ett antal funktioner som är specifika för matriser. Några av de viktigaste är:

sum(matris)

Det är lång ifrån uppenbart vad vi kan förvänta oss här. Funktionen ger inte summan av alla element i matrisen, låt oss prova oss fram:

>> A = [ 1 2 3 ; 4 5 6 ; 7 8 9];

(13)

>> sum (A) ans =

12 15 18

sum (A) ger oss alltstå tydligen en radvektor vars element är summan av kolumnerna i matrisen A.

Detta beteende är något som kommer att återkomma, matlab arbetar ofta med kolumnerna i en matris.

Hur skall vi göra för att beräkna summan av raderna? Det enklaste är att anpassa sig till matlabs preferenser, om matlabs funktioner arbetar med kolumner och vi är intresserade av rader, låt oss transponera matrisen och sedan applicera funktionen på den transponerade matrisen. I det här fallet ger oss sum(A') en radvektor vars element är summan av kolumnerna av den transponerade matrisern, vilket ju är samma sak som summan av raderna i den ursrpungliga matrisen. Vill vi sedan få det att se litet snyggt ut så transponerar vi resultatet, som ju är en radvektor, till en kolumnvektor. Hängde ni med? Det är nog enklare att bara göra det hela än att försöka läsa den här beskrivningen, alltså:

>> A'

ans = 1 4 7 2 5 8 3 6 9

>> sum(A') ans =

6 15 24

>> sum(A')' ans = 6 15

24

Kommandot sum(A')' ger oss en kolumnvektor där varje element är summan av raden i den ursprungliga matrisen. Gå igenom exemplet ovan och se till att du förstår alla led i operationerna!

eye(N)

Eye(N) producerar en N x N enhetsmatris.

(14)

diag(A)

Resulterar i en kolumnvektor där elementet i raden n motsvarar elementet i diagonalen av matrisen på rad n och i kolumn n.

kolon operatorn

Precis som för vektorer är kolonoperatorn ett bekvämt sätt att adressera delar av en matris:

A(1:4,3) adresserar elementen som finns i rad 1 till och med fyra i den tredje kolumnen i matrisen A. Ett specialfall är när vi skriver : utan några omgivande siffror, operatorn resulterar då i alla element i en kolumn eller rad: A(:,3) ger alla element i tredje kolumnen av A.

5.7 Övningsuppgifter

4.Skapa genom att använda vektoroperatorer vektorerna a = (4, 2.4, 0.8, -0.8, -2.4)

b = (1.5 3.0 4.5)

5. Skapa en vektor med x värden: x = (1, 3, 5, 7).

Skapa sedan, genom beräkningar på x-vektorn, en vektor y där varje element uppfyller y = 3x2 + 4x för motsvarande element i x-vektorn.

Skapa därefter vektorn y-prim, där varje element är lika med derivatan av ekvationen ovan, beräknad för x-värden ur vektorn x.

6.Skapa genom att enbart använda vektor och matrisoperatorer matrisen A (det går att göra på en rad)

A=









1 0 0 0

0 2 5 0 0

0 0 4 0

0 0 0 5 5

.

.

References

Related documents

Läser styrfil till ritningsdefinition med filnamn enligt föreslaget namn eller av användaren angivet namn... Filnamn Kommando Beskrivning Anmäkning Lrsave.lsp LRSAVE

[r]

Under observationerna har vi tydligt kunnat se att dessa båda lärare utgår från gruppen i sin undervisning, det man kommer fram till gemensamt i språkandet

Det var ett fåtal elever som svarade att det är bra att kunna läsa och skriva eftersom man kan lära sig nya saker eller skriva upp något för att komma ihåg, men annars relaterade

Forskningen visar att det ofta är en stor fördel att få möjlighet att lära sig läsa på sitt modersmål. Man menar att färdigheterna måste ses i relation till såväl

Undersökningens huvudrubrik, När det inte är roligt att läsa och skriva, syftar på vad flera av lärarna i undersökningen säger då de lyfter fram ovilja mot läsning som

Det finns alltså flera belägg för att kompetens inom läsande och skrivande är nära relaterade, men frågan är om detta samband är gällande även när det rör sig om olika typer

Mobbning är när en eller flera individer upprepade gånger och över tid blir utsatt för negativ handling från en eller flera andra individer. Kränkningar