Skip to end of metadata
Go to start of metadata

I sikkerhetskontrollen på Værnes er det gjerne lite trykk på Fast-track-sporet, men mange med dårlig tid i den vanlige køen. Det er derfor ønskelig å lage et system som velger ut personene med dårligst tid fra den vanlige køen slik at man kan sluse de til Fast-track i stedet. Datasystemene til Værnes representerer personene i køen som tall i en matrise, hvor tallene representerer antall minutt til personens fly går. Eksempeldata er samlet i scriptet testkoe.m. Lag en funksjon som tar inn en slik matrise, og som returnerer en ny matrise med en kolonne mindre slik at personene med dårligst tid er fjernet. Tips: man kan finne den sorterte rekkefølgen til en vektor med Matlab-koden [~, ordning] = sort(v).

Figuren illustrerer en flyplasskø til venstre, og matriserepresentasjonen som brukes til høyre.

Utdelt kode

 testkoe.m
testkoe.m
koe = [
    93, 91, 200, 25, 37;
    75, 93, 112, 30, 52;
    121, 141, 134, 69, 66;
    32, 133, 118, 39, 111;
    27, 68, 93, 95,  35;
    86, 22, 83, 75, 141;
    91, 88, 120, 93, 95
]; 

 

Videoforklaring (33:23)

Del 1 (5:10)Del 2 (14:55)Del 3 (13:18)
Introduksjon til problemet, og definisjon av funksjonens ytre.Løsning med for-løkker og preallokering.Løsning med vektorisert kode.

 

Løsningsforslag

 Hvis du har prøvd selv, trykk her for å se svaret...
 Uvektorisert løsning
 ny_flyplasskoe.m
ny_flyplasskoe.m
function retur = ny_flyplasskoe(koe)
    [n_rad, n_kol] = size(koe);
    retur = zeros(n_rad, n_kol - 1);
    flat_koe = koe(:);
    [~, sortert_paa_tid] = sort(flat_koe);
    pers_med_daarligst_tid = sortert_paa_tid(1:n_rad);
    neste_person = 1;
    for j = 1:n_kol - 1
        for i = 1:n_rad
            % Regn verdien til retur(i, j)
            while ismember(neste_person, pers_med_daarligst_tid)
                neste_person = neste_person + 1;
            end
            retur(i, j) = flat_koe(neste_person);
            neste_person = neste_person + 1;
        end
    end
end
 Vektorisert løsning
 ny_flyplasskoe.m
ny_flyplasskoe.m
function retur = ny_flyplasskoe(koe)
    flat_koe = koe(:);
    [~, sortert_paa_tid] = sort(flat_koe);
    [m, n] = size(koe);
    pers_med_best_tid = sortert_paa_tid(m+1:end);
    pers_mgtir = sort(pers_med_best_tid);
    ny_flat_koe = flat_koe(pers_mgtir);
    retur = reshape(ny_flat_koe, m, n-1);
end 


  • No labels