1 / 48

Nødhjelp i Matlab-programmering

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

brant
Download Presentation

Nødhjelp i Matlab-programmering

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Nødhjelp i Matlab-programmering Åsmund Eldhuset Siv.ing. datateknikk, NTNUBekk Consulting AS

  2. 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...)

  3. 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

  4. Skalarverdier og operatorer

  5. Skalarverdier og operatorer • Boolske operatorer

  6. 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

  7. 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"

  8. who viser eksisterende variabler • clear sletter alle variabler

  9. 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

  10. 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

  11. 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

  12. 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)

  13. Matriser • Uttrekking av submatriser:

  14. 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)

  15. 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)

  16. 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(

  17. 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]

  18. 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]

  19. Skript

  20. Funksjoner • Forskjellen på funksjoner og skript

  21. 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

  22. Funksjoner • Returverdi-variabel • En funksjonsdeklarasjon ser slik ut:function returvariabel =funksjonsnavn(parametre)funksjonskodeend

  23. 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

  24. 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

  25. Tilfeldige tall

  26. Betingelser / if-blokker • Ikke "if-løkker", som mange sier...

  27. 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

  28. 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

  29. 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)

  30. 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

  31. 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

  32. For-løkker vs. while-løkker • Enhver for-løkke kan skrives som en while-løkke

  33. Tilfeldige tall • (lotto-oppgaven)

  34. 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)

  35. 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

  36. 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)!

  37. 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

  38. 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!

  39. 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

  40. 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

  41. Triksing med løkker • (Sjakkbrett-trekk, fortran)

  42. Sortering

  43. 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

  44. Kamsortering

  45. 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

  46. 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?)

  47. Filer

  48. Databaser / SQL?

More Related