Øvingsforelesning TDT4105 Matlab Øving 2. Pensum: Funksjoner, matriser, sannhetsuttrykk, if-setninger. Benjamin A. Bjørnseth 8. september 2015
2 Innhold Funksjoner Matriser Matriseoperasjoner Sannhetsuttrykk If-setninger
3 Oversikt Funksjoner Matriser Matriseoperasjoner Sannhetsuttrykk If-setninger
4 Motiverende eksempel Eksempeloppgave: Lag et program som leser inn radius og høyde for en sylinder fra en bruker, og som skriver ut sylinderens areal og volum til skjerm. A_sylinder = 2* + h V_sylinder = * h r * Trenger én beregning flere steder i programmet: perfekt med
5 Funksjoner: mer kompliserte operatorer x = 1 + 2; y = 2 * 2-3 ^ x; Funksjon = operator Parameter/argument = operand.
6 Eksempel vektor = [1, 2, 3]; summen = sum(vektor); Ser ut som oppslag i en vektor. Operasjon: sum. Data: vektor. Regner ut høyresiden, binder svaret til variabelen.
7 Utregning av variabeltilordning med funksjonskall Demonstrer på tavla.
8 Terminologi lengden = length(vektor) Bruke funksjonen == kalle funksjonen Her kaller vi funksjonen length, med vektor som argument. Forskjell på parameter og argument: funksjonsdefinisjon og funksjonskall. Klart etter hvert.
9 Ingen output er ok Ulikt operatorer: regner ikke alltid ut et svar. Eksempel: disp(). disp(summen); disp(lengden);
10 Eksempel på innputt tall = input( Skriv inn et tall: ); Kommunikasjon Matlab -> Bruker: disp() Kommunikasjon Bruker -> Matlab: input() Først litt utputt (skriv parameter) Så innputt. Tolker brukerens tekst som kode.
11 OBS: funksjonsargument er kopier Viktig å huske på.
12 Egne funksjoner Eksempel: lag funksjon som regner ut summen av to tall. Helt unyttig, har + men fin sammenlikning.
13 Egne funksjoner Opprett ny fil funksjonsnavn.m function returverdi = funksjonsnavn(parameter1, parameter2) <kode> end
14 Utregning av funksjonskall x = pluss(2, 3); Forklar på tavla Inkluder oppretting av parameterene a og b og utførelse av funksjonskallet her.
15 Funksjonsvariabler er lokale x = pluss(2, 3); disp(x); % Skriver ut 5 disp(a); % Feilmelding disp(resultat); % Feilmelding
16 Returvariable er ikke knyttet til omgivelsene function resultat = pluss(a, b) x = a + b; % Ikke riktig! end Må gi en verdi til resultat
17 Returvariable kan hete hva som helst function tjolahopp = pluss(a, b) tjolahopp = a + b; end Navnet er skjult for omverdenen.
18 Parameter vs argument Parameter: et funksjonsdefinisjonsbegrep. Argument: et funksjonskallbegrep. Eksempel: a og b er parametere, 2 og 3 er argumenter.
19 Eksempeloppgaver, forskjellige parametere og returverdier 1. Lag en funksjon som inverterer et tall.
19 Eksempeloppgaver, forskjellige parametere og returverdier 1. Lag en funksjon som inverterer et tall. 2. Lag en funksjon som regner ut a + b*c
19 Eksempeloppgaver, forskjellige parametere og returverdier 1. Lag en funksjon som inverterer et tall. 2. Lag en funksjon som regner ut a + b*c 3. Lag en funksjon som returnerer et tall lest inn fra brukeren.
19 Eksempeloppgaver, forskjellige parametere og returverdier 1. Lag en funksjon som inverterer et tall. 2. Lag en funksjon som regner ut a + b*c 3. Lag en funksjon som returnerer et tall lest inn fra brukeren. 4. Lag en funksjon som tar en liste studenter, og regner ut hvor mange studenter som blir igjen hvis vi deler dem inn i grupper på tre.
19 Eksempeloppgaver, forskjellige parametere og returverdier 1. Lag en funksjon som inverterer et tall. 2. Lag en funksjon som regner ut a + b*c 3. Lag en funksjon som returnerer et tall lest inn fra brukeren. 4. Lag en funksjon som tar en liste studenter, og regner ut hvor mange studenter som blir igjen hvis vi deler dem inn i grupper på tre. 5. Lag en funksjon som returnerer en vektor med en gitt startverdi, en gitt steglengde mellom element, og et gitt antall element.
20 Samme navn på parameter og retur function pris = totalpris(antall_epler, antall_bananer, pris) pris = antall_epler * pris; % Huff huff, dette går ikke bra! Variabelen pris ble nemli % overskrevet i forrige linje, så vi får ikke tak i % argumentverdien lenger. pris = pris + antall_bananer * pris; end Kan ha samme verdi uten at Matlab klager. Det kan utnyttes...... men det kan og føre til forvirrende feil.
21 Kan ikke endre parametre function endre_alder(studentaldre, student, ny_alder) studentaldre(student) = ny_alder; end % Prøver vi å bruke funksjonen som under, vil det ikke ha noen % effekt: studentaldre = [ 19, 21, 20 ]; endre_alder(studentaldre, 1, 20); disp(studentaldre); % Skriver ut [ 19, 21, 20 ]
22 Kan utnytte likt variabelnavn function studentaldre = endre_alder(studentaldre, student,... ny_alder) studentaldre(student) = ny_alder; end % Funksjonen vil da brukes slik: studentaldre = [ 19, 21, 20 ]; studentaldre = endre_alder(studentaldre, 1, 20); disp(studentaldre); % Skriver ut [ 20, 21, 20 ];
23 Forskjell på retur og utskrift I kommandovindu y = 12; x = funksjon(y); I fil funksjon.m function y = funksjon(x) y = x + x disp(y); fprintf( %d, y); end Globale variabler y = 12 funksjon(12) Lokale variabler x = 12
24 Forskjell på retur og utskrift I kommandovindu y = 12; x = funksjon(y); I fil funksjon.m function y = funksjon(x) y = x + x disp(y); fprintf( %d, y); end - Utskrift sender verdier til skjerm Globale variabler y = 12 funksjon(12) Lokale variabler x = 12
25 Forskjell på retur og utskrift I kommandovindu y = 12; x = funksjon(y); I fil funksjon.m function y = funksjon(x) y = x + x disp(y); fprintf( %d, y); end - Utskrift sender verdier til skjerm (mangler semikolon) Globale variabler y = 12 Lokale variabler funksjon(12) x = 12 y = y = y = 24 24 24
26 Forskjell på retur og utskrift I kommandovindu y = 12; x = funksjon(y); I fil funksjon.m function y = funksjon(x) y = x + x disp(y); fprintf( %d, y); end - Utskrift sender verdier til skjerm Globale variabler y = 12 Lokale variabler funksjon(12) y = x = 12 y = 24 24 24 24
27 Forskjell på retur og utskrift I kommandovindu y = 12; x = funksjon(y); I fil funksjon.m function y = funksjon(x) y = x + x disp(y); fprintf( %d, y); end - Utskrift sender verdier til skjerm Globale variabler y = 12 Lokale variabler funksjon(12) x = 12 y = y = 24 24 24 24 24
28 Forskjell på retur og utskrift I kommandovindu y = 12; x = funksjon(y); I fil funksjon.m function y = funksjon(x) y = x + x disp(y); fprintf( %d, y); end - Utskrift sender verdier til skjerm - Retur av verdier er overføring av lokale variabler til der funksjonen ble kalt. Globale variabler y = 12 Lokale variabler funksjon(12) x = 12 y = y = 24 24 24 24
29 Forskjell på retur og utskrift I kommandovindu y = 12; x = funksjon(y); I fil funksjon.m function y = funksjon(x) y = x + x disp(y); fprintf( %d, y); end - Utskrift sender verdier til skjerm - Retur av verdier er overføring av lokale variabler til der funksjonen ble kalt. Globale variabler Lokale variabler y = 12 funksjon(12) Hva er y? x = 12 y = 24 y = 24 24 24
30 Forskjell på retur og utskrift I kommandovindu y = 12; x = funksjon(y); I fil funksjon.m function y = funksjon(x) y = x + x disp(y); fprintf( %d, y); end - Utskrift sender verdier til skjerm - Retur av verdier er overføring av lokale variabler til der funksjonen ble kalt. Globale variabler Lokale variabler y = 12 x = 24 funksjon(12) 24 x = 12 y = 24 y = 24 24 24
31 Eksempeloppgave Løs introduksjonseksempelet.
32 Oversikt Funksjoner Matriser Matriseoperasjoner Sannhetsuttrykk If-setninger
33 Motiverende eksempel Lag et program som sjekker om et brett i gamblingspillet Extra har vunnet noe gitt et brett som angir hvorvidt en rute er dekket eller ikke. Fylt brett Fylt indre felt Fylt ramme 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
34 Vektorer som rader eller kolonner rundetider = [ 30, 29, 31, 30 ]; disp(rundetider); rundetider = [ 30; 29; 31; 30 ]; disp(rundetider); % Skriver ut tallene under hverandre. Vektorer: en-dimensjonale lister En dimensjon kan også gå nedover. Bruk semikolon.
35 Kolon blir rad oddetall_rad = 1:2:9; oddetall_kolonne = (1:2:9) ; % Fnutten er transponeringsoperator % som gjør rader til kolonner. disp(oddetall_rad); disp(oddetall_kolonne); disp(size(oddetall_rad)); % Skriver ut [ 1, 5 ] disp(size(oddetall_kolonne)); % Skriver ut [ 5, 1 ] Kolon lager rader. Må transponere for å få kolonne. size() gir dimensjoner.
36 Matriser: en samling vektorer rundetider = [ 25, 29, 31, 30 ;... 25, 31, 29, 29 ;... 24, 30, 32, 33 ]; disp(rundetider); disp(size(rundetider)); % Skriver ut [ 3, 4 ] Skill kolonner med komma Skill rader med semikolon Alternativt syn: vektorer er spesielle matriser hvor bare én dimensjon kan være større enn 1.
37 Hente ett element rundetid = rundetider(2, 3); disp(rundetid); % Skriver ut 29 Relativt likt vektorer. Må oppgi ønsket posisjon i hver dimensjon.
38 Hente flere verdier datoer = [ 7, 8, 9, 10, 11, 12, 13 ]; ma_to_fr = datoer([1, 4, 5]); helg = datoer([5, 6, 7]); helg = datoer(5:7); Kan godt hente flere verdier på en gang. Bruk lister med posisjoner.
39 Flere verdier fra matrise tider = rundetider([2, 3], 3); tider = rundetider(2:3, 3); % tider = rundetider(2, [2, 3]); tider = rundetider(2, 2:3); % tider = rundetider([2, 3], [1, 4]); Fungerer tilsvarende for matriser. Flere posisjoner i en eller flere dimensjoner.
40 Hente alt fra en dimensjon tider = rundetider(1, :); disp(tider); tider = rundetider(:, 4); Spesiell syntaks for å hente alt fra en dimensjon.
41 Illustrasjon av indeksering Ta dette på tavla: Enkeltelement: pek på rad, pek på kolonne. Flere element: pek på rad, pek på kolonne. Flere element, bruk av kolon til å lage vektor: regn ut vektor, pek på rad, pek på kolonne. Flere element, bruk av kolon som hel dimensjon: pek på rad, ta alle kolonner.
42 Tilordning av verdier Tilordning fungerer som for vektorer: indeksert uttrykk til venstre i variabletilordning. rundetider(2, 1) = 23;
43 Eksempeloppgave: tilordning 1. Sett alle de siste rundetidene til 30. 2. Sett rundetid 1 og 3 for løper 2 og 3 til 29.
44 Eksempeloppgave Løs introduksjonseksempelet: Lag en funksjon som angir hvorvidt et gitt Extra-brett av markeringer er et vinnerbrett eller ikke.
45 Oversikt Funksjoner Matriser Matriseoperasjoner Sannhetsuttrykk If-setninger
46 Motiverende eksempel Lag et program som lar en generere snittkarakter for elevene i en klasse, med korrekt vekting for forskjellige fagstørrelser. Fag Student 1 2 3... TDT4105 Fagvekt 7.5 TDT4105 6 4 4... TXX41YY 7.5 TXX41YY 4... 15... 5...... 7.5...
47 Regn med hele matriser x = 1 + 2; % Vanlig regning OK. v1 = [1, 2, 3]; v2 = [3, 2, 1]; v3 = v1 + v2; % Matriseregning også OK disp(v3); % Skriver ut [ 4, 4, 4 ] Kan regne direkte med hele matriser. Typisk svært effektivt.
48 Mange matriseoperatorer %... subtrahere: v4 = [9, 7, 5] - v3; disp(v4); % Skriver ut [ 5, 3, 1 ] %... og multiplisere: u = [ 1, 2, 3 ]; % En rad-vektor v = [ 3; 2; 1 ]; % En kolonne-vektor z = u * v; disp(z); % Skriver ut... 10?! Kan gjøre mye: pluss, minus, gange. Men vær obs: gjør kanskje ikke det du tror! Matriser har egne regler, især for multiplikasjon. Dette går ut over divisjon og opphøyd-i. Finnes egne elementvise operasjoner (.*,./,.^)
49 Eksempeloppgave Lag de fire første kvadrattallene, gitt følgende matrise: M = [ 1, 2; 3, 4 ];
50 Eksempeloppgave Løs introduksjonsproblemet: 1. Lag en funksjon som regner snittkarakter for alle elever gitt en matrise med karakterer og en vektor med vekter (matriseoperasjon). 2. Lag en funksjon som regner snitttkarakter for én elev, gitt flere semestre med karakterer og en tilsvarende matrise med vekter (elementvis operasjon).
51 Oversikt Funksjoner Matriser Matriseoperasjoner Sannhetsuttrykk If-setninger
52 Motiverende eksempel Lag et program som sjekker om et brett i gamblingspillet Extra har vunnet noe gitt en serie med trukne tall. Fylt brett Fylt indre felt Fylt ramme 11 28 45 59 75 14 22 38 71 9 13 49 66 63 7 1 2 72 19 33 67 68 44 40 20
53 Sannhetsuttrykk Som matteuttrykk, bortsett fra: Resultatet er enten true eller false Også kalt 1 og 0 Andre operatorer Lavere presedens
54 Operatorer Sammenlikne verdier Lik == Ulik ~= Mindre enn < Mindre enn eller lik <= Større enn eller lik >= Større enn >
55 Eksempler a = true; b = false; x = 1 < 2; y = 1 >= 2; z = 1 + 2 > 2 Lavere presedens på sammenlikning enn aritmetiske operatorer.
56 Regning med logiske verdier c = true + 3; disp(c); % Skriver ut 4 true og false kan ofte behandles som 1 og 0. Er ikke det samme når man indekserer matriser, som vi skal se.
57 Kombinasjon av sannhetsverdier Flere operatorer Òg && Eller Ikke ~ Sannhetstabeller x y x && y x y ~ x 0 0 0 0 1 0 1 0 1 1 1 0 0 1 0 1 1 1 1 0
58 Eksempel tilbud_restaurant = true; tilbud_kino = false; blir_superkveld = tilbud_restaurant && tilbud_kino; blir_fin_kveld = tilbud_restaurant tilbud_kino; blir_middag_hjemme = ~tilbud_restaurant; Kombinasjoner har lavere presedens enn sammenlikning. har lavere presedens enn &&
59 Eksempeloppgave Anta at tilbudspris på kino er 100, tilbudspris på restaurant er 150, og budsjettet er 200. Avgjør om det blir penger til overs, ved å bruke våre tidligere definerte sannhetsvariabler.
60 Sammenlikningsoperasjoner for matriser A = [1, 2, 3] < [3, 2, 1]; disp(a); % Skriver ut [ 1, 0, 0 ] B = [2, 2, 2] == [1, 3, 2]; disp(b); % Skriver ut [ 0, 0, 1 ] Sammenlikning fungerer også for matriser. Gir elementvise svar.
61 Kombinasjon av logiske uttrykk for matriser disp(a B); % Skriver ut [ 1, 0, 1 ]; disp(a & B); % Skriver ut [ 0, 0, 0 ]; Når logiske matriser kombineres, må man bruke varianter av operatorene. Dobbelt symbol brukes når du ønsker en skalar betingelse som for eksempel passer i en if-setning. Enkelt symbol brukes når du ønsker deg en hel matrise med sannhetsverdier.
62 Indeksering med sannhetsmatrise ukedatoer = [ 7, 8, 9, 10, 11, 12, 13 ]; er_helgedag = [ false, false, false, false, false, true, true ]; helgedatoer = ukedatoer(er_helgedag); disp(helgedatoer); % Skriver ut [ 12, 13 ]; Kan indeksere med logisk matrise. Angir hvorvidt elementet på samme posisjon skal tas med eller ikke. Demonstrer på tavla hvordan eksempelet over fungerer.
63 Konsis logisk indeksering under_30 = rundetider < 30; raske_tider = rundetider(under_30); % Vanligvis direkte raske_tider = rundetider(rundetider < 30); Brukes ofte for å hente ut element i en matrise med en visst egenskap. Sløyfer ofte å navngi sannhetsmatrisen.
64 Eksempeloppgave Hent ut alle rundetidene som er raskere enn den raskeste tiden til løper 2. Hent tidene hvor løper tre var raskere enn løper 1. Regn ut hvor mange ganger løper tre var raskest.
65 Eksempeloppgave Løs introduksjonsproblemet: lag en funksjon som lager et markert Extra-brett fra et vanlig brett og en vektor med trukne verdier, som bruker funksjonen fra matrise-seksjonen til å returnere rett svar.
66 Oversikt Funksjoner Matriser Matriseoperasjoner Sannhetsuttrykk If-setninger
67 Motiverende eksempel Lag et program som skriver ut på hvilken måte, hvis noen, et Extra-brett er et vinnerbrett.
68 If-setninger Gjør forskjellige ting basert på betingelser Gjør Matlab til mer enn en vanlig kalkulator
69 Eksempler if 2 + 2 == 4 disp( Som forventet ); else disp( Oi ); end
70 Eksempler x = odds_for_rbk_seier(); if x > 100 % Selv ikke RBK er saa gode x = 100; end
71 Eksempler if beste_flysete_ledig() book_sete_nuh(); elseif nest_beste_ledig() book_sete_imorgen(); elseif nestnest_beste_ledig() book_hvis_desperat(); else staycation_ftw(); end
72 Oppgaver Skriv ut værmelding basert på temperatur. Temperatur Melding - -50 Sola har sluknet -50-20 Kakaovær -20-10 Grønn Swix FTW -10 10 Symmetrisk om null. 10 15 Trondheimssommer 15 Varmt nok
72 Oppgaver Bestem månedens diett basert på budsjetterte inntekter og utgifter Overskudd Diett > 0 Ingers rugbrød 0 Kneip < 0 Barkebrød
72 Oppgaver Implementer følgende mattefunksjon { x if x >= 0 absoluttverdi(x) = x if x < 0