Øvingsforelesning i Matlab TDT4105 Øving 6. Tema: funksjoner med vektorer, plotting, preallokering, funksjonsvariabler, persistente variabler Benjamin A. Bjørnseth 13. oktober 2015
2 Oversikt Funksjoner av vektorer Plotting Gjennomgang av øving 5 Funksjonskall Preallokering (Funksjoner som variabler) Persistente variabler
3 Konsept 1. Funksjon y = f (x):
3 Konsept 1. Funksjon y = f (x): f (x 1 ) = [f (x 1 )]
3 Konsept 1. Funksjon y = f (x): f (x 1 ) = [f (x 1 )] f ([x 1, x 2 ]) = [f (x 1 ), f (x 2 )]
3 Konsept 1. Funksjon y = f (x): f (x 1 ) = [f (x 1 )] f ([x 1, x 2 ]) = [f (x 1 ), f (x 2 )] f ([x 1,..., x n]) = [f (x 1 ),..., f (x n)]
3 Konsept 1. Funksjon y = f (x): f (x 1 ) = [f (x 1 )] f ([x 1, x 2 ]) = [f (x 1 ), f (x 2 )] f ([x 1,..., x n]) = [f (x 1 ),..., f (x n)] Kalles vektoriserte funksjoner
3 Konsept 1. Funksjon y = f (x): f (x 1 ) = [f (x 1 )] f ([x 1, x 2 ]) = [f (x 1 ), f (x 2 )] f ([x 1,..., x n]) = [f (x 1 ),..., f (x n)] Kalles vektoriserte funksjoner Eksempel: sin(x)
3 Konsept 1. Funksjon y = f (x): f (x 1 ) = [f (x 1 )] f ([x 1, x 2 ]) = [f (x 1 ), f (x 2 )] f ([x 1,..., x n]) = [f (x 1 ),..., f (x n)] Kalles vektoriserte funksjoner Eksempel: sin(x) 2. Funksjon skalar = f (x)
3 Konsept 1. Funksjon y = f (x): f (x 1 ) = [f (x 1 )] f ([x 1, x 2 ]) = [f (x 1 ), f (x 2 )] f ([x 1,..., x n]) = [f (x 1 ),..., f (x n)] Kalles vektoriserte funksjoner Eksempel: sin(x) 2. Funksjon skalar = f (x) Funger uansett hvor lang x er
3 Konsept 1. Funksjon y = f (x): f (x 1 ) = [f (x 1 )] f ([x 1, x 2 ]) = [f (x 1 ), f (x 2 )] f ([x 1,..., x n]) = [f (x 1 ),..., f (x n)] Kalles vektoriserte funksjoner Eksempel: sin(x) 2. Funksjon skalar = f (x) Funger uansett hvor lang x er Eksempel: sum(x)
4 Eksempler: 1. Lag en vektorisert funksjon f(x) som regner ut 2πx
4 Eksempler: 1. Lag en vektorisert funksjon f(x) som regner ut 2πx 2. Lag en vektorisert funksjon g(x) som regner ut f 2 (x)
4 Eksempler: 1. Lag en vektorisert funksjon f(x) som regner ut 2πx 2. Lag en vektorisert funksjon g(x) som regner ut f 2 (x) 3. Lag en vektorisert funksjon h(x, i) som regner ut x i i!
4 Eksempler: 1. Lag en vektorisert funksjon f(x) som regner ut 2πx 2. Lag en vektorisert funksjon g(x) som regner ut f 2 (x) 3. Lag en vektorisert funksjon h(x, i) som regner ut x i Estimer e ved å bruke h! i!
4 Eksempler: 1. Lag en vektorisert funksjon f(x) som regner ut 2πx 2. Lag en vektorisert funksjon g(x) som regner ut f 2 (x) 3. Lag en vektorisert funksjon h(x, i) som regner ut x i Estimer e ved å bruke h! e(x) = i=0 xi i! i!
4 Eksempler: 1. Lag en vektorisert funksjon f(x) som regner ut 2πx 2. Lag en vektorisert funksjon g(x) som regner ut f 2 (x) 3. Lag en vektorisert funksjon h(x, i) som regner ut x i Estimer e ved å bruke h! e(x) = i=0 xi i! Tips: n! regnes i matlab vha factorial(n) i!
5 Oversikt Funksjoner av vektorer Plotting Gjennomgang av øving 5 Funksjonskall Preallokering (Funksjoner som variabler) Persistente variabler
6 Grafikk For visualisering Plottfunksjoner: plot(xverdier, yverdier) Kan være lister, eller matriser (plott per kolonne)
6 Grafikk For visualisering Plottfunksjoner: plot(xverdier, yverdier) plot(x1, y1, x2, y2,..., xn, yn) Flere plots samtidig (kan også være punkt)
6 Grafikk For visualisering Plottfunksjoner: plot(xverdier, yverdier) plot(x1, y1, x2, y2,..., xn, yn) plot(yverdier) Typisk blir x-verdier indekser (med mindre y-verdiene er komplekse)
6 Grafikk For visualisering Plottfunksjoner: plot(xverdier, yverdier) plot(x1, y1, x2, y2,..., xn, yn) plot(yverdier) Merk: for linjeplott må alle punktene være samlet i en matrise.
7 Eksempel: sannsynlighetsfordelinger 1. Plott en standard normalfordeling for x [ 5, 5] f (x) = 1 2π e x2 2
7 Eksempel: sannsynlighetsfordelinger 1. Plott en standard normalfordeling for x [ 5, 5] f (x) = 1 2π e x2 2 2. Plott en standard eksponensialfordeling for x [ 1, 10] { e x if x >= 0 f (x) = 0 if x < 0
8 Oversikt Funksjoner av vektorer Plotting Gjennomgang av øving 5 Funksjonskall Preallokering (Funksjoner som variabler) Persistente variabler
9 Større oppgaver 1. Les oppgavene nøye (gjerne to-tre ganger). 2. Let etter enkle utgangspunkt Skal jeg lage en funksjon? Skal jeg bare opprette en variabel? Skal jeg sette sammen en løsning i et script? 3. Fyll ut med detaljer for å få løsningen til å stemme.
10 Oversikt Funksjoner av vektorer Plotting Gjennomgang av øving 5 Funksjonskall Preallokering (Funksjoner som variabler) Persistente variabler
11 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m
12 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m
13 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m 1. Variabel brukt som argument
14 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m 1. Variabel brukt som argument 2. Variabelnavn brukt til å lagre parameterverdi i lokalt workspace.
15 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m 1. Variabel brukt som argument 3. Variabelnavn brukt for å hente ut verdi fra lokalt workspace. 2. Variabelnavn brukt til å lagre parameterverdi i lokalt workspace.
16 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m 4. Variabelnavn brukt til å lagre returverdi etter funksjonskall. 1. Variabel brukt som argument 3. Variabelnavn brukt for å hente ut verdi fra lokalt workspace. 2. Variabelnavn brukt til å lagre parameterverdi i lokalt workspace.
17 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m Gjennomførelse av funksjonskallet: Globalt workspace
18 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m Globalt workspace Gjennomførelse av funksjonskallet: 1. Send verdier til funksjonen (funksjonsprolog) 2. Kjør funksjonen 3. Hent eventuelt ut resultater fra funksjonen (funksjonsepilog)
19 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m Gjennomførelse av funksjonskallet: prolog Globalt workspace
20 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m Gjennomførelse av funksjonskallet: prolog 1. Lag nytt lokalt workspace for funksjonskallet. Globalt workspace Lokalt workspace
21 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m Gjennomførelse av funksjonskallet: prolog 1. Lag nytt lokalt workspace for funksjonskallet. 2. Regn ut argumentverdier Globalt workspace Lokalt workspace
22 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m Gjennomførelse av funksjonskallet: prolog 1. Lag nytt lokalt workspace for funksjonskallet. 2. Regn ut argumentverdier 3. Bind parameternavn til argumentverdier i lokalt workspace Globalt workspace Lokalt workspace
23 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m Gjennomførelse av funksjonskallet: selve funksjonen Globalt workspace Lokalt workspace
24 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m Gjennomførelse av funksjonskallet: selve funksjonen 1. Kjør funksjonen linje for linje. Globalt workspace Lokalt workspace
25 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m Gjennomførelse av funksjonskallet: selve funksjonen 1. Kjør funksjonen linje for linje. Globalt workspace Lokalt workspace
26 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m Gjennomførelse av funksjonskallet: epilog Globalt workspace Lokalt workspace
27 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m Gjennomførelse av funksjonskallet: epilog 1. Slå opp verdien av returverdivariabelen i funksjonens lokale workspace Globalt workspace Lokalt workspace
28 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m Gjennomførelse av funksjonskallet: epilog 1. Slå opp verdien av returverdivariabelen i funksjonens lokale workspace 2. Bind variabelnavn til variabel for lagring av resultat til verdien fra funksjonen. Globalt workspace Lokalt workspace
29 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m Gjennomførelse av funksjonskallet: epilog 1. Slå opp verdien av returverdivariabelen i funksjonens lokale workspace 2. Bind variabelnavn til variabel for lagring av resultat til verdien fra funksjonen. 3. Slett det lokale workspacet. Globalt workspace
30 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m Gjennomførelse av funksjonskallet: ferdig! Globalt workspace
31 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m MERK! Navnet på lokal returverdivariabel og variabel brukt for lagring av resultat er helt urelatert! (men ofte heter de det samme, siden de refererer til samme type verdi.)
32 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m MERK! Navnet på funksjonens lokale parametre og variabler sendt som argument er helt urelatert! (men ofte heter de det samme, siden de refererer til samme type verdi.)
33 Funksjonskall og verdioverføring I kommandovindu I fil funksjon.m - Utskrift sender verdier til skjerm - Retur av verdier er overføring fra lokalt workspace til aktivt workspace hvor funksjonen ble kalt. Globalt workspace Lokalt workspace
34 Oversikt Funksjoner av vektorer Plotting Gjennomgang av øving 5 Funksjonskall Preallokering (Funksjoner som variabler) Persistente variabler
35 Effektiv matlab Hvis du trenger en vektor, lag hele med en gang Raskere enn å lage vektoren litt og litt Preallokering v = zeros(1, 100); for i = 1:100 v(i) = f(i); end Uten preallokering v = []; for i = 1:100 v(i) = f(i); end
36 Eksempel 1. Lag en funksjon fibonacci(n) som returnerer en liste med fibonaccitallene 1 til n. Lag to varianter: 1.1 En med preallokering. 1.2 En uten preallokering. 2. Lag et script som måler forskjell i tid på regne ut fibonacci(1e6)
37 While-løkker og preallokering Vi vet ikke hvor mange ganger løkken kjører Det er derfor vi bruker while og ikke for Hvis vi skal produsere en vektor: hvordan kan vi vite hvor stor den må være?
37 While-løkker og preallokering Vi vet ikke hvor mange ganger løkken kjører Det er derfor vi bruker while og ikke for Hvis vi skal produsere en vektor: hvordan kan vi vite hvor stor den må være? Løsning: estimer, og øk eventuelt etter hvert. Kutt eventuelt bort ekstra elementer til slutt.
38 While-løkker og preallokering: eksempel Modifiser Newtons metode til å ikke skrive ut midlertidige resultater, men returnere dem i en vektor.
39 Oversikt Funksjoner av vektorer Plotting Gjennomgang av øving 5 Funksjonskall Preallokering (Funksjoner som variabler) Persistente variabler
40 Konsept Egentlig ikke noe nytt konsept. (Bare litt ny syntaks) Man kan også se på en funksjon som et objekt som kan sendes rundt i koden Ikke bare en fil
40 Konsept Egentlig ikke noe nytt konsept. (Bare litt ny syntaks) Man kan også se på en funksjon som et objekt som kan sendes rundt i koden Ikke bare en fil Eksempler: integrer(funksjon, a, b) finn_nullpunkt(funksjon)
40 Konsept Egentlig ikke noe nytt konsept. (Bare litt ny syntaks) Man kan også se på en funksjon som et objekt som kan sendes rundt i koden Ikke bare en fil Eksempler: integrer(funksjon, a, b) finn_nullpunkt(funksjon) Gitt funksjonen f(x): min_funksjon = @f lager en ny variabel som referer til f(x) finn_nullpunkt(@f) kaller funksjonen finn_nullpunkt med funksjonen f som parameter.
41 Eksempel: numerisk integrering Estimer 100 0 x 2 dx ved å bruke matlabs integral-funksjon
42 Nytt konsept Kan lage funksjoner mens matlab kjører Kan brukes for funksjoner med bare ett uttrykk som regner ut resultatet.
42 Nytt konsept Kan lage funksjoner mens matlab kjører Kan brukes for funksjoner med bare ett uttrykk som regner ut resultatet. Syntaks: min_funksjon = @(<parameterliste>) = <uttrykk>;
42 Nytt konsept Kan lage funksjoner mens matlab kjører Kan brukes for funksjoner med bare ett uttrykk som regner ut resultatet. Syntaks: min_funksjon = @(<parameterliste>) = <uttrykk>; Eksempel: x_i_annen = @(x) x^2; x_i_annen(2) x_i_annen(5)
43 Eksempel: parametriserte sannsynlighetsfordelinger 1. Plott flere normalfordelinger med forskjellige forventningsverdier og varianser Eksempelbilde på wikipedia.
44 Eksempel: generisk newtons metode 1. Modifiser newtons metode til å fungere for vilkårlige funksjoner Nytt navn: finn_nullpunkt(f, df) 2. Bruk den nye newtons metode-funksjonen til å implementere kvadratrot
45 Eksempel: arrayfun Matlabfunksjonen arrayfun kaller en gitt funksjon for hvert element i en gitt liste. Bruk arrayfun til å estimere flere verdier av e x ved hjelp av h(x, i) fra tidligere eksempel.
46 Oversikt Funksjoner av vektorer Plotting Gjennomgang av øving 5 Funksjonskall Preallokering (Funksjoner som variabler) Persistente variabler
47 Konsept Brukes til å lagre verdier i en funksjons skop på tvers av funksjonskall. function y = f(x) persistent i; if isempty(i) i = 0; end i = i + 1; fprintf( f() kalt for %d. gang\n, i); y = x+x; end
48 Eksempel: bruk raskeste implementasjon Lag en funksjon raskeste_fibonacci(n), som bruker en persistent variabel til å holde den raskeste implementasjonen og regner ut svaret ved å bruke denne. 1. Opprett en lokal persistent variabel impl. 2. Hvis impl ikke er satt, ta tiden på fibonacci med og uten preallokering. 3. Bind impl til den raskeste funksjonen. 4. Returner svaret ved å kalle impl.