Kodeforståelsesoppgaver

Oppgave 6.1.1: Persistente variabler

Hva skrives ut hvis vi kjører scriptet oppgave_1.m? Anta at funksjonen f() aldri har blitt kalt tidligere, eller at dens tilstand har blitt slettet vha clear f.
f() + f()
f()
clear f
f() 
f.m
function y = f()
    persistent x;
    if isempty(x)
        disp('Binder x til 0');
        x = 0;
    else
        x = x + 1;
    end
    fprintf('Retur er %d\n', x);
    y = x;
end

 

Videoforklaring (11:27)

 

Svar

Binder x til 0
Retur er 0
Retur er 1
ans =
     1
Retur er 2
ans =
     2
Binder x til 0
Retur er 0
ans =
     0

Oppgave 6.1.2: Retur av flere verdier

Hvilke verdier har variablene x, y og z etter at vi kjører scriptet «oppgave_2.m»?
oppgave_2.m
x = 1;
y = 2;
z = 3;
[y, z, x] = q(x, y, z);
q.m
function [z, y, x] = q(x, z, y)
end 

 

Videoforklaring (5:13)

Svar

x =
     1
y =
     2
z =
     3

Oppgave 6.1.3: Retur av flere verdier

Hva skrives ut hvis vi kjører scriptet «oppgave_3.m»?
oppgave_3.m
x = u()
u()
[x, y] = u()
[x, y, z] = u()
u.m
function [a, b, c] = u()
    a = 50;
    b = 7;
    c = 1000;
end 

 

Videoforklaring (7:31)

Svar

x =
    50
ans =
    50
x =
    50
y =
     7
x =
    50
y =
     7
z =
        1000

Oppgave 6.1.4: Funksjonsvariabler

Hva skrives ut hvis vi kjører scriptet oppgave_4.m?
oppgave_4.m
x = g
y = @g
x = y
x = y() 
g.m
function retur = g()
    retur = 100;
end 

Videoforklaring (6:47)

Svar

x =
   100
y = 
    @g
x = 
    @g
x =
   100

Oppgave 6.1.5: Anonyme funksjoner

Hva skrives ut hvis vi kjører scriptet oppgave_5.m?
oppgave_5.m
f = @(x) x + 3
f(2) == h(2) 
h.m
function retur = h(x)
    retur = x + 3;
end 

Videoforklaring (9:19)

Svar

f = 
    @(x)x+3
ans =
     1


Kodeoppgaver

Oppgave 6.2.1: Kvadratrotestimatfigur

Du har tidligere laget en funksjon som estimerer kvadratroten til et tall, og som returnerer en liste av alle estimatene. Du vil nå visualisere hvordan estimatene utvikler seg ved plotte dem i en figur.

Lag en funksjon som tar et tall som parameter, og som lager en figur som viser:

  • Verdien av tallet vi vil finne kvadratroten av som en horisontal linje.
  • En linje med de forskjellige kvadratrotestimatene vi får fra vår kvadratrotsfunksjon, med punkt (0, x0), (1, x1), …, (n, xn)

La x-aksen gå fra 0 til n, og y-aksen gå fra 0 til ti prosent mer enn den største y-verdien til linjene.

Utdelt kode

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

Videoforklaring (17:02) 

Del 1 (6:04)Del 2 (10:58)
Introduksjon og forklaring av oppgaven, og start på løsningsfunksjon (ingen plotting).Matlab-kode for å konstruere figuren.


Løsningsforslag

plott_kvadratrotestimat.m
function plott_kvadratrotestimat(tall)
    estimat = kvadratrot(tall);
    n = length(estimat) - 1;
    plot([0, n], [tall, tall], 0:n, estimat);
    y_max_1 = tall;
    y_max_2 = max(estimat);
    y_max = max(y_max_1, y_max_2);
    axis([0, n, 0, 1.1*y_max]);
end 

Oppgave 6.2.2: Tippekuponganalyse

Du lager et program for å håndtere tippingkuponger for fotballresultat. En tippekupong representeres med en 12 x 3 matrise med sannhetsverdier, hvor hver rad er en kamp og en kolonne angir om spilleren har tippet hjemmeseier, uavgjort eller borteseier for kampen.

Du ønsker å kunne analysere tippekuponger, og finne ut om en kupong er gyldig utfylt og hvor mange rett den har. Du har allerede laget et script opprett_kuponger.m som lager en rekke testkuponger og en fasitkupong du kan bruke til testing.

Skriv en funksjon som tar inn to tippekuponger, en gjetning og en med korrekte resultat, som returnerer en logisk variabel som sier om kupongen er gyldig, en liste over kampene hvor tippingen var korrekt, og antall korrekte resultat.

Utdelt kode

opprett_kuponger.m
kupong1 = [ true false false;
            false true false;
            true false false;
            true false false;
            false false true;
            false true false;
            false true false;
            false true false;
            false false true;
            true false true;
            false false true;
            true false false ];
        
kupong2 = [ false true false;
            false true false;
            true false false;
            false false true;
            false true false;
            false true false;
            true false false;
            false true false;
            false true false;
            false false true;
            false false true;
            true false false ];
        
