Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

Include Page
ITGK - Matlab - Meny
ITGK - Matlab - Meny

Kodeforståelsesoppgaver (total videotid: 32:52)

OppgaveVideotidBeskrivelseVanskelighetsgrad
Oppgave 5.1.1: Vektoriserte funksjoner

...

Funksjonen under regner ut omkretsen av en sirkel. Er den vektorisert?

...

languagenone
titlef.m

...

...

5:

...

Widget Connector
urlhttps://www.youtube.com/watch?v=WMgzg5FUnD8

Svar

Expand
titleHvis du har prøvd selv, trykk her for å se svaret...

Ja, funksjonen lar oss regne ut en mengde omkretser på en gang ved å utnytte Matlabs innebygde operasjoner.

08Hvordan avgjøre om en funksjon er vektorisert eller ikkeLett
Oppgave 5.1.2:

...

Funksjonen under regner ut arealet av en sirkel. Er den vektorisert? Hvordan kan den eventuelt vektoriseres?

Code Block
titleg.m
function y = g(x)
    y = pi * x ^ 2;
end 
3:54

...

Widget Connector
urlhttps://www.youtube.com/watch?v=kNcp3VZ44AY

Svar

...

titleHvis du har prøvd selv, trykk her for å se svaret...
Hvordan avgjøre om en funksjon er vektorisert, og eventuelt hvordan den kunne blitt vektorisert.Lett

...

...

Funksjonen under regner ut verdien som tilsvarer et romersiffer. Er den vektorisert? Hvordan kan den eventuelt vektoriseres?

Code Block
titlefra_romersiffer.m
function retur = fra_romersiffer(siffer)
    switch siffer
        case 'I', verdi = 1;
        case 'V', verdi = 5;
        case 'X', verdi = 10;
        case 'L', verdi = 50;
        case 'C', verdi = 100;
        case 'D', verdi = 500;
        case 'M', verdi = 1000;
    end
    retur = verdi;
end

Videoforklaring (10:48)

Widget Connector
urlhttps://www.youtube.com/watch?v=SocKnUOVGrQ

Svar

...

titleHvis du har prøvd selv, trykk her for å se svaret...

...

Vektoriserte funksjoner10:49Vektoriseringsstatus av funksjon som bruker switch-setning, hvordan dette generelt er vanskelig, og verdien av "liksom-vektorisering" vha for-løkker.Middels
Oppgave 5.1.4: Preallokering

...

Hva er ineffektivt med funksjonen som står i filen under? Hvordan kan den forbedres?

...

Videoforklaring (8:21)

Widget Connector
urlhttps://www.youtube.com/watch?v=QHtL02MEO-Q

Svar

Expand
titleHvis du har prøvd selv, trykk her for å se svaret...
Listen retur vokser med ett element for hver iterasjon i løkken. Det fører til mye kopiering av data. Den forbedres hvis man før for-løkken binder retur til en vektor med plass til alle elementene som skal produseres.

...

titlefib.m

...

function retur = fib(n)
    retur = [0, 1];
    for i = 3:n
        retur(i) = retur(i-1) + retur(i-2);
    end
    retur = retur(1:n);
end 
8:22Hvordan funksjoner uten preallokering blir ineffektive.Lett

Er preallokering nødvendig i funksjonen under?

Code Block
titlediff.m
function retur = diff_2(x)
    retur = x(2:end) - x(1:end-1);
end

Videoforklaring (4:42)

Widget Connector
urlhttps://www.youtube.com/watch?v=rhSjBfqshWQ

Svar

Expand
titleHvis du har prøvd selv, trykk her for å se svaret...
 Nei, koden er vektorisert og produserer hele resultatlisten på en gang. Preallokering er bare nødvendig hvis vi produserer ett og ett element av gangen i en selvskrevet løkke.

Kodeoppgaver

Oppgave 5.2.1: Samlet Fahrenheitoversikt

