Startpakke for bruk av Matlab



Like dokumenter
MAT-INF 2360: Obligatorisk oppgave 1

Kapittel august Institutt for geofag Universitetet i Oslo. GEO En Introduksjon til MatLab. Kapittel 2.

Matematikk Øvingeoppgaver i numerikk leksjon 1 Å komme i gang

MAT-INF 2360: Obligatorisk oppgave 1

TDT4105 Informasjonsteknologi, grunnkurs (ITGK)

MATLABs brukergrensesnitt

Installere JBuilder Foundation i Mandrake Linux 10.0

MAT1120 Plenumsregningen torsdag 26/8

TDT4110 Informasjonsteknologi, grunnkurs Uke 35 Introduksjon til programmering i Python

Matematikk Øvingsoppgaver i numerikk leksjon 3 Funksjoner og plotting

Matematikk Øvingeoppgaver i numerikk leksjon 1 Å komme i gang

Installere JBuilder Foundation i Windows XP

Læringsmål og pensum. v=nkiu9yen5nc

ITGK - H2010, Matlab. Repetisjon

TDT4105 Informasjonsteknologi, grunnkurs (ITGK)

Matematikk Øvingsoppgaver i numerikk leksjon 2 Funksjoner og plotting

MATLAB for MAT Klara Hveberg og Tom Lindstrøm

TDT4105 Informasjonsteknologi, grunnkurs. Introduksjon til programmering i Matlab

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 1 Introduksjon til Programmering og Python. Professor Alf Inge Wang

Noen presiseringer mhp Diskret Fourier Transform. Relevant for oblig 1.

Kapittel Oktober Institutt for geofag Universitetet i Oslo. GEO En Introduksjon til MatLab. Kapittel 14.

TMA Matlab Oppgavesett 2

Matematikk Øvingsoppgaver i numerikk leksjon 1 Løsningsforslag

som blanker skjermen (clear screen). Du får en oversikt over alle kommandoene ved å skrive,

Matematikk Øvingsoppgaver i numerikk leksjon 3. Løsningsforslag

Oblig 1 FYS2130. Elling Hauge-Iversen

For å sjekke at Python virker som det skal begynner vi med å lage et kjempeenkelt program. Vi vil bare skrive en enkel hilsen på skjermen.