kupong3 = [ true true true;
            true true true;
            true true true;
            true true true;
            true true true;
            true true true;
            true true true;
            true true true;
            true true true;
            true true true;
            true true true;
            true true true ];

fasit_kupong = [ false true false;
                 false true false;
                 true false false;
                 false false true;
                 false false true;
                 false false true;
                 false false true;
                 true false false;
                 false true false;
                 true false false;
                 true false false;
                 false false true ];
             
assert(all(size(kupong1) == [12, 3]));
assert(all(size(kupong2) == [12, 3]));
assert(all(size(kupong3) == [12, 3]));
assert(all(size(fasit_kupong) == [12, 3]));
 

Videoforklaring (33:08)

Del 1 (8:14)Del 2 (4:29)Del 3 (8:14)Del 4 (12:11)
Introduksjon av problemet, om retur av flere parametre,
og konstruksjon av funksjonens ytre.
Problemoppdeling, bruk av lokale funksjoner/hjelpefunksjoner til å
gjenspeile dette, og løsning av hovedfunksjonen.
 Kode for å avgjøre om en kupong er gyldig eller ikke.

Kode for å avgjøre på hvilke rader en kupong treffer en fasit, og test av
hele funksjonen. 


Løsningsforslag

analyser_tippekupong.m
function [ er_gyldig, treff, antall_treff ] = analyser_tippekupong(gjetninger, fasit)
    er_gyldig = er_kupong_gyldig(gjetninger);
    treff = finn_treff(gjetninger, fasit);
    antall_treff = length(treff);
end
   
function retur = er_kupong_gyldig(kupong)
    %% Vektorisert løsning
    antall_kryss_per_rad = sum(kupong, 2);
    er_rad_gyldig = antall_kryss_per_rad == 1;
    retur = all(er_rad_gyldig);
    
    %% Uvektorisert kan den skrives slik:
    % for i = 1:size(kupong, 1)
    %    n_kryss = 0;
    %    for j = 1:size(kupong, 2)
    %        if kupong(i, j)
    %            n_kryss = n_kryss + 1;
    %        end
    %    end
    %    if n_kryss ~= 1
    %        retur = false;
    %        return;
    %    end
    % end
    % retur = true;
end
   
function retur = finn_treff(kupong, fasit)
	%% Vektorisert kan den skrives slik:
    % retur = find(any(kupong & fasit, 2));
    
    %% Uvektorisert kode følger.
    retur = [];
    for i = 1:size(kupong, 1)
        for j = 1:size(kupong, 2)
            if kupong(i, j) && fasit(i, j)
                retur(end+1) = i;
            end
        end
    end
end 

Oppgave 6.2.3: Tippekupong vinnersjansestatistikk

.Du lager et program for å håndtere tippingkuponger for fotballresultat. Du har tidligere laget en funksjon som analyserer en tippekupong. Du ønsker nå å bruke funksjonen til å få en oversikt over vinneroddsen i fotballtipping.

Lag et script som genererer 10000 tilfeldige tippekuponger og resultat, for hver av dem regner ut hvor mange korrekte gjetninger det var i kupongen, og som til slutt lager et histogram som viser fordelingen av antall korrekte resultat i tippekupongene.

Utdelt kode
 

analyser_tippekupong.m
function [ er_gyldig, treff, antall_treff ] = analyser_tippekupong(gjetninger, fasit)
    er_gyldig = er_kupong_gyldig(gjetninger);
    treff = finn_treff(gjetninger, fasit);
    antall_treff = length(treff);
end
function retur = er_kupong_gyldig(kupong)
    antall_kryss_per_rad = sum(kupong, 2);
    er_rad_gyldig = antall_kryss_per_rad == 1;
    retur = all(er_rad_gyldig);
end
function retur = finn_treff(kupong, fasit)
    retur = all(sum(kupong, 2) == 1);
end 

Videoforklaring (19:22)

Del 1 (5:34)Del 2 (5:20)Del 3 (3:52)Del 4 (4:36)
Oppgaveintroduksjon, og problemoppdeling.Hvordan generere en tilfeldig kupong.Gjenbruk av funksjon fra oppgave 6.2.2, og bruk av for-løkke til å samle 10000 resultat.

Plotting av histogram, både med antall og prosentandel langs y-aksen.


Løsningsforslag

lag_tilfeldig_kupong.m
function retur = lag_tilfeldig_kupong()
    retur = false(12, 3);
    for i = 1:12
        tilfeldig_kolonne = randi(3);
        retur(i, tilfeldig_kolonne) = true;
    end
end
lag_kupong_histogram.m
treff = zeros(1, 10000);
for i = 1:10000
    kupong = lag_tilfeldig_kupong();
    fasit = lag_tilfeldig_kupong();
    [~, ~, antall_treff] = analyser_tippekupong(kupong, fasit);
    treff(i) = antall_treff;
end
histogram(treff);
% Man kan lage et histogram hvor y-aksen er prosentandel og ikke antall ved å kalle histogram slik:
% histogram(treff, 'Normalization', 'probability'); 

  • No labels