Created by Unknown User (benjambj), last modified on 05.10.2016
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.msom 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.
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');