TDT4105 Informasjonsteknologi, grunnkurs. Introduksjon til programmering i Matlab. Rune Sætre / Anders Christensen {satre,

Alternativ dag for teoriforelesning. Intro. Torsdag 12:15-14:00 R1

Matematikk Øvingsoppgaver i numerikk leksjon 4 m-ler

TDT4105 Informasjonsteknologi, grunnkurs. Introduksjon til programmering i Matlab. Rune Sætre / Anders Christensen {satre, anders}@idi.ntnu.

Matematikk Øvingsoppgaver i numerikk leksjon 5 Skript

Øvingsforelesning i Matlab (TDT4105)

Øving 0 - Xcode TDT4102

Matematikk Øvingsoppgaver i numerikk leksjon 3 Skript

Bygg et Hus. Steg 1: Prøv selv først. Sjekkliste. Introduksjon. Prøv selv

Sprettende ball Introduksjon Processing PDF

Matlab-tips til Oppgave 2

TMA4100 Matematikk 1, høst 2013

TMA4100 Matematikk 1, høst 2013

En liten oppskrift på hvordan jeg installert og fikk Xastir til å virke sånn at jeg ble synlig i APRS verden.

Hvordan installere Java og easyio på Windows

Kjenner du alle funksjonene på tastaturet?

4. Installasjonsveiledning. Experior - rich test editor for FitNesse -

King Kong Erfaren Scratch PDF

Forelesning inf Java 1

Kom i gang med Python

Installasjonsveiledning av Faktura Z

2 Om statiske variable/konstanter og statiske metoder.

Brukermanual for Quizbuilder

Kapittel og 5. september Institutt for geofag Universitetet i Oslo. GEO En Introduksjon til MatLab. Kapittel 4.

Matematikk Øvingsoppgaver i numerikk leksjon 6 Løsningsforslag

Obligatorisk oppgavesett 1 MAT1120 H16

Snake Expert Scratch PDF

ADDISJON FRA A TIL Å

BYFE/EMFE 1000, 2012/2013. Numerikkoppgaver uke 34

En innføring i MATLAB for STK1100

Obligatorisk oppgavesett 2 MAT1120 H16

Løsningsforslag. Innlevering i BYFE/EMFE 1000 Oppgavesett 1 Innleveringsfrist: 14. september klokka 14:00 Antall oppgaver: 3.

Øvingsforelesning i Matlab TDT4105

Utførelse av programmer, funksjoner og synlighet av variabler (Matl.)

Shellscripting I. Innhold

Matematikk Øvingsoppgaver i numerikk leksjon 7 Løsningsforslag

Kom i gang med Stata for Windows på UiO - hurtigstart for begynnere

Mattespill Nybegynner Python PDF

Straffespark Introduksjon Scratch Lærerveiledning

TDT4102 Prosedyre og Objektorientert programmering Vår 2015

START MED MATLAB. Når du starter Matlab, kommer du inn i kommandovinduet. Dersom du har versjon 6.1, ser du dette :

Primus Brukerveiledning for masseimport av bilder. Primus 5.6.5

Kjøre Wordpress på OSX

Start et nytt Scratch-prosjekt. Slett kattefiguren, for eksempel ved å høyreklikke på den og velge slett.

Pong. Oversikt over prosjektet. Steg 1: En sprettende ball. Plan. Sjekkliste. Introduksjon

Hvordan gjøre fjernhjelp til noen som ønsker hjelp med Hageselskapets portal? Av Ole Petter Vik, Asker Versjon

INF1000 : Forelesning 1 (del 2)

Om du allerede kjenner Scratch og har en Scratchbruker kan du gå videre til Steg 1.

if-tester Funksjoner, løkker og iftester Løkker og Informasjonsteknologi 2 Læreplansmål Gløer Olav Langslet Sandvika VGS

Argumenter fra kommandolinjen

I dag skal vi ved hjelp av ganske enkel Python-kode finne ut om det er mulig å tjene penger på å selge og kjøpe en aksje.

Tryll bort heksa. Introduksjon. Sjekkliste Følg instruksjonene på lista. Huk av etter hvert. Test. Lagre 2/8

Det du skal gjøre i denne oppgava er først å sette opp bakgrunnen til spillet og så rett og slett å få firkanter til å falle over skjermen.

Utførelse av programmer, metoder og synlighet av variabler i JSP

Kanter, kanter, mange mangekanter

Forelesning inf Java 1

TDT4102 Prosedyreog objektorientert programmering Vår 2016

Kapittel 1 En oversikt over C-språket

Oversikt. Beskrivelse Bash. 1 UNIX shell. 2 Kommandolinje som brukergrensesnitt. 3 Input og output. 4 Bash builtins. 5 Linux utilities.

Hvordan å lage og publisere ditt personlige visittkort

GeoGebra. brukt på eksamensoppgaver i 10. kl. Sigbjørn Hals

MAT 1120: Obligatorisk oppgave 1, H-09

Humanware Companion.

Tetris. Introduksjon. Skrevet av: Kine Gjerstad Eide. Lag starten på ditt eget tetris spill!

INF109 - Uke 1a

Inf109 Programmering for realister Uke 5. I denne leksjonen skal vi se på hvordan vi kan lage våre egne vinduer og hvordan vi bruker disse.

<?php. count tar en array som argument, og returnerer et tall som uttrykker antallet innførsler i arrayen.

Høgskolen i Oslo og Akershus. sin 2 x cos 2 x = 0, x [0, 2π) 1 cos 2 x cos 2 x = 0 2 cos 2 x = 1 cos 2 x =

Beregninger i ingeniørutdanningen

Etablering av nettressurs med eksempler, prosjekter og data

notater Gule lapper Mine Et praktisk eksempel med objekter IT2 Læreplansmål Gløer Olav Langslet Sandvika VGS

En enkel lærerveiledning

Transkript:

Startpakke for bruk av Matlab Øyvind Ryan (oyvindry@ifi.uio.no) 22. mai 2013 Innhold 1 Innledning 1 2 Installasjon 2 3 Det aller enkleste 3 4 m-filer, funksjoner og script 6 5 Avanserte eksempler 7 6 Tilleggspakker 11 7 Begrensninger 11 8 Ressurser 13 1 Innledning Dette dokumentet inneholder diverse praktisk informasjon og eksempler, som kan være nyttige både for deg som allerede er i gang med Matlab, og for deg som tenker på å starte med å bruke Matlab. Vi starter med noen punkter rundt installasjon, som kan dukke opp for din plattform (windows, mac, eller linux). Deretter fortsetter vi med en seksjon om enkel bruk av Matlab. Denne delen passer deg som har brukt Matlab lite eller aldri, og vil ha en oversikt over den grunnleggende funksjonaliteten. Når du har gjort deg kjent med disse grunnleggende tingene kan du gå videre til neste seksjon, der vi går i gang med enkel programmering, hvordan vi lager egne programmer, strukturerer disse i filer, etc.. Deretter tar vi for oss noen mer avanserte eksempler, slik som hvordan vi kan bruke Matlab til å gjøre fouriertransformasjoner, eller i forbindelse med lyd og bilder. Til slutt ser vi på noen tilleggspakker, noen begrensninger, går gjennom noen nyttige Matlab-ressurser, og forklarer hvordan Matlab blir brukt i forskjellige kurs ved UIO. 1

2 Installasjon Fra vår 2013 har Mat-Nat en site-lisens på Matlab. Dette innebærer at alle studenter og ansatte kan installere Matlab over nettet på sin egen laptop, i tillegg til at Matlab er tilgjengelig på terminaler på terminalstuene. Nedenfor finner du oppskriftene for installasjon for de forskjellige plattformene. Dette er oppskrifter som driftes av USIT, og de mangler per i dag er par kommentarer, som kan skape litt forvirring (vi forsøker å få USIT til å endre disse tingene i sine oppskrifter). Tidligere var det nødvendig at studenten skrev en mail til USIT for at han skulle bli meldt inn i en filgruppe som ga tillatelse til å installere Matlab, men dette skal nå ikke lenger være nødvendig (vennligst ta kontakt med undertegnede hvis noen fortsatt ikke har tilgang til Matlab-installasjonen på nett!). 2.1 Windows Gå til Nedlasting av matlab og klargjøring for bruk på adressen http://www.uio.no/tjenester/it/maskin/programvare/p-base/matlab.html, og følg instruksjonene. I skrivende stund er det er par ting som ikke er riktig beskrevet her: HELE mappa må lastes ned fra /lisens/matlab, vi fikk det i hvert fall ikke til uten. Det er ingen knapp som het installforwindows, slik det står i guiden. Bare setup.exe, som måtte kjøres som administrator etter at alt var lastet ned. 2.2 Mac Gå til Nedlasting av matlab og klargjøring for bruk på adressen https://www.macprog.uio.no/lisens/matlab/r2013a/matlab.html, og følg instruksjonene. Legg merke til at 2013-versjonen av Matlab krever OSX 10.7 eller nyere (d.v.s. Lion, Mountain Lion, eller nyere). I guiden burde følgende også vært nevnt: Under security & privacy, under system preferences ( personal -kategorien) måtte jeg midlertidig tillate installasjon av applikasjoner fra overalt (det vil si at matlab installasjonen var fra en unidentified developer ) (denne innstillingen ligger under general -taben). 2.3 Linux-plattformer Legg merke til at det er som er beskrevet her for linux er en ad hoc-løsning, og at det egentlig ikke er noen support for dette. Du kan hente ned scriptet for installasjon ved å skrive scp <brukernavn>@ulrik:/usr/sbin/app-sync /tmp/ 2

Kjør deretter scriptet for å installere matlab slik: sudo /tmp/app-sync install matlab På forhånd må man sørge for at det er nok plass under /opt til å installere Matlab. Versjon 2013a tar ca. 9GB. For å fjerne Matlab igjen er det bare å skrive: sudo /tmp/app-sync remove matlab Hvis du kjører Red Hat Enterprise Linux på din laptop, så kan du også gå til siden for Matlab og Simulink på adressen http://www.uio.no/tjenester/it/maskin/linux/hjelp/programmer/matlab.html, og følge instruksjonene. 2.4 Bruk av Matlab i tungregneklynger På insitutt for informatikk har man over lenger tid brukt Condor til å spre jobber på maskiner, se http://www.mn.uio.no/ifi/tjenester/it/hjelp/tungregning/condor/. På denne siden er det også tatt med et enkelt eksempel på hvordan man kan bruke Condor for enkle Matlab-kjøringer. 3 Det aller enkleste Du åpner Matlab som et hvilket som helst annet program. I Unix skriver du matlab &, mens du i Windows-lignende omgivelser klikker på Matlab-ikonet. I begge tilfeller får du opp et kommandovindu med et Matlab prompt» (avhengig av oppsettet på maskinen er dette kommandovinduet enten ett av flere Matlab-vinduer eller én del av et større vindu). Vi bruker promptet for å indikere enkeltstående kommandoer som du kan skrive inn parallelt med at du bruker boka, eller for å skille mellom hva som er input og output i utskrifter fra Matlab-kjøringer. For kode som går over flere linjer vil du se at vi har droppet promptet. Slik kode kan du kjøre ved å laste ned de tilhørende filene fra bokas hjemmeside. Etter promptet kan du skrive en kommando du vil at Matlab skal utføre. Skriver du f.eks. >> 3+4 og skifter linje, svarer Matlab med ans=7 og gir deg et nytt prompt til neste regnestykke (prøv!). Du kan prøve de andre standard regneoperasjonene ved å skrive inn etter tur 3-4, 3*4, 3/4, 3^4. Husk å avslutte med et linjeskift for å utføre kommandoene. Men legg merke til at, hvis du skriver inn Matlab-kommandoer som går over flere linjer, og bruker linjeskift for å bryte opp en kommando, så vil du få en feilmelding. Dette kan 3

du bøte på ved å skrive... før du bruker linjeskift. Dette vil fortelle Matlab at den skal vente med å tolke komamndoen til neste linjeskift igjen. Matlab bruker den vanlige prioriteringsordningen mellom regneoperasjonene slik du er vant til fra avanserte lommeregnere. Legg merke til at du kan bruke piltastene for opp/ned til å se tidligere kommandoer du har skrevet inn. Dette er veldig nyttig hvis du trenger å gå tilbake for å eksperimentere litt mer med tidligere kommandoer. I Matlab-hovedvinduet er det også mulig å se kommandoer du har brukt i tidligere Matlab-sesjoner, og dermed gjenbruke disse. Kommandoen >> 8^2/3 gir svaret 21.3333, dvs. 64/3, mens >> 8^(2/3) gir svaret 4.0000. Vær forøvrig klar over at på enkelte maskiner er ^-tasten litt trøblete når man bruker Matlab. Som regel løser problemet seg hvis man taster mellomrom etter ^ og så fortsetter med neste symbol. Matlab kjenner alle vanlige (og mange uvanlige!) funksjoner, så skriver du >> sin(0.94) svarer Matlab med sinus til 0.94 radianer. Vær oppmerksom på at Matlab er nøye på multiplikasjonstegn: Skriver du» 15sin(0.94), svarer Matlab med en feilmelding du må skrive» 15*sin(0.94) for å få regnet ut 15 sin 0.94. sin er en innebygd kommando (funksjon) i Matlab. Du kan enkelt få opp hjelpedokumentasjon for alle slike kommandoer. Skriver du >> help sin så vil du få opp Matlab s innebygde dokumentasjon for kommandoen sin. Denne dokumentasjonen kan du også få opp ved å velge Dokumentasjon fra hjelpemenyen i Matlab, og så skrive inn kommandonavnet. En funksjon du må passe litt på, er eksponentialfunksjonen e x som du må skrive som exp(x). Vil du regne ut e 2.5, skriver du altså exp(2.5) (og ikke e^2.5). I tillegg til eksponentialfunksjonen må du passe litt på arcusfunksjonene som i Matlab heter asin, acos, atan osv, og ikke arcsin, arccos, arctan som man kanskje skulle tro. I tillegg kan det være greit å vite at kvadratrotfunksjonen heter sqrt og at absoluttverdifunksjonen heter abs. Skriver du >> exp(sqrt(abs(-0.7))) regner Matlab ut e 0.7. De andre standardfunksjonene heter det du er vant til: sin, cos, tan, cot, log. Vår gamle venn π kalles i Matlab for pi. Kommandoen >> pi gir svaret 3.1416. Ønsker du å vise svaret med flere desimaler, kan du skrive 4

>> format long Kommandoen» pi blir da besvart med 3.14159265358979. Vil du tilbake til kort format (det blir fort uoversiktlig med mange desimaler i alle tall), skriver du >> format short Legg merke til at presisjonen i selve utregningen er like god i begge tilfeller: Kommandoene format long og format short påvirker bare hvor mange desimaler som blir skrevet på skjermen, ikke hvor mange desimaler som brukes til å representere tallet internt i Matlab! Mer informasjon om presisjon i Matlab finner du ved å gi skrive format eller precision i hjelpemenyen i Matlab. Ber du Matlab regne ut sin π, får du deg kanskje en overraskelse. Istedenfor 0, gir Matlab deg svaret 1.2246e-16. Dette skyldes at Matlab primært er et numerisk beregningsprogram som regner med avrundede tall. Det finnes også funksjoner som runder av tall på flere måter. Noen eksempler, med forklaring gitt i kommentarene, er >> floor(a) % Runder a ned til nærmeste hele tall >> ceil(a) % Runder a opp til nærmeste hele tall >> round(a) % Runder a av til nærmeste hele tall Skal du bruke et tall flere ganger i en beregning, kan det være greit å gi det et navn. Ønsker du at 0.3124 heretter skal betegnes med a, skriver du rett og slett >> a=0.3124 Navnsetter du på tilsvarende måte >> b=2.41 kan du regne ut produktet ved å skrive >> a*b La oss avslutte denne innledende seksjonen med noen Matlab-knep det kan være greit å vite om (blir det for mye på en gang, får du heller komme tilbake til denne delen senere). I Matlab kan du ikke endre på en kommando som er blitt eksekvert. Har du laget en liten trykkfeil, må du derfor føre inn kommandoen på nytt. Dette kan du gjøre ved klipping-og-liming, men du kan også bruke piltastene opp og ned. En oversikt over tidligere kommandoer ligger i det lille vinduet som heter Command History, og du kan navigere frem og tilbake i disse kommandoene ved å bruke piltastene. Dersom du ønsker at Matlab skal vente med å eksekvere en linje til senere, holder du skift-tasten (for skifte til stor bokstav) nede mens du slår linjeskift. Matlab vil nå vente med å utføre kommandoen til du slår et linjeskift uten å bruke skift-tasten. Synes du at en kommando blir svært lang og vil fortsette den på en ny linje, kan du skrive tre punktum etter hverandre og så skifte linje. 5

Matlab skjønner da at du ikke er ferdig med kommandoen og venter med å utføre den. Får du problemer med en kommando og ønsker å avbryte, trykker du Ctrl-c (altså kontrolltasten og c samtidig). Et siste nyttig triks: Ønsker du at Matlab skal utføre en kommando uten å skrive resultatet i vinduet, taster du et semikolon etter kommandoen. Skriver du f.eks. >> c=a*b; vil c få verdien ab, men resultatet kommer ikke opp på skjermen. 4 m-filer, funksjoner og script Hvis du skal skrive inn mange kommandoer som skal brukes flere ganger, kan det være praktisk å samle disse i en egen kommandofil. Slike Matlab-filer skal ha endelsen.m, og kalles derfor gjerne m-filer. De inneholder Matlab-kommandoer (uten promptet» foran seg) og kan skrives inn i en hvilken som helst editor, f.eks. emacs eller den innebygde editoren i Matlab som ligger i et eget vindu. I noen versjoner av Matlab spretter dette vinduet opp når du starter programmet, i andre må du klikke på et ikon i Matlab-vinduet for å få det opp. Klikker du for eksempel på knappen som heter New, og velger function eller script, så vil du få opp editorvinduet. Valgene function og script gjenspeiler at det finnes to typer m-filer: scriptfiler og funksjonsfiler. Et script er en sekvens av Matlab-kommandoer slik vi ville ha tastet dem inn i kommandovinduet (uten promptet). Hvis vi samler disse kommandoene på en fil som heter filnavn.m, vil Matlab utføre dem når vi gir kommandoen» filnavn (uten endelsen.m) i kommandovinduet. For at Matlab skal finne filen, må vi stå i samme katalog som filen er lagret i (med mindre filen ligger i søkestien til Matlab). Vi kan sjekke hvilken katalog vi står i med kommandoen pwd (present working directory) og skifte katalog med kommandoen cd (change directory). Når du starter opp Matlab vil du per default stå i Matlab s hjemmeområde (Matlab s default working directory), og denne vil ligge per default i søkestien til Matlab. Hvis du vil lagre m-filer i et annet directory, og du vil legge dette til søkestien til Matlab, så kan du gjøre dette med valget set path fra Matlab s file-meny. Etterhvert som du bruker Matlab mye vil du typisk lage mange m-filer, til mange forskjellige formål. For å få bedre oversikt anbefaler vi da at du lager et directory for hvert formål, og legger hvert enkelt directory inn i søkestien. Hvis vi f.eks ønsker å lage et script som finner røttene til annengradsligningen 2x 2 + 3x + 1 = 0, kan vi legge følgende kommandoer på filen annengradsligning.m a=2; b=3; c=1; x1=(-b+sqrt(b^2-4*a*c))/(2*a) x2=(-b-sqrt(b^2-4*a*c))/(2*a) 6

(Husk at promptet» ikke skal være med i m-fila!) Når vi skriver» annengradsligning utfører Matlab alle kommandoene i scriptet og returnerer svarene x1-0.5000 x2-1 En funksjon er en m-fil som begynner med ordet function og har én eller flere inn- og ut-parametre. Disse parametrene er tall eller matriser (eller i noen få tilfeller funksjoner). Variablene som brukes i funksjoner er lokale (med mindre vi definerer en global variabel, se help global) og lagres ikke i det ordinære arbeidsrommet. Hvis vi ønsker å lage en funksjon som finner røttene til en vilkårlig annengradsligning ax 2 +bx+c = 0, kan vi la brukeren spesifisere ligningskoeffisientene a, b og c som inn-parametre til funksjonen, og la ut-parameteren som funksjonen returnerer, være en 2-dimensjonal radvektor som inneholder røttene r1 og r2. På filen annengrad.m legger vi da følgende funksjonskode: function [r1, r2]=annengrad(a,b,c) if a~=0 % sjekker at a ikke er null r1=(-b+sqrt(b^2-4*a*c))/(2*a); r2=(-b-sqrt(b^2-4*a*c))/(2*a); else disp( Koeffisienten til x^2 kan ikke være null ) end (legg merke til kommandoen disp( tekst ) som får Matlab til å skrive ut tekst). Vi kan nå finne røttene til annengradsligningen 2x 2 + 3x + 1 = 0, ved å gi kommandoen» [x1,x2]=annengrad(2,3,1) Matlab returnerer igjen svarene x 1 = 0.5000 og x 2 = 1. Det er en god vane å legge inn forklarende kommentarer i m-filene som forteller hva kommandoene gjør. I Matlab kan vi skrive inn slike kommentarer etter prosenttegnet % som kommenterer ut resten av linjen. 5 Avanserte eksempler I denne seksjonen tar vi for oss forskjellige eksempler av litt mer avansert natur, der Matlab kan brukes som verktøy. 7

5.1 Diskret fouriertransformasjon av et tidssignal Iblant simulerer vi ulike fysiske prosesser ved å generere et signal og så foreta en eller annen analyse av dette. I eksemplet nedenfor genereres et signal som består av to sinusfunksjoner som adderes, og som så frekvensanalyseres ved hjelp av diskret fouriertransformasjon. Legg merke til hvordan vi kan generere en tallrekke/vektor (jevnt fordelte tidspunkt), og hvordan vi genererer sinusverdier til alle tidspunktene/hele vektoren i en eneste operasjon (uten bruk av en løkke). Dette trikset er viktig fordi beregninger av denne typen går svært mye raskere i Matlab enn ved tradisjonelle løkker. % Lager først et signal beskrevet i tiden 0 til 10 sekunder N = 2048; % antall punkter vi vil beskrive et signal i T = 10; % lengde (i sekunder) vi vil beskrive signalet t = linspace(0,t,n); % t blir en tallrekke (vektor) fra 0 til 10 (s) omega1 = 2*pi*20; % vinkelfrekvens, frekvens1 = 20 Hz omega2 = 2*pi*70; % frekvens2 = 70 Hz signal1 = sin(omega1*t);% signal1 blir nå en tallrekke med sinusverdier signal2 = sin(omega2*t); signal = 0.8*signal1+1.3*signal2; % lager et sammensatt signal plot(t,signal, -b ); % plotter signal, blå strek xlabel( Tid (s) ); % tekst langs x-aksen ylabel( Sinussignal (rel enheter) ); % ds for y-aksen % Vi foretar så en diskret fouriertransformasjon og plotter resultatet frekvensspekter = (2/N)*abs(fft(signal)); % absoluttverdi av FT figure; % ønsker å lage et nytt plot frekv = linspace(0,(n-1)/t,n); % lager en frekvensakse for plottet plot(frekv,frekvensspekter, -r ); % plotter frekvensspekteret xlabel( Frekvens (Hz) ); ylabel( Frekvenskomp (rel. enhet) ); Den sentrale funksjonen her er fft, som er Matlab s høyoptimaliserte og innebygde metode for å regne ut en diskret fouriertransformasjon (DFT). Legg også merke til hvordan funksjoner kan plottes på en enkel måte. I dette programeksemplet har vi skrevet inn kommentarer omtrent til hver enkelt linje i programmet. Det kan iblant være en hjelp for å huske hva de ulike delene av programmet gjør, men det er sjeldent behov for så mange kommentarer som vi har lagt inn her. Dersom tredje siste linje ble modifisert slik: plot(frekv(1:n/2+1),frekvensspekter(1:n/2+1),, -r ); ville vi bare ha skrevet ut den første halvparten av frekvensspekteret. Den øvrige halvparten er speilet (foldet) omkring halve samplingsfrekvensen, og har ingen informasjonsverdi ut over det vi finner i første halvpart. Merk for øvrig at indeksene i Matlab starter på 1 (ikke 0 som i mange andre programmeringsspråk). 8

1 5.2 Lyd Det er enkelt å eksperimentere med lyd i Matlab. Hvis du har en fil med extension wav (feks. castanets.wav), så kan denne leses inn i Matlab ved å skrive [S,fs]=wavread( castanets.wav ) wav-formatet er et av de mest brukte formatene for å lagre digital lyd, spesielt for lyd med CD-kvalitet. S, som wavread returnerer, er en matrise, der hver søyle gir lyden i konkrete lydkanaler (hvis lydfila inneholder stereolyd. så vil S ha to søyler). fs er samplingsraten som blir brukt i lyden. Funksjonen wavwrite kan på tilsvarende måte brukes til å skrive lydsampler i en matrise til en wav-fil: wavwrite(s,fs, castanets.wav ) Lyd vi har lest inn kan vi avspille med funksjonene play og playblocking. For å eksperimentere kan vi nå bruke FFT og IFFT til å nulltille høye frekvenser i lyd vi har lest inn, og spille av resultatet, med følgende kode: y=fft(s(1:2^17,1); y((2^17/4+1):(3*2^17/4))=zeros(2^16,1); news=ifft(y); news=news/max(abs(news)); playerobj=audioplayer(news,fs); playblocking(playerobj) Her kjøres FFT bare på de første 2 17 første lydsamplene i første lydkanal. 5.3 Bilder Bilder kan leses inn i Matlab med funksjonen imread X = double(imread( filename.jpg, jpg )); X, som returneres fra funksjonen, blir da en matrise med dimensjoner lik dimensjonene til bildet. Hvis bildet har flere fargekanaler (f.eks. et RGB-bilde), så vil en tredimensjonal matrise returneres. Den består egentlig av tre to-dimensjonale matriser, en for hver farge. Første dimensjonen i matrisen svarer til indekser i loddrett retning, andre dimensjon horisontal retning, og tredje dimensjon fargen. Det kan være lurt å skrive size(x) (uten semikolon) for å få skrevet ut dimensjonen på matrisen. Bilder kan også skrives til fil ved kommandoen imwrite: 1 Det er detaljer i dette som kan være vanskelig å forstå fullt ut. I kapittel 4 i læreboka til FYS2130 Svingninger og bølger, tilgjengelig på http://www.uio.no/studier/emner/matnat/fys/fys2130/v13/laerebokkapitler13.html er noen av disse detaljene tatt opp i detalj. Mange av kapitlene inneholder andre Matlabprogrammer brukt i kurset. 9

imwrite(uint8(x), filename.jpg, jpg ) Ved kallet til disse funksjonene kan jpg erstattes med et hvilket som helst annet format som Matlab kan håndtere (png, gif, etc.). Legg også merke til konverteringen mellom datatyper ved hjelp av funksjonene double og uint8 over, som er gjort for at vi kan få ut objekter med datatyper som Matlab kan gjøre beregninger med. Et bilde representert med en matrise X kan også vises frem i Matlab ved hjelp av funksjonen imshow. Vi kan nå eksperimentere med vårt innleste bilde feks. på følgende måte: X=X(:,:,1); [m,n]=size(x); for kn=1:n X(:,kn)=fft(X(:,kn)); end for km=1:m X(km,:)=fft(X(km,:)); end temp=x(1:(m/2),1:(n/2)); X=zeros(m,n); X(1:(m/2),1:(n/2))=temp; for kn=1:n X(:,kn)=ifft(X(:,kn)); end for km=1:m X(km,:)=ifft(X(km,:)); end imshow(uint8(x)); Koden her begrenser seg først til første fargekanal. Deretter blir det kjørt en fft på alle søyler i bildet, deretter på alle rader i bildet. Vi setter så alt unntatt øvre venstre hjørne i bildet til null (dette svarer til å kaste høyfrekvent informasjon i bildet), før vi transformerer oss tilbake med ifft, og viser frem bildet. 5.4 Singulærverdidekomposisjon Følgende kode returnerer en tilnærming til en matrise regnet ut ved hjelp av singulærdekomposisjonen av matrisen. Tilnærmingen er av lavere rang, og regnet ut ved at man legger sammen de singlulære vektorene med største tilhørende singulærverdier. function AK = svdapprox(a,k); if k > min(size(a)) disp( k must be <= the smallest matrix dimension.\n ); return; end; AK = zeros(size(a)); 10

[U,S,V] = svd(a); for i = 1:k AK = AK + S(i,i)*U(:,i)*(V(:,i) ); end; Dette kan for eksempel være nyttig hvis man vil lage en tilnærming til et bilde. Vi kan lett se på singulærverditilnærmingen til bildet ved å bruke funksjonen imshow. 6 Tilleggspakker Matlab inneholder en del tilleggspakker, kalt toolboxes. Disse listes opp i hjelpemenyen i matlab. Viktige slike toolboxes er 1. statistics toolbox inneholder støttefunksjoner for statistisk analyse. 2. signal processing toolbox innholder diverse støtte for signalbehandling, slik som fft, dct, filter design etc.. 3. wavelet toolbox inneholder støtte for å eksperimentere med wavelets. 4. symbolic math toolbox inneholder støtte for symbolsk matematikk, slik som utregning av integraler, deriverte, og å løse likningssystemer symbolsk. I appendikset i Flervariabel analyse med lineær algebra (Lindstrøm/Hverberg), som brukes i kurset MAT1110, finnes det en egen seksjon om dette. 5. image processing toolbox inneholder støtte for å eksperimentere med bilder, slik som funksjonene beskrevet i seksjonen om bilder 6. optimization toolbox 7. parallel computing toolbox 8. partial differential equation toolbox 9. mapping toolbox inneholder støtte for georefererte formater, slik som KML, GeoTIFF, Web map service. Med sistnevnte kan man feks.lese værdata fra databasen eklima. Værdataene returneres her i XML-format, som kan lese ved hjelp av metoder i Matlab. 7 Begrensninger Matlab kan brukes både som et verktøy for å regne ut ting med enkle kommandoer, og til å skrive større programmer. Til begge formål fungerer Matlab utmerket, men det er et par ting man bør være klar over hvis man skal bruke Matlab i programmeringssammenheng. Det er nemlig en stor forskjell i kompleksitet på Matlab og programmeringsspråk som C og C++. Med sistnevnte har man større muligheter til å fintune programmene til å gå meget raskt (man har 11

full kontroll på minneallokering/minnekopiering etc.), mens Matlab kan binde mye ressurser selv ved få metodekall. Dette i seg selv er ikke nødvendigvis noen stor begrensning, siden mange av Matlabs innbygde kommandoer er høyoptimaliserte (ved at de under panseret kaller nettopp metoder som er implementert i språk som C++). Dette gjelder spesielt fft-rutinen som vi brukte over, som har vært gjenstand for mye optimalisering på grunn av sin viktighet. Du vil imidlertid merke en stor forskjell hvis du programmerte FFT-rutinen i Matlab selv! La oss derfor se på følgende enkle kode, som også regner ut DFT, under antagelsen av at lengden til vektoren er en potens av 2. function y = FFTImpl(x) N = length(x); if N == 1 y = x(1); else ye = FFTImpl(x(1:2:(N-1))); yo = FFTImpl(x(2:2:N)); D=exp(-2*pi*1j*(0:(N/2-1)) /N); yo=yo.*d; y = [ ye + yo; ye - yo]; end Koden bruker FFT-algoritmen for å regne ut DFT, og skiller seg ikke i vesentlig grad fra Matlabs innebygde fft med tanke på antall regneoperasjoner (addisjoner/multiplikasjoner) som blir brukt i utregningene. Vi kan sammenligne tidsforbruket til vår egen FFT-implementasjon og Matlabs fft ved å skrive x=rand(2^17,1); tic; res1=fftimpl(x); toc tic; res2=fft(x); toc For at koden skal fungere må du lage en fil FFTImpl.m som inneholder koden over, slik at Matlab finner den. I koden lages en vektor av lengde 2 17 med tilfeldige tall mellom 0 og 1, som blir sendt som input til FFT-metodene. Ved hjelp av Matlabs innebygde tidtakingsmetoder tic og toc skrives deretter tidsforbruket for de to metodene ut på skjermen. Kjører du koden vil du se at det er en enorm forskjell i tidsforbruket: På undertegnedes maskin bruker FFTImpl ca. 7.6s, mens fft bruker rundt 0.003s!. Så hva skyldes denne forskjellen? Som nevnt henger det ikke sammen med antall regneoperasjoner (den er omtrent O(N log 2 N) i begge tilfellene). Forklaringen har med at det å programmere i Matlab kan føre en del overhead med 12

seg: blant annet vil parametre kopieres ved kall på metoder. Med FFTImpl vil det derfor skje mye kopiering, siden metoden kaller seg selv mange ganger. Matlabs innebygde fft unngår dette ved at den under panseret er implementert i et programmeringsspråk der parametrene ikke kopieres. Problemet over unngås ved at den innebygde fft-kommandoen regner ut alt i en jafs. En måte å få til slik utregning i en jafs med Matlab er vektorisering : Hvis vi har en sekvens av tall som skal bearbeides av Matlab, så kan vi legge disse inn i en vektor, og sende vektoren som parameter til en Matlab-metode, i stedet for at vi kaller metoden mange ganger med de forskjellige tallene som parametre. Da vil en underliggende optimalisert implementasjon i et annet språk komme til sin rett, siden denne kan gå gjennom datene på en raskere måte. Veldig mange innebygde Matlab-metoder støtter slik vektorisering. Som et enkelt eksempel kan vi skrive y=sin(x); i stedet for N=length(x); y=zeros(n,1); for k=1:n y(k)=sin(x(k)); end Hvis vi vil regne ut sin til alle elementene i vektoren x. Som en konklusjon kan vi si at Matlab inneholder høyoptimaliserte metoder for det meste, men at vi må tenke oss om hvis det er snakk om å bruke Matlab i lengre kodesnutter, slik fft-eksemplet viser. På den annen side, selv om feks. matlabkoden for FFTImpl over ikke eksekverer spesielt raskt, så gir Matlab likevel en kompakt og god fremstilling av algoritmen, og egner seg således godt i undervisningssammenheng. 8 Ressurser Boka Flervariabel analyse med lineær algebra (Lindstrøm/Hveberg), som blir brukt i kurset MAT1110, se http://www.uio.no/studier/emner/matnat/math/mat1100/, har et appendiks med en fyldig innføring til de forskjellige kommandoene i Matlab, med en matematisk vinkling tilpasset MAT1110-pensum. Den enklere innføringen i Matlab over er en videreføring av enkelte seksjoner i dette appendikset, inkludert her med tillatelse fra Tom Lindstrøm og Øyvind Ryan. I MAT1120 er det laget et kompendium der bruken av Matlab er tilpasset dette kurset, se http://www.uio.no/studier/emner/matnat/math/mat1120/h12/undervisningsmateriale/mat1120- MLkomp-2012.pdf I GEO1040, se http://www.uio.no/studier/emner/matnat/geofag/geo1040/ er pensum skreddersydd rundt bruken av Matlab i geofaglige problemstillinger. Kompendiet er bare tilgjengelig i Fronter. 13

I kurset MAT-INF2360, se http://www.uio.no/studier/emner/matnat/math/mat-inf2360/, er Matlab brukt gjennomgående til å illustrere teorien i kurset. Dette kurset bruker også lyd og bilder med Matlab ekstensivt. I regi av CSE-prosjektet er det laget en portal, se http://www.mn.uio.no/english/about/collaboration/cse/portal-with-resources/ for å dele beregningsrettede oppgaver og eksempler med andre institusjoner i Norge. Mye av dette materialet er Matlab-basert. Målet med portalen er å dele erfaringer rundt innføringer av beregninger i begynnerundervisningen. 14