Kodeforståelsesoppgaver (total videotid: 32:52)
...
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 |
---|
url | https://www.youtube.com/watch?v=WMgzg5FUnD8 |
---|
|
Svar
Expand |
---|
title | Hvis 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:08 | Hvordan avgjøre om en funksjon er vektorisert eller ikke | Lett |
Oppgave 5.1.2: |
...
Funksjonen under regner ut arealet av en sirkel. Er den vektorisert? Hvordan kan den eventuelt vektoriseres?
Code Block |
---|
|
function y = g(x)
y = pi * x ^ 2;
end |
...
Widget Connector |
---|
url | https://www.youtube.com/watch?v=kNcp3VZ44AY |
---|
|
Svar
Expand |
---|
title | Hvis 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 |
---|
|
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 |
---|
url | https://www.youtube.com/watch?v=SocKnUOVGrQ |
---|
|
Svar
...
title | Hvis du har prøvd selv, trykk her for å se svaret... |
---|
...
...
Code Block |
---|
|
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 |
---|
url | https://www.youtube.com/watch?v=QHtL02MEO-Q |
---|
|
Svar
Expand |
---|
title | Hvis 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. |
Er preallokering nødvendig i funksjonen under?
Code Block |
---|
|
function retur = diff_2(x)
retur = x(2:end) - x(1:end-1);
end |
Videoforklaring (4:42)
Widget Connector |
---|
url | https://www.youtube.com/watch?v=rhSjBfqshWQ |
---|
|
Svar
Expand |
---|
title | Hvis 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:43 | Om behovet for preallokering i vektorisert kode. | Lett |
Kodeoppgaver (total videotid: 1:39:13)
...
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 |
---|
|
Code Block |
---|
| 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 |
---|
|
Code Block |
---|
| 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 |
---|
|
Code Block |
---|
| function skriv_ut_fahr(celsius)
fahr = cels2fahr(celsius);
fprintf('Celsiusverdi %.2f tilsvarer Fahrenheitverdi %.2f\n', celsius, fahr);
end |
|
Expand |
---|
|
Code Block |
---|
| function retur = cels2fahr(celsius)
retur = 9/5*celsius + 32;
end |
|
...
...
Del 1 (9:47) | Del 2 (9:13) |
---|
Widget Connector |
---|
url | https://www.youtube.com/watch?v=zsCSVsX8Sk0 |
---|
|
| Widget Connector |
---|
url | https://www.youtube.com/watch?v=cLzbyoWHbxs |
---|
|
|
Løsningsforslag
Expand |
---|
title | Hvis du har prøvd selv, trykk her for å se svaret... |
---|
|
Code Block |
---|
| 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 |
---|
| function skriv_ut_fahr(celsius)
fahr = cels2fahr(celsius);
fprintf('Celsiusverdi %.2f tilsvarer Fahrenheitverdi %.2f\n', [celsius; fahr]);
end |
|
...
02 | Gradvis konstruksjon av vektor, preallokering og vektorisering. | Middels |
...
10:26 | Preallokering i funksjon som returnerer en vektor med |
...
Poengsum | Karakter |
---|
89-100 | A |
77-88 | B |
65-76 | C |
53-64 | D |
41-52 | E |
0-40 | F |
Videoforklaring (10:25)
Widget Connector |
---|
url | https://www.youtube.com/watch?v=QaSt12X5DLc |
---|
|
Løsningsforslag
...
title | Hvis du har prøvd selv, trykk her for å se svaret... |
---|
...
...
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 |
---|
|
Code Block |
---|
| 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 |
---|
url | https://www.youtube.com/watch?v=1VBnsEaz-lg |
---|
|
| Widget Connector |
---|
url | https://www.youtube.com/watch?v=lC3Jy8uVECM |
---|
|
| Widget Connector |
---|
url | https://www.youtube.com/watch?v=IE42ZNiVcMc |
---|
|
|
Løsningsforslag
Expand |
---|
title | Hvis du har prøvd selv, trykk her for å se svaret... |
---|
|
Code Block |
---|
| 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 |
---|
title | Script som viser ytelsesfordelene ved preallokering |
---|
|
Expand |
---|
title | test_lag_lang_liste.m |
---|
| Code Block |
---|
title | test_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 |
---|
title | lag_lang_liste_utvid_liste.m |
---|
| Code Block |
---|
title | lag_lang_liste_utvid_liste.m |
---|
| function retur = lag_lang_liste_utvid_liste(n)
retur = [];
for i = 1:n
retur(i) = i;
end
end |
|
Expand |
---|
title | lag_lang_liste_gradvis_dobling.m |
---|
| Code Block |
---|
title | lag_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 |
---|
title | lag_lang_liste_preallokering.m |
---|
| Code Block |
---|
title | lag_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 |
---|
title | Hvis du har prøvd selv, trykk her for å se svaret... |
---|
|
|
Oppgave 5.2.5: Tittel
Utdelt kode
Videoforklaring (mm:ss)
Løsningsforslag
Expand |
---|
title | Hvis du har prøvd selv, trykk her for å se svaret... |
---|
|
|
Oppgave 5.2.6: Tittel
Utdelt kode
Videoforklaring (mm:ss)
Løsningsforslag
Expand |
---|
title | Hvis du har prøvd selv, trykk her for å se svaret... |
---|
|
|
Oppgave x.y.z: Tittel
Utdelt kode
Videoforklaring (mm:ss)
Løsningsforslag
...
title | Hvis du har prøvd selv, trykk her for å se svaret... |
---|
15:49 | Produksjon av vektor i while-løkke, og hvordan dette kan gjøres effektivt. | Vanskelig |
Oppgave 5.2.4: Utregning av karaktersnitt | 20:42 | Stø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:26 | Stø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
...