10.1.1 - Marias Mad

IMG 9476IMG 9500IMG 9665IMG 9742


Min lille datter, Maria, kom til verden for snart 3 måneder siden. Hun var lille ved fødslen, og tager kun lige akkurat nok på. Vi overvåger derfor hendes madindtag nøje (hun er flaskebarn) og har derfor data på hvornår, og hvor meget mælk hun indtager. Disse data kan eksporteres i csv format, herunder er data fra den sidste uge:

MariasMad.csv

Disse data skal nu bearbejdes i Matlab. I første omgang er opgaven blot at hente data ind. Dernæst skal middelværdien af hendes madindtag pr. flaske udregnes og endelig hvor mange flasker hun drikker om dagen.

Instruktioner:

  • Åbn filen i en teksteditor for at se opbygningen. Du kan også åbne den i Matlabs editor. Noter hvor mange felter der er, hvor mange linier overskriften der beskriver data fylder, hvilket tegn som adskiller data (delimiter) og hvilke kolonner som indeholder start tid og mængde (Quantity) - det er kun disse to kolonner, som skal importeres.
  • Lav et script til at hente og analysere data. Brug "cell mode" til at adskille de enkelte funktioner
  • Brug funktionen textscan til indlæsningen.
    • Denne funktion kræver et file id, som dannes med funktionen fid = fopen...
      • Brug help fopen, hvis du ikke kan huske syntaksen
    • Når du har brugt en fopen, skal du altid huske at bruge fclose(fid). Indsæt den med det samme
    • Imellem de to indsættes textscan funktionen
  • I denne implementation, skal textscan funktionen bruges således:
    • data = textscan(fid,format,'delimiter','???','headerlines',???)
      • Erstat spørgsmålstegnene med de fundne data fra gennemsynet af tekstfilen.
      • Formatet er der, hvor det specificeres, hvilke data man vil importere, hvad variabeltypen er, og hvilke felter, som skal springes over.
      • Formatet kunne fx se sådan ud (men det er ikke det, der skal bruges her):
        '%f %s %*s %s %*f'
        • Importer feltet start time som tekst (%s) og feltet quantity som decimal tal (%f).
        • Resten skal springes over, hvilket gøres således: %*s
    • Kør cellen med Ctrl+Enter og tjek formatet af data - om alt er gået vel, skulle du have en variabel med 1x2 celler
  • Nu er det forholdsvis let at tilføje endnu en celle i scriptet (%%) og udregne middelmængden pr flaske med mean funktionen
    • Husk at bruge krølle-paranteser for at se indholdet af anden celle i data variablen, som indeholder mængderne
    • Udskriv denne mængde til Command Windowet med disp kommandoen. Kombiner denne med sprintf for at formatere tallet med 3 tal før komma og 2 decimaler. 
      • Brug help/doc til hver kommando, hvis du ikke kan huske syntaksen.
  • Endelig skal antallet af flasker pr. dag beregnes:
    • Lav en ny celle i scriptet (%%)
    • Dobbeltklik på Data variablen og dobbeltklik igen på først celle heri. Iaggtag, at alt indholdet i variablen har præcis samme længde. Derfor kan det lige så vel ligge i en matrix, som i en celle-struktur
    • Lav en ny variabel (t), som indeholder første Data celle, konverteres til en matrix
      • t=cell2mat(Data{1});
    • t er nu en matrice på 60x16 karakterer. Dagene ligger i denne variabel og kan tilgåes med den rette indeksering:
      • Lav en ny variabel; dag, som indeholder dagene fra t variablen
      • Slå selv op i variablen for at se på hvilke pladser de interessante data ligger
      • Indkapsl indekseringen i en str2double funktion, for at konvertere teksten til tal:
        • dag = str2num(t(???,???:???));
        • Erstat spørgsmålstegnene herover med de rette indekseringer
        • Husk, vi skal have alle rækker, og de 2 tal i datoen, som udgør dagene
    • Du skulle nu have en dag variabel, som indeholder datoerne (30, 29, 28 etc.)
    • Ved at danne endnu en ny variabel, som kun indeholder de unikke datoer (der er mange dubletter i dag variablen), kan vi bruge denne i en find funktion kombineret med length til at finde den ønskede værdi. Af hastighedshensyn initialiseres flasker variablen til nul før for loopet.
      • udag = unique(dag);
      • flasker = zeros(size(udag));
      • for i=1:length(udag)
        • flasker(i) = length(find(dag==udag(i)));
      • end
    • Lav et bar plot i en ny celle (%%) over flasker med passende titler.
  • Gem dit script som MariasMad.m
Created by Samuel Thrysøe © 2012