480 likes | 628 Views
Nødhjelp i Matlab-programmering. Åsmund Eldhuset Siv.ing. datateknikk, NTNU Bekk Consulting AS. Hva er en datamaskin?. En ekstremt rask, men forholdsvis enkel kalkulator ("computer" == "beregner") Følger instruksjoner om hva slags beregninger den skal gjøre
E N D
Nødhjelp i Matlab-programmering Åsmund Eldhuset Siv.ing. datateknikk, NTNUBekk Consulting AS
Hva er en datamaskin? • En ekstremt rask, men forholdsvis enkel kalkulator ("computer" == "beregner") • Følger instruksjoner om hva slags beregninger den skal gjøre • Har et minne hvor den tar vare på informasjon (data) • Støtter følgende instruksjoner: • Aritmetikk (de fire regneartene) • Sammenligning (lik, ulik, større enn, mindre enn) • Logikk ("og", "eller", "ikke", "hvis") • Hoppe til en instruksjon en annen plass • Hente data fra minnet og legge data i minnet • Har input- og output-enheter som kan hente inn og vise data fra/til omverdenen (skjerm, tastatur, mus, høyttaler, harddisk...)
Hva er et dataprogram? • En sekvens av instruksjoner om hva datamaskinen skal gjøre • Når man kjører et program, følger datamaskinen instruksjonene
Skalarverdier og operatorer • Boolske operatorer
Output og input til/fra skjerm • fravær av semikolon gjør at resultatet av en linje blir skrevet ut • bruk disp() til å skrive ut ting i stedet, og sett alltid semikolon • input() leser data (vanligvis tall) som brukeren skriver inn med tastaturet inn i en variabel
Variabler • En variabel inneholder én verdi av gangen (men verdien kan være en matrise) • Tenk på det som en post-it-lapp med et navn og en verdi • Tilordning gjøres med = , og det vil umiddelbart slette den gamle verdien • Et variabelnavn på venstre side av = betyr "putt verdien på høyre side inn i denne variabelen"; alle andre steder betyr det "bruk verdien av denne variabelen"
who viser eksisterende variabler • clear sletter alle variabler
Semikolon og innrykk • En kodeblokk er et stykke kode som hører innunder en annen del av koden • Følgende setninger starter kodeblokker: function, if, else, else if, for, while. • F.eks.: innholdet i if-blokken er den koden som blir utført • Setningene som starter kodeblokker skal ikke ha semikolon; alle andre setninger bør ha det • Men de er ikke så strenge på semikolonbruk på eksamen • For leseligheten sin del bør man rykke inn (med tab-tasten) hver blokk - dvs. at hver linje etter function, if etc. skal rykkes inn, og end (og ingenting annet) skal rykke ut igjen
Uttrykk • Tall og matriser er uttrykk • Regneoperatorer med andre uttrykk på hver side er også uttrykk • Funksjonskall er også uttrykk • Et uttrykk som gir en verdi av en bestemt type (skalar/matrise) kan settes overalt hvor en verdi av den typen trengs
Matriser • En matrise er en todimensjonal tabell • Har et antall rader og et antall kolonner • En matrise med én rad og flere kolonner, eller én kolonne og flere rader, kan tenkes på som en liste • (En matrise med én rad og én kolonne kan tenkes på som ett enkelt tall) • Cellene kan inneholde tall, funksjoner, egentlig hva som helst - men som oftest inneholder hver matrise kun én type ting, og vanligvis tall
Matriser • Radene og kolonnene er nummerert, så hver celle har et rad- og et kolonnenummer • Å hente ut verdien i en spesifikk celle i en matrise kalles å indeksere matrisen • Row major-indeksering: radnummeret kommer først - A(3, 4) er rad 3, kolonne 4 • 1-basert indeksering: første rad/kolonne er nr. 1 (i mange andre språk begynner man nummereringen på 0)
Matriser • Uttrekking av submatriser:
Matriser • zeros(m) gir en mxm-matrise med bare nuller • zeros(m,n) gir en mxn-matrise med bare nuller • eye(m) gir en mxm identitetsmatrise ("eye" skal høres ut som I, symbolet for identitetsmatrisen)
Matriser • size(A) gir en 1x2-matrise med antall rader og antall kolonner i A • size(A,1) gir ant. rader, size(A,2) gir ant. kolonner • lister er egentlig kolonnevektorer, dvs. 1xn-matriser, så man må bruke size(X, 2) eller length(X)
Submatriser • Et kolon velger ut en hel rad/kolonne • Det går an å ha matriser med høyere dimensjon enn 2, og å bruke flere kolon • z = zeros(4, 7, 9);kan man tenke på som en tredimensjonal figur bestående av 4x7x9 små kuber, evt. som en • z(:, :, 3) henter ut den tredje 4x7-"skiven" • z(
Lister/vektorer • En liste er egentlig en radvektor, altså en todimensjonal matrise med én rad, men vi kan late som om den bare har én dimensjon • lst = [3 9 8 4] • lst(1), lst(2), lst(3), lst(4) er gyldige oppslag • lst(1, 1), lst(1, 2), lst(1, 3), lst(1, 4) er det også • length(lst) gir 4 • size(lst) gir [1 4], size(lst, 1) gir 1, size(lst, 2) gir 4 • Kan lage en kolonnevektor (mange rader og én kolonne) med [3; 9; 8; 4]
Ranges • 1 : 4 gir [1 2 3 4] • 1 : 2 : 5 gir [1 3 5] • 1 : 3 : 12 gir [1 4 7 10] • 5 : -1 : 2 gir [5 4 3 2] • 5 : -2 : 1 gir [5 3 1] • 6 : -2 : 1 gir [6 4 2] • 3.14 : 0.23 : 4 gir [3.14 3.37 3.60 3.83]
Funksjoner • Forskjellen på funksjoner og skript
Funksjoner • Variabelnavn inni funksjoner er bare synlige i den funksjonen, og kan godt være forskjellige fra de "egentlige" navnene på dataene • (((Evt.: data har egentlig ikke navn; variabler har navn, og variabler bare refererer til data))) • Du kan endre verdien til et argument (men du bør ikke), men endringen vil bare gjelde inni funksjonen • Merkelapp-metafor
Funksjoner • Returverdi-variabel • En funksjonsdeklarasjon ser slik ut:function returvariabel =funksjonsnavn(parametre)funksjonskodeend
Funksjoner • Resultatet av en funksjon vil ikke automatisk bli husket, så hvis man kaller en funksjon med de samme parametrene inni en løkke, vil den regnes ut på nytt hver gang • return vs. end
Funksjonspekere • Det er mulig å sende en funksjon som parameter til en annen funksjon • Evt. kan det tolkes som at man sender navnet til en funksjon som parameter, for å fortelle den andre funksjonen hvilken funksjon den skal benytte • Kan brukes til å gjøre funksjoner mer fleksible / anvendbare • Eksempel: map og reduce
Betingelser / if-blokker • Ikke "if-løkker", som mange sier...
Betingelser / if-blokker • if- og else if-betingelsene sjekkes etter tur ovenfra og ned • Kodeblokken som tilhører den første betingelsen som "slår inn" vil utføres - alle de andre blokkene hoppes over • Hvis ingen av betingelsene "slår inn", utføres else-blokken (som ikke skal ha noen betingelse) - men bare hvis den er der; hvis ikke skjer ingenting • Så: • Hvis det er en else, vil eksakt én av blokkene utføres • Hvis ikke, vil inntil én av blokkene utføres
While-løkker • Gjentar et stykke kode så lenge en bestemt betingelse er tilfredsstilt • Dette kan vi f.eks. bruke til å øke verdien til en variabel trinn for trinn, og typisk gjøre noe med variabelverdien hver gang • i = 1;while i < 4 disp(i); i = i + 1; end
While-løkker • Når kodeutføringen når "while", sjekkes det om utsagnet som står der er sant - i så fall går man inn i løkken og utfører kodeblokken; ellers hopper man ut forbi "end" • Når man når "end", hopper man opp igjen, og utsagnet sjekkes på ny (med evt. oppdaterte variabelverdier)
While-løkker • Det som skjer under utførelsen av den viste løkken kan man se for seg slik:i = 1;"er i < 4?" -> ja -> gå inn i blokkendisp(i); % printer 1i = i + 1; % i blir 2end -> gå opp igjen"er i < 4?" -> ja -> gå inn i blokkendisp(i); % printer 2i = i + 1; % i blir 3end -> gå opp igjen"er i < 4?" -> ja -> gå inn i blokkeni = i + 1; % i blir 4end -> gå opp igjen"er i < 5?" -> nei -> gå ut til etter end
For-løkker • Gjentar et stykke kode en gang for hvert element i en vektor, og lar oss se på "det gjeldende vektorelementet" inni kodestykket • Hvis du sliter med å se hvordan de skal bygges opp, prøv å skrive alle linjene fullt ut og prøv å se mønstre • break, continue vs. end
For-løkker vs. while-løkker • Enhver for-løkke kan skrives som en while-løkke
Tilfeldige tall • (lotto-oppgaven)
Lesing og skriving fra/til fil • Skiller mellom tekstlig (formatert) I/O og binær I/O • Tekstlig: leselig for mennesker. Tall er representert som bytes med tegnkoder for sifrene i tallet • Kaster bort en del plass • Binært: uleselig for mennesker. Tall er representert på samme måte som i minnet (bits som representerer et binært desimaltall)
Lesing og skriving fra/til fil • Innholdet i en fil regnes som én lang liste, men matlab klarer å lese det inn i en matrise likevel hvis du sier hvor høy matrisen er • La oss si at du har lyst til å hente kun én verdi fra en matrise som er lagret i en fil • Du vil hente verdien på rad r, kolonne c • Matrisen har m rader (dette må du vite på forhånd; det står ikke i filen) • Du må altså hoppe over r-1 kolonner med m celler i hver
Tankegang • Må formulere løsningen på problemet vårt på datamaskinens vilkår • Prøv å sett dere i maskinens plass... • Maskinen kan bare gjøre én operasjon av gangen, på opptil to verdier: • Addisjon, subtraksjon, multiplikasjon, divisjon • Øke/senke verdien av et tall • Sammenligne to tall og se hvilket som er størst • Hoppe til et annet sted i koden basert på resultatet av en sammenligning (if/else, for, while) • ...men den kan huske påmange tall (minnet), inkludert en lang liste med instruksjoner (programkoden vår)!
Manuell matriseaddisjon • Hvorfor lage dette når det er innebygd i Matlab? • God programmeringstrening • ...men finn aldri opp hjulet på nytt i en jobbsituasjon • Regler for matriseaddisjon: • To matriser A og B kan adderes hvis de er like store • Resultatmatrisen C får samme størrelse • Hvert element i C er summen av de tilsvarende elementene i A og B
Manuell matriseaddisjon • Hva må funksjonen gjøre? • Ta inn to matriser A og B som parametre • Kontrollere at A og B er like store (og avslutte hvis ikke) • Opprette resultatmatrisen C som nullmatrise • "Hvert element i C er summen av de tilsvarende elementene i A og B" - ikke presist nok! • Hvordan angir man et element i en matrise? • Element C(i, j) skal settes til A(i, j) + B(i, j) • Dette skal gjøres for alle elementene -> vi trenger to løkker, én for hver variabel!
Manuell matrisemultiplikasjon • Regler for matrisemultiplikasjon : • To matriser A og B kan multipliseres hvis A har like mange kolonner som B har rader • Resultatmatrisen C får like mange rader som A og kolonner som B • Hvert element i C er prikkproduktet av tilsvarende rad fra A og tilsvarende kolonne fra B • ...dvs.: multipliser første element fra tilsvarende rad i A med første element fra tilsvarende kolonne i B osv., og summer alle produktene
Løsing av ligningssett • A x = b • A er koeffisientene, x er de ukjente, b er konstantene • Ganske enkelt hvis nedre venstre halvpart av A bare inneholder nuller: • Matlab løser dette for oss med x = A \ b
Triksing med løkker • (Sjakkbrett-trekk, fortran)
Boblesortering • I hvert "pass" blir det største tallet på veien trukket helt opp mot høyre • Det nest største osv. vet vi ingenting om, for det blir "satt igjen" når det møter det største
Flettesortering (merge sort) • Bruker rekursjon, dvs. at en funksjon kaller seg selv • TODO: Er dette pensum? Quicksort er lettere å implementere. Vis evt. rekursiv selection sort først
Funksjonspekere • f = @(x) sin(x); • f blir en peker til, eller et alias for, sin • f(2) vil da oppføre seg som om det hadde stått sin(2) • @(x) betyr "jeg ønsker å lage en peker til en funksjon som tar ett parameter, som vi kaller for x" • Hva trenger vi dette til? • Sende funksjoner som parametre til andre funksjoner (hjelp...) • F.eks. en deriverings- eller integreringsfunksjon • Eller en sorteringsfunksjon (hvordan skal elementene sammenlignes?)