Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Kodeforståelsesoppgaver (total videotid: 32:52)

OppgaveVideotidBeskrivelseVanskelighetsgrad
Oppgave 5.1.1: Vektoriserte funksjoner

...

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

...

...

function y = f(x)
    y = 2 * pi * x;
end

Videoforklaring (5:07)

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.

5: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

Expand
titleHvis du har prøvd selv, trykk her for å se svaret...
 Nei, for funksjonen lar oss ikke regne ut svar for hele vektorer av gangen. Den kunne blitt vektorisert med bruk av elementvis opphøyd-i.
Hvordan avgjøre om en funksjon er vektorisert, og eventuelt hvordan den kunne blitt vektorisert.Lett
Oppgave 5.1.3:

...

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

...

Code Block
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 

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.
8:22Hvordan funksjoner uten preallokering blir ineffektive.Lett
Oppgave 5.1.5: Preallokering

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

4:43Om behovet for preallokering i vektorisert kode.Lett

Kodeoppgaver (total videotid: 1:39:13)

OppgaveVideotidBeskrivelseVanskelighetsgrad
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 

...

...

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 
19:

...

02Gradvis konstruksjon av vektor, preallokering og vektorisering.Middels

...

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

...

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

Expand
titleHvis du har prøvd selv, trykk her for å se svaret...
Code Block
titlekvadratrot.m
function retur = kvadratrot(tall)
    x = 1;
    er_over_feilgrense = true;
    i = 1;
    N = 4;
    retur = zeros(1, N);
    retur(1) = x;
    while er_over_feilgrense
       ny_x = x + (tall - x^2)/(2*x);
       relativ_endring = abs(ny_x - x)/x;
       er_over_feilgrense = relativ_endring >= 1e-9;
       x = ny_x;
       i = i + 1;
       if i > N
           N = 2*N;
           retur(N) = 0;
       end
       retur(i) = x;
    end
    retur = retur(1:i);
end 
Expand
titleScript som viser ytelsesfordelene ved preallokering
Expand
titletest_lag_lang_liste.m
Code Block
titletest_lag_lang_liste.m
teststorrelser = [10:10:100, 200:100:1000, 1000:1000:10000, 10000:10000:100000];
reps = 20;
res_gradvis_dobling = zeros(reps, length(teststorrelser));
res_utvid_liste = zeros(reps, length(teststorrelser));
res_preallokering = zeros(reps, length(teststorrelser));
for i = 1:length(teststorrelser)
    n = teststorrelser(i);
    for j = 1:reps
        fprintf('#%d - lag_lang_liste_gradvis_dobling(%d)\n', j, n);
        tic
        lag_lang_liste_gradvis_dobling(n);
        res_gradvis_dobling(j,i) = toc;
    end
    for j = 1:reps
        fprintf('#%d - lag_lang_liste_utvid_liste(%d)\n', j, n);
        tic
        lag_lang_liste_utvid_liste(n);
        res_utvid_liste(j,i) = toc;
    end 
    for j = 1:reps
        fprintf('#%d - lag_lang_liste_preallokering(%d)\n', j, n);
        tic
        lag_lang_liste_preallokering(n);
        res_preallokering(j,i) = toc;
    end 
end
fprintf('%15s %25s %25s %25s\n', 'Listestørrelse', 'Gradvis dobling [ms]', 'Utvid liste [ms]', 'Preallokering [ms]');
fprintf('%15d %25.3f %25.3f %25.3f\n', [teststorrelser; 1000*[mean(res_gradvis_dobling);  mean(res_utvid_liste); mean(res_preallokering)]]);
plot(teststorrelser, mean(res_gradvis_dobling), 'g-', teststorrelser, mean(res_utvid_liste), 'm-', teststorrelser, mean(res_preallokering), 'b-');
Expand
titlelag_lang_liste_utvid_liste.m
Code Block
titlelag_lang_liste_utvid_liste.m
function retur = lag_lang_liste_utvid_liste(n)
    retur = [];
    for i = 1:n
        retur(i) = i;
    end
end 
Expand
titlelag_lang_liste_gradvis_dobling.m
Code Block
titlelag_lang_liste_gradvis_dobling.m
function retur = lag_lang_liste_gradvis_dobling(n)
    N = 20;
    retur = zeros(1, N);
    for i = 1:n
        if i > N
            N = 2*N;
            retur(N) = 0;
        end
        retur(i) = i;
    end
    retur = retur(1:n);
end 
Expand
titlelag_lang_liste_preallokering.m
Code Block
titlelag_lang_liste_preallokering.m
function retur = lag_lang_liste_preallokering(n)
    retur = zeros(1, n);
    for i = 1:n
        retur(i) = i;
    end
end 

 

 

 

Oppgave 5.2.4: Tittel

 

Utdelt kode

Videoforklaring (mm:ss)

Løsningsforslag

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

 

Oppgave 5.2.5: Tittel

 

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...
15:49Produksjon av vektor i while-løkke, og hvordan dette kan gjøres effektivt.Vanskelig
Oppgave 5.2.4: Utregning av karaktersnitt20:42Større oppgave,med to løsninger beskrevet: en uvektorisert med for-løkke og preallokering, og en vektorisert.Vanskelig
Oppgave 5.2.5: 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

...