1 2 Læringsmål og pensum TDT4105 Informasjonsteknologi grunnkurs: Uke 36 Introduksjon til Matlab Arbeidsområdet, variabler, tilordning, uttrykk, tekst og koding, vektorer, matriser, skript og I/O Asbjørn Thomassen, IDI Læringsmål Bruke variabler og tilordningssetning Skjønne og bruke enkle datatyper (double, char, int etc.) Formulere lovlige uttrykk med konstanter, variabler, innebygde funksjoner, operatorer med operatorpresedens Lage og manipulere vektorer og matriser i enkle problemer Skjønne hva er en algoritme er, objektkode, intepretator, kompilator og skript Hvordan programmere og utføre enkle skript Lese inn og skrive ut data Pensum Matlab, Chapter 1 og 2.1 2.4 3 adresse 24327 24326 24325 24324 24323 24322 24321 24320 24319 24318 24317 24316 areal 12453.9 24315 Hva er en variabel? Primærlager/minne/indre lager/ram benyttes til lagring av data som brukes i et program (Matlab sesjon) består av en samling celler (ord) i primærlageret identifiseres ved et navn har en datatype som forteller hva som kan lagres i variabelen. har en verdi (innhold) Variabelens navn er areal, typen er float, verdien er 12453.9, den ligger i adresse 24316, og opptar 1 minnecelle i primærlageret (f.eks 4 byte) 4 Variabler og tilordningssetningen Variabler gis verdi gjennom tilordning Generell form på tilordning: variabelnavn = uttrykk antallkamper = 2 Variabelnavn velger vi selv, men husk navneregler for identifikatornavn! Semikolon til slutt undertrykker utskrift trykk = 8.43; Variabler legges i Matlabs workspace (arbeidsområde) til bruk senere i sesjonen 24327 24326 24325 24324 24323 24322 24321 24320 24319 24318 24317 24316 8.43 trykk 24315 2 Arbeidsområdet i primærlageret antallkamper
5 Variabler og tilordningssetningen (2) Eksempel: F = grader*9/5 + 32 Kjennetegnes ved en tilordningsoperator, =, og et variabelnavn, F, som står til venstre for operatoren Til høyre for tilordningsoperatoren finner vi et uttrykk (regneuttrykk) Likhetstegnet, =, betyr ikke likhet som matematikken, men tilordning. Tilordningssetningen er dynamisk: Først evalueres (tolkes) uttrykket på høyresiden av tilordningsoperatoren. Denne evalueringen vil resultere i en verdi. Verdien lagres i variabelen på venstre side av tilordningsoperatoren. Variabelens gamle verdi slettes når ny verdi tilordnes (overskrives). 6 Kommandoer relatert til variabler og arbeidsområdet namelengthmax - gir maks lengde på navn who - lister arbeidsområdet whos - som over men med plass clear - sletter arbeidsområdet clear variabelnavn sletter variabel fra arbeidsområdet Tolking av eksempelsetning over: En kopi av innholdet i variabel grader multipliseres med 9 og divideres med 5. Deretter legges det til 32. Resultatet tilordnes variabel F. 7 8 Uttrykk (expressions) Inneholder typisk konstanter, variable, operatorer, funksjoner og parenteser myvar = abs(x)+ 2*(3+2) antall = antall + lost Når bare et uttrykk skrives inn, uten en tilordning, bruker Matlab en default variabel ans til å lagre resultatet: 4*cos(1.3) ans = 1.0700 ny linje Uttrykk kan gå over flere linjer vha areal = 2*pi*(4.23 + myvar)... + 17 Initialiser, inkrementer og dekrementer n = 0, n = n+4, n=n-1 Operator og presedens Operatorer for numeriske uttrykk - fra høy til lav presendens: () parenteser ^ eksponent - negasjon * / \ all multiplikasjon og divisjon + - addisjon og subtraksjon Ved nøstede parenteser evalueres uttrykket fra innerste parentes først Innenfor et presedensnivå evalueres det fra venstre mot høyre ((2+(4/5))-1)
9 10 Konstanter Noen innebygde konstanter: pi 3.1416 i,j -1 e 2.7183 Hva skjer om jeg bruker noen av disse som variabelnavn? Tekst Kan være Enkeltbokstav: 'y' Tekststreng: 'tdt4105 H11' Bokstaver representeres internt som heltall gitt av ASCIItabellen (se neste foil). Konverterer fra tekst til ekvivalent tallverdi vha castingfunksjoner som double, int32 etc. tallverdi = double('d') Går fra tallverdi til tekst vha char char(66) char(66+1) char([66 67 68]) Vi ser på mer tekstbehandling senere i kapittel 7 11 Tekst (2) ASCII-tabellen (utdrag) 12 Bruk av innebygde funksjoner Funksjonen kalles ved å skrive navn etterfulgt av et sett av argumenter omsluttet av parenteser f.eks: abs(-23) funksjonsnavn argument Hva skjer om vi bruker f.eks cos som variabelnavn? La oss sjekke noen innebygde funksjoner
13 14 Bruk av innebygde funksjoner (2) sin,cos,tan trigonometriske funksjoner fix(x) undertrykk desimaler og returner Xs heltallsdel floor(x) største heltall ikke større enn X ceil(x) minste heltall ikke mindre enn X round(x) vanlig avrunding sign(x) fortegn rem(x,y) rest av divisjonen X/Y Bruk help til å sjekke : Eksempel: help fix Tilfeldige tall Bruker innebygd funksjon rand Gir et tilfeldig tall mellom 0 og 1 rand ans = 0.68959 Prøv nå et terningkast og lagr kastet i en variabel! Kan gå til et vilkårlig område [low,high] vha: round(rand*(high low)+low)) Merk: funksjonen randint finnes ikke i Octave resultatet i 15 16 Vektorer og matriser Lagrer verdisett av samme type Rekke, kolonne eller matrise 1xn rekke a matrix: nx1 1x1 nxm 5 3 7 4 kolonne skalar (en verdi) matrise 5 88 3 11 9 6 5 7 4 33 3 2 8 Lage rekkevektorer Bruk liste av tall i klammer: [ ] Skiller elementene med blank eller komma v = [1 2 3 4] Eller bruke kolon-operatoren : vec = 1:5 %ikke nødvendig med[ ] her Generell form first : step : last stopper når verdien er større enn last nvec = 1 : 3 : 9 Vektorer og skalarer er subsett av matriser Verdiene lagres i matriseelementene
17 18 Lage rekkevektorer (2) Kan bruke linspace Verdi lav ls = linspace(3, 15, 5) Verdi høy Konkatenering (sammensetning) nv = [v ls] nyvec = [ ls ls v v ls] antall Referere og modifisere elementer Enkeltelement vz(2) Subsett av vektor indeks vz(2:4) Kan også bruke vektorer som indeks (kalles indeksvektor) vz( [ 1 7 9]) indeks 1 2 3 4 5 6 7 8 9 10 1 3 5 7 9 3 6 9 12 15 vz Verdi til element 5 19 20 Utvide vektorer Gjøres ved å referere til et ikke-eksisterende element rv = [2,11,58] %lager vektor rv(4) = 101 %utvider med nytt element %4 med verdi 101 Ved gap i indeks fylles inn elementer med null: rv(7) = 33 % rv(5)og rv(6)får verdi 0 Lage kolonnevektor Bruker klammeparentes med semikolon som skilletegn c = [1;2;3;4] Kan også bruke kolonoperatoren, men ikke direkte. Må da gå via transponering: r = 1:3 c = r %lager rekkevektor %transponerer til kolonne
21 22 Lage Matriser Matriser er en generalisering av kolonne/rekkevektorer mat = [ 4 3 1; 2 5 6] Hva om rekkene har forskjellige antall verdier? Kan bruke : til å lage rekker til matriser m = [11:13; 21:23; 31:33] rand lager en randomisert matrise rand(2) %gir nxn matrise (her n=2) rand(2,3) %generer mxn matrise(her 2x3) zeros brukes tilsvarende men lager en matrise med nuller Referere til matriseelementer Angi rekke og kolonne indeks m(3,1) Subsett kan hentes ut vha kolon m(2:3,1:2) Kolon alene som indeks velger en hel rekke eller kolonne m(:,1) %gir hele første kolonne m(2:3,:) % gir hele rekke 2 og 3 23 Modifisere matriseelementer Endrer enkeltelement ved tilordning m(3,1)= 2 Hel kolonne eller kolonne endres ved kolon m(1,:)= 1:3 %endrer hele rekke 1 Utvider en matrise ved å referere til hele nye kolonner eller rekker (ikke enkeltelementer) m(:,4) = [7 8 9]' m(5,:) = 2:2:8 % her fylles nullrekker % inn tilsvarende som % ved vektorer 24 Lineær indeksering Bruker da bare en indeks på nxm matrisen for å adressere elementer Elementene i matrisen er lagret internt kolonnevis, dvs element (ii,jj) har lineær indeks: k = (jj-1)*n + ii Eksempel: I en 2x3 matrise vil element (1,3) ha lineær indeks 5 (ii=1 og jj=3) NB! Bør bruke rekke- og kolonne-indekser når en opererer på matriser!
25 26 Hente dimensjoner Henter ut størrelsen til en vektor eller matrise : length(v) returner antall elementer i en vektor v size(m) gir antall rekker og kolonner i en matrise m numel(m) returner antall elementer i en vektor/ matrise length på en matrise returnerer den største av antall kolonner eller rekker. La oss prøve litt.. end som indeks angir siste element i kolonne eller vektor m(end,1) %end må bare brukes %som indeks! Endre dimensjoner Nyttige funksjoner i tillegg til ' (transpose): reshape ny matrise lages ved å gå gjennom matrisen kolonnevis fliplr flipper matrisen fra venstre til høyre flipud flipper opp til ned rot90 roterer matrise mot klokka 90 grader repmat lager en større matrise ved å kopiere den mindre matrisen mxn ganger Merk at funksjonene ikke endrer inputmatrisen men generere en ny! Generert matrise kan tilordnes inputmatrisen om en vil m = fliplr(m) 27 28 Bruk av funksjoner på vektorer eller matriser Matrise eller vektor kan være argument til en funksjon abs(vec) sin(mat) Funksjonen utføres på alle elementene Hvordan funksjonene vi selv programmerer kan gjøre det samme, ser vi på senere Tomme vektorer og konkatenering En tom vektor har ingen verdier (lengde 0) Lager en tom vektor ved å bruke [] nyvec = [] Kan legge til nye elementer ved konkatenering (som vist tidligere) nyvec = [ vec 3 12] Kan også slette et subsett av en vektor nyvec(2:3) = []
29 30 Quiz: Hva genereres her? m = [1:4; 3 11 7 2] m(2,3) m(:,3) m(4) size(m) numel(m) reshape(m,1,numel(m)) vec = m(1,:) vec(2) = 5 vec(3) = [] vec(5) = 8 vec = [vec 11] Noen fallgruver Bruk av blanke i variabelnavn Tilordningsetning snus feil vei: expression = variabelnavn feil!! i stedet for variabelnavn = expression som er riktig! Bruke funksjonsnavn som variabelnavn og deretter prøve å bruke funksjonen Blande divisjonsoperatorene \ og / Glemme operatorpresedens Ombytte argumentrekkefølge i funksjoner Prøve å lage matriser med ulik antall elementer i rekkene Glemme parenteser rundt argumentliste til funksjoner 31 Hva er en Algortime? En algoritme er en samling programinstruksjoner som beskriver hvordan et problem skal løses. Ordet algoritme har sitt utspring i navnet til den arabiske matematiker : Muhammad ibn Musa al-khwarizmi Navnet khwarizmi presenteres som algoritmi på latinsk. 32 Typiske trinn i en algortime 1. Hent inndata Prompt dvs signal til bruker som viser at programmet venter på inndata, typisk ledetekst Default inndatautstyr typisk keyboard 2. Beregn resultat 3. Vis resultat Default utdatautstyr - skjerm Format på presentasjon areal = pi*r*r r Eksempel: Beregne areal av en sirkel. 1. Les inn radius 2. Beregn areal 3. Skriv ut arealet
33 34 Programmering og kjøring av program Når algoritmen er funnet for et problem, må den programmeres i et programmeringsspråk. Program skrevet i høynivåspråk må oversettes til maskinkode for å kunne utføres (kjøres): Kompilator : oversetter først hele programmet til en objekt-fil (.exe fil). Programmet utføres så ved å kjøre objektfilen (kan kjøres flere ganger). Intepretator: tar hver programsetning, en etter en, og konverterer setningen til maskinkode som kjøres direkte (Matlab). Det lages ingen objekt-fil. Skript (skriptfiler) Tungvint å skrive inn alle Matlab-setningene i kommandovinduet Vi kan lagre Matlab-kommandoer på fil og så kjøre alle setningen i fila på en gang Et skript er en samling Matlab instruksjoner som er lagret på en fil (kalles også program i Matlab) benevnes også som M-filer fordi filnavn slutter med.m, f.eks script23.m Utføres ved å skrive bare filnavn i kommandovinduet, f.eks script23 uten.m bak. Dette kalles å kjøre et skript Skript kalles også et hovedprogram da det kan kalle (egne) funksjoner for å løse problemet (modularisering) 35 arealtrekant1.m 36 Skript for areal av en trekant h = 20 g = 30 areal = g*h/2 Merk at når skriptet kjøres legges variablene til workspace Skal vi beregne areal en annen trekant må vi inn å redigere i skriptet for å endre verdiene på h og b (mer fleksibel og elegant løsning senere) Dokumentasjon av skript Bruk % for kommentarer Første kommentar i begynnelsen av et skript skal fortelle hva skriptet gjør Første blokk med kommentarer vises vha help men stopper på første blanke linje: %Dette gjør scriptet % og dette etc. %Men dette kommer ikke med i help (blank linje over) lykketall = 7; Bruk ellers kommentarer i koden for å forklare ting! lookfor leter etter første kommentarlinje (denne kalles H1)
37 Skript for å gå fra C til F % Konverter fra % Celsisus til Fahrenheit % Antall grader er satt fast grader = 20 F = grader*9/5 + 32 celsiusfk1.m 38 I/O - input-setningen Leser fra standard input device med ledetekst: grader = input('gi inn grader Celsius:'); Skal en lese inn mer enn en verdi, må en bruke flere separate input-setninger men kan angi vektor eller matrise [1:4;5:8] \n i tekst angir ny linje (kalles newline) Må bruke 's når en skal lese inn tekst: kar = input('tast inn bokstavkarakter:', 's'); Bare tab/blank etterfulgt av enter ignoreres og gir en tom streng '' blanke i starten av en tekst kommer med Hva skjer om en glemmer 's'? Vi prøver litt