Du har tidligere laget et script som konverterer Celsius-verdier en bruker skriver inn fortløpende til Fahrenheit. For at utskriften fra scriptet skal bli mer oversiktlig, ønsker du å samle all utskriften i stedet for at den kommer fortløpende.

Endre scriptet slik at utskriften kommer først etter at brukeren har skrevet inn alle Celsius-verdiene.  Konverteringene skal også skrives ut i rekkefølge etter stigende Celsius-verdi.

Utdelt kode

Expand
titlefahrenheit.m
Code Block
titlefahrenheit.m
svar = input('Ønsker du å skrive inn egne Celsius-verdier? (ja/nei) ', 's');
if strcmp(svar, 'ja')
    celsius = les_inn_tall('Skriv inn Celsius-verdi: ');
    while ~isempty(celsius)
        skriv_ut_fahr(celsius);
        celsius = les_inn_tall('Skriv inn Celsius-verdi: ');
    end
else
    skriv_ut_fahr(-20);
    skriv_ut_fahr(0);
    skriv_ut_fahr(18);
    skriv_ut_fahr(37);
    skriv_ut_fahr(100);
end 
Expand
titleles_inn_tall.m
Code Block
titleles_inn_tall.m
function retur = les_inn_tall(melding)
    tallstr = input(melding, 's');
    tall = str2double(tallstr);
    er_ugyldig = isnan(tall);
    while er_ugyldig && ~isempty(tallstr)
        fprintf('Teksten %s kan ikke tolkes som et tall\n', tallstr);
        tallstr = input(melding, 's');
        tall = str2double(tallstr);
        er_ugyldig = isnan(tall);
    end
    if isempty(tallstr)
        retur = [];
    else
        retur = tall;
    end
end 
Expand
titleskriv_ut_fahr.m
Code Block
titleskriv_ut_fahr.m
function skriv_ut_fahr(celsius)
    fahr = cels2fahr(celsius);
    fprintf('Celsiusverdi %.2f tilsvarer Fahrenheitverdi %.2f\n', celsius, fahr);
end 
Expand
titlecels2fahr.m
Code Block
titlecels2fahr.m
function retur = cels2fahr(celsius)
    retur = 9/5*celsius + 32;
end 

 

Videoforklaring (19:00)

Del 1 (9:47)Del 2 (9:13)
Widget Connector
urlhttps://www.youtube.com/watch?v=zsCSVsX8Sk0
Widget Connector
urlhttps://www.youtube.com/watch?v=cLzbyoWHbxs

 

Løsningsforslag

Expand
titleHvis du har prøvd selv, trykk her for å se svaret...
Code Block
titlefahrenheit.m
svar = input('Ønsker du å skrive inn egne Celsius-verdier? (ja/nei) ', 's');
if strcmp(svar, 'ja')
    celsius = les_inn_tall('Skriv inn Celsius-verdi: ');
    les_inn_flere = ~isempty(celsius);
    while les_inn_flere
        siste_verdi = les_inn_tall('Skriv inn Celsius-verdi: ');
        les_inn_flere = ~isempty(siste_verdi);
        celsius = [celsius, siste_verdi];
    end
    celsius = sort(celsius);
    skriv_ut_fahr(celsius);
else
    skriv_ut_fahr([-20, 0, 18, 37, 100]);
end
Code Block
titleskriv_ut_fahr.m
function skriv_ut_fahr(celsius)
    fahr = cels2fahr(celsius);
    fprintf('Celsiusverdi %.2f tilsvarer Fahrenheitverdi %.2f\n', [celsius; fahr]);
end 
4:43Om behovet for preallokering i vektorisert kode.Lett

Kodeoppgaver (total videotid: 1:39:13)

Preallokering og vektorisering handler om å få Matlab-koden til å kjøre fort, og siden slik optimalisering et mer avansert ekstrasteg man tar først når man vet hvordan man får kode som er korrekt er det i denne uken fokusert på vanskeligere kodeoppgaver. De to første demonstrerer vektorisering og preallokering, mens de tre neste handler om mer avansert Matlab-bruk. Oppgave tre viser hvordan man kan kombinere preallokering og while-løkker, mens oppgave fire og fem demonstrerer Matlab-problemløsningsmåten man bruker hvis man vil skrive vektorisert kode fremfor kode med egne for-løkker.

OppgaveVideotidBeskrivelseVanskelighetsgrad
Oppgave 5.2.1: Samlet Fahrenheitoversikt19:02Gradvis konstruksjon av vektor, preallokering og vektorisering.Middels
Oppgave 5.2.2: Karakterer

...

10:26Preallokering i funksjon som returnerer en vektor med

...

PoengsumKarakter
89-100A
77-88B
65-76C
53-64D
41-52E
0-40F

Videoforklaring (10:25)

Widget Connector
urlhttps://www.youtube.com/watch?v=QaSt12X5DLc

Løsningsforslag

...

titleHvis du har prøvd selv, trykk her for å se svaret...

...

titlekarakterer.m

...

verdier.Middels
Oppgave 5.2.3

...

I en tidligere oppgave lagde du en funksjon som estimerte hva kvadratroten av et tall var, ved å bruke iterasjoner av Newtons metode. Du har nå lyst til å analysere hvordan estimatene utvikler seg. I stedet for å skrive ut estimatene, har du lyst til å returnere dem i en vektor. Oppdater funksjonen til å fungere slik i stedet.

Utdelt kode

Expand
titlekvadratrot.m
Code Block
titlekvadratrot.m
function retur = kvadratrot(tall)
    x = 1;
    er_over_feilgrense = true;
    i = 1;
    while er_over_feilgrense
       ny_x = x + (tall - x^2)/(2*x);
       fprintf('Iterasjon #%d: x_%d = %.10f, x_%d = %.10f\n', i, i-1, x, i, ny_x);
       relativ_endring = abs(ny_x - x)/x;
       er_over_feilgrense = relativ_endring >= 1e-9;
       x = ny_x;
       i = i + 1;
    end
    retur = x;
end 

Videoforklaring (15:46)

Del 1 (4:00)Del 2 (9:12)Del 3 (2:34)
Widget Connector
urlhttps://www.youtube.com/watch?v=1VBnsEaz-lg
Widget Connector
urlhttps://www.youtube.com/watch?v=lC3Jy8uVECM
Widget Connector
urlhttps://www.youtube.com/watch?v=IE42ZNiVcMc

Løsningsforslag

...

titleHvis du har prøvd selv, trykk her for å se svaret...

...

titlekvadratrot.m

...

: Utvikling av kvadratrotestimat15:49Produksjon av vektor i while-løkke, og hvordan dette kan gjøres effektivt.Vanskelig
Oppgave 5.2.4:

...

 

Utdelt kode

Videoforklaring (mm:ss)

Løsningsforslag

...

titleHvis du har prøvd selv, trykk her for å se svaret...
Utregning av karaktersnitt20:42Større oppgave,med to løsninger beskrevet: en uvektorisert med for-løkke og preallokering, og en vektorisert.Vanskelig

...

...

 

Utdelt kode

Videoforklaring (mm:ss)

Løsningsforslag

Expand
titleHvis du har prøvd selv, trykk her for å se svaret...

 

Oppgave 5.2.6: Tittel

 

Utdelt kode

Videoforklaring (mm:ss)

Løsningsforslag

Expand
titleHvis du har prøvd selv, trykk her for å se svaret...

 

Oppgave x.y.z: Tittel

 

Utdelt kode

Videoforklaring (mm:ss)

Løsningsforslag

...

titleHvis du har prøvd selv, trykk her for å se svaret...
Flyplasskø33:26Større oppgave om matrisemanipulasjon, med to løsninger beskrevet: en uvektorisert med for-løkke og preallokering, og en vektorisert.Vanskelig

Alle oppgavene på en side

Oppgavevideoer uke 41 - alle oppgaver

...