Tietojen tallennus ja luku
Tehtävissä on käytetty esimerkkejä osoitteesta:
http://exploringdata.cqu.edu.au/datasets.htm
Matlabin muuttujien tallennus: save ja load
Käytössä olevat muuttujat tallennetaan komennolla
>>save
Komento tallentaa muuttujat työhakemistoon tiedostoon matlab.mat. Huomaa, että koulun verkkolevyille ei pysty tallentamaan omaa public-hakemistoa lukuun ottamatta.
Muista vaihtaa työhakemisto !
>>save foo
Tallentaa tiedostoon foo.mat.
Tiedostomuoto on Matlabin oma binääritiedostomuoto, jota ei pysty tutkimaan kovin helposti muilla ohjelmilla. Muuttuja voidaan tallentaa myös tekstimuodossa lisäämällä optio -ascii
Muuttujat luetaan tiedostosta komennolla
>>load
tai
>>load foo
Kaikki Matlab-session aikana annetut komennot ja ohjelman tulostukset saa talteen komennolla
>>diary on
joka tallentaa työhakemistoon diary-nimiseen tiedostoon. Diaryn saa pois päältä komennolla
>>diary off
Tehtävä: Luo satunnaislukuja sisältävä 4x4-matriisi ja oman nimesi sisältävä
merkkijono. Tallenna muuttujat tiedostoon binäärimuodossa. Tyhjennä kaikki käytössä olevat muuttujat ja lataa ne takaisin tiedostosta.
Datan luku tekstitiedostosta
Interaktiivinen työkalu: Import Wizard
Matlabin uusimmissa versioissa on graafinen työkalu Import Wizard:
>>uiimport
Painetaan Browse… nappia ja haetaan spring.txt niminen tiedosto, jossa määritetty jousen jousivakio mittaamalla jousen venymää eri suuruisilla voimilla:
Toisin sanoen velho on niin fiksu, että se osaa tulkita tiedoston sisällön. Ensimmäinen rivi tulkitaan otsikkoriviksi.
Lopuksi velho kysyy, missä muodossa data tallennetaan. Ensimmäinen vaihtoehto tallentaa otsikkorivin merkkijonoksi ja datan 2x10 kokoiseksi matriisiksi:
Toinen vaihtoehto tekee kaksi 1x10 kokoista vektoria ja niiden nimet otetaan otsikkoriviltä:
Tehtävä: Lataa kurssin sivulta löytyvä tiedosto spring.txt. Piirrä mittaustuloksista kuvaaja, jossa vaaka-akselilla on jousen venymä (metreinä) ja pystyakselilla voima (newtoneina). Lisää akselien ja kuvaajan otsikko. Mittaustulokset esitetään pisteellä (.).
Sovita mittaustuloksiin suoran yhtälö (Ylävalikosta Tools -> Basic fitting). Näytä suoran yhtälö kuvaajassa. Piirrä lisäksi toinen kuvaaja edellisen alle samaan kuvaikkunaan, joka näyttää mitatun arvon ja suoralta lasketun arvon erotuksen (”residuals”). Mikä on tämän mittauksen perusteella jousen jousivakio ? Huom: Jousivakion yksikkö on N/m.
Komentorivikäyttö: load
Interaktiivista työkalua ei voi kaikissa tilanteissa käyttää. Se kun tarvitsee käyttäjältä syötteitä. Jos halutaan rakentaa Matlab-ohjelma, joka hoitelee homma automaattisesti, on käytettävä sellaisia työkaluja, joilla ohjelmoija antaa tiedon datan formaatista etukäteen.
Matlab osaa lukea load-komennolla matriisimuotoista dataa tiedostosta. Datassa ei saa olla ylimääräisiä tekstejä. Tyypillinen käyttökohde on jonkin mittauslaitteen tai tilasto- ohjelman tuottaman datan lukeminen tiedostosta jatkokäsittelyä varten. Tiedostosta täytyy ensin poistaa kaikki ylimääräiset tekstit (tähän on olemassa muitakin vaihtoehtoja, mutta siitä myöhemmin.
Esimerkki: Oletetaan, että Matlabin työhakemistossa on tiedosto carb_dio.txt.Ladataan se Matlabiin ja piirretään kuvaaja.
>>data=load('carb_dio.txt');
>>plot(data(:,1),data(:,2),'.');
>>title('Hiilidioksin määrä ilmakehässä')
>> xlabel('Vuosi');
>> ylabel('CO2 (ppm)')
Datan käsittelyn helpottamiseksi kopioidaan datamatriisin sarakkeet erillisiin vektoreihin, joilla on havainnollisemmat nimet:
>>vuosi=data(:,1);
>>co2=data(:,2);
Lasketaan, montako mittaustulosta on ennen 1800-luka ja mikä on CO2-pitoisuuden keskiarvo tänä aikana:
>> sum(vuosi<1800) ans =
2
>> mean(vuosi(vuosi<1800)) ans =
1.7775e+003
Tehtävä: Lataa kurssin kotisivulta edellä esitetty data ja tallenna se Matlabin
työhakemistoon (oltava kirjoitusoikeudet !). Kopioi data kahteen erilliseen vektoriin vuosi ja co2. Piirrä edellä esitetty kuvaaja.
Tehtävä: Kuinka paljon pitoisuus on noussut 1700 luvun alusta 2000-luvun lopulle prosenteissa ?
Tehtävä: Laske havaintojen lukumäärät ja keskimääräiset hiilidioksidipitoisuudet 50 vuoden aikavälein lähtien vuodesta 1800.
Tehtävä: Milloin CO2-pitoisuus on laskenut eniten kahden peräkkäisen mittauksen välillä ? Kuinka paljon tämä lasku oli ?
Tehtävä: Mikä on suurin CO2-pitoisuuden nousu prosenteissa kahden peräkkäisen mittauksen välillä ?
Tehtävä: Tallenna muuttujat vuosi ja co2 erillisiin tiedostoihin tekstimuodossa. Tarkista tallennuksen onnistuminen tutkimalla tiedostojen sisältöä jollain tekstieditorilla (Notepad
☺).
Laiteläheinen tiedostonkäsittely
Matlab tiedostonkäsittely perustuu ANSI C:n tiedostonkäsittelyfunktioihin.
Tiedostonkäsittelyssä on kolme vaihetta:
1. Tiedoston avaus: fopen.
2. Tiedostoon operointi:
a. Luetaan binääridataa: fread.
b. Kirjoitetaan binääridataa: fwrite.
c. Luetaan merkkijono rivi kerrallaan: fgets tai fgetl d. Luetaan formatoitua ASCII-dataa: fscanf
e. Kirjoitetaan formatoitua ACII-dataa: fprintf 3. Suljetaan tiedosto: fclose
Avaus ja sulkeminen: fopen ja fclose
Tiedoston avauskomennon syntaksi:fid = fopen('filename','permission')
The permission string specifies the kind of access to the file you require. Possible permission strings include
r for reading only w for writing only a for appending only
r+ for both reading and writing
Jos avaus onnistuu, fopen palauttaa tiedostotunnisteen (File Identifier, fid), joka on ei- negatiivinen kokonaisluku.
Tiedosto-operaatioiden jälkeen tiedosto suljetaan käyttämällä tiedostotunnistetta komennon argumenttina:
status = fclose(fid);
Kaikki avoinna olevat tiedostot voidaan sulkea yhdellä kertaa komennolla status = fclose(‘all’);
Paluuarvo status = 0, jos sulkeminen onnistui, muuten -1.
Formatoitu binääritiedostoon kirjoitus ja luku: fread ja fwrite
fwrite-komennon syntaksi:
count=fwrite(fid,A,precision)
Kirjoitetaan tiedostotunnisteeseen fid muuttuja A käyttäen tietotyyppiä precision.
Paluuarvo count on kirjoitettujen tietojen lukumäärä.
Esimerkki: Kirjoitetaan magic-komennon tuottama 5x5-matriisi tiedostoon 32-bittisinä kokonaislukuina.
>>count = fwrite(fid,magic(5),'int32');
>>status = fclose(fid);
fread-komennon syntaksi:
A=fread(fid,size,precision);
Luetaan tiedostotunnisteesta fid size kappaletta dataa, jonka tietotyyppi on precision. Tulos tallentuu muuttujaan A.
Esimerkki: Luetaan edellä kirjoitettu data 5x5-matriisiksi A ja 1x25-vektoriksi B.
>> fid=fopen('testi.dat','r') fid =
3
>> A=fread(fid,[5 5],'uint32') A =
17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9
>> frewind(fid)
>> B=fread(fid,25,'uint32') B =
17 23 4 10 11 24 5 6 12 18 1 7 13 19 25 8 14 20 21 2 15 16 22 3 9
>> fclose(fid) ans =
0
Ensimmäisen freadin jälkeen tiedosto-osoitin (file pointer) on tiedoston lopussa. Se voidaan siirtää takaisin tiedoston alkuun komennolla frewind.
Muita tiedosto-osoittimen käsittelyyn käytettäviä funktioita:
• status = fseek(fid,offset,origin)
repositions the file position indicator in the file with the given fid to the byte with the specified offset relative to origin.
o fid An integer file identifier obtained from fopen offset A value that is interpreted as follows,
offset > 0 Move position indicator offset bytes toward the end of the file.
offset = 0 Do not change position.
offset < 0 Move position indicator offset bytes toward the beginning of the file.o o origin A string whose legal values are
'bof'-1: Beginning of file 'cof' 0: Current position in file 'eof' 1: End of file
o status A returned value that is 0 if the fseek operation is successful and -1 if it fails. If an error occurs, use the function ferror to get more information.
• position = ftell(fid)
o returns the location of the file position indicator for the file specified by fid, an integer file identifier obtained from fopen. The position is a nonnegative integer specified in bytes from the beginning of the file. A returned value of -1 for position indicates that the query was unsuccessful;
use ferror to determine the nature of the error
Formatoitu tekstitiedostoon tallennus ja luku: fprintf ja fscanf
count = fprintf(fid,format,A,...)Kirjoittaa tiedostotunnisteeseen fid muotoilumääreen format ilmaisemassa muodossa matriisin A sisällön, paluuarvo count ilmaisee kirjoitettujen tavujen lukumäärän.
Muotoilumääreet ovat samat kuin C-kielessä. Katso komennon help-tiedostosta tarkemmin.
Esimerkki: Kirjoitetaan eksponenttifunktion arvoja tiedostoon.
>> x = [0:.1:1];
>>y = [x; exp(x)];
>>fid = fopen('exp.txt','w');
>>fprintf(fid,'%6.2f %12.8f\n',y);
>>fclose(fid)
A = fscanf(fid,format)
[A,count] = fscanf(fid,format,size)
Lukee tiedostotunnisteesta fid muotoilumääreen format ilmaiseman määrän muuttujia matriisiin A. Jälkimmäinen versio lukee size-parametrin ilmaiseman määrän dataa.
n Read n elements into a column vector
inf Read to the end of the file, resulting in a column vector containing the same number of elements as are in the file.
[m,n] Read enough elements to fill an m-by-n matrix, filling the matrix in column order. n can be specified as inf, but m cannot.
Esimerkki: Luetaan edellisen esimerkin data.
>>fid = fopen('exp.txt');
>>a = fscanf(fid,'%g %g',[2 inf])
>>fclose(fid)
Tehtävä: Sovellusohjelmat-kurssin kokeessa opiskelijat saivat pisteitä seuraavasti:
Ankka Aku 7
Ankka Roope 14 Hiiri Mikki 18 Hopo Hessu 3
Kirjoita tulokset tekstitiedostoon tulokset.txt fprintf-funktiota käyttäen.
Tarkista tulos Notepadilla.
Tekstitiedostosta luku rivi kerrallaan: fgetl ja fgets
fgetl Read line from file, discard newline character.
tline=fgetl(FID) returns the next line of a file associated with file fgetl lukee tiedostotunnisteesta FID tekstiä rivi kerrallaan ja tallentaa tuloksen
Matlabin merkkijonoksi. Rivinvaihtomerkkiä EI LUETA. Jos se tarvitaan, on käytettävä fgets-funktiota.
Esimerkki: Työhakemistoon on tiedosto blackbird.txt. Luetaan sitä rivi kerrallaan.
>> fid=fopen('blackbird.txt','r') fid =
3
>> fgetl(fid) ans =
Blackbird singing in the dead of night
>> fgetl(fid) ans =
Take these broken wings and learn to fly
>> fgetl(fid) ans =
All your life
>> fclose(fid) ans =
0
Tiedoston luku tapauksessa, jossa se sisältää sekä tekstiä että numeerista tietoa sekaisin: textscan ja textread
textscan-funktio
Monesti tekstitiedostossa oleva data sisältää sekä tekstiä että lukuja. Tavallinen tilanne on, että meillä on tiedoston alussa otsikko eli header, jossa on määritelty, mitä jäljempänä olevat luvut ovat.
Esimerkki: Tiedosto grades.dat sisältää formatoitua numeerista tietoa (liukulukuja) sekä yksirivisen otsikkotekstin:
Grade1 Grade2 Grade3 78.8 55.9 45.9 99.5 66.8 78.0 89.5 77.0 56.7
Tämä voidaan lukea yhdellä kertaa seuraavasti:
>>fid = fopen('grades.dat', 'r');
>>grades = textscan(fid, '%f %f %f', 3, 'headerlines', 1);
>>grades{:}
ans = 78.8000 99.5000 89.5000 ans = 55.9000 66.8000 77.0000 ans = 45.9000 78.0000 56.7000
>>fclose(fid);
Toiminta: Luetaan tiedostotunnisteesta fid kolme liukulukua per rivi ('%f %f %f').
Rivejä on 3 kappaletta. Luvut tallentuvat muuttujaan grades. Alusta jätetään huomiotta 1 otsikkorivi. Tarkempi kuvaus syntaksista löytyy komennon helpistä.
Jos rivien lukumäärää ei tiedetä ja halutaan lukea kaikki mitä löytyy, on komennon syntaksi:
>>grades = textscan(fid, '%f %f %f', -1, 'headerlines', 1);
Textscan tallentaa lukemansa datan cell array-tyyppiseen muuttujaan. Jos
tiedostossa on rivillä useaa erityyppistä tietoa, ne olisi luontevampaa tallentaa jokainen sarakkeittain omiksi muuttujikseen. Tähän voidaan käyttää textread-funktiota.
Solun sisältämät tiedot voidaan sijoittaa tavalliseen vektoriin valitsemalla yksi cell array-sarake:
>>grades{:,1}
ans = 78.8000 99.5000 89.5000
>> grades{:,2}
ans = 55.9000 66.8000 77.0000
Eli sarakkeeseen viitatessa käytetään tavallisten sulkujen sijasta aaltosulkuja.
Tehtävä: Lue tekemäsi tulokset.txt-tiedoston sisältö käyttäen textscan- funktiota. Laske arvosanojen keskiarvo.
Tehtävä: Henry Cavendish mittasi maapallon keskimääräisen tiheyden vuonna 1798 torsioheilurin avulla. Kurssin sivulta löytyvässä tiedostossa density_tab.txt on listattu Cavendishin mittaustulokset (29 kpl) yksiköissä g/cm3. Piirrä mittaustuloksista histogrammi. Mille tiheysvälille sijoittuu suurin osa mittaustuloksista ja kuinka monta arvoa kyseiselle välille osuu ?
Tehtävä: Mikä on mittaustulosten perusteella maapallon keskitiheys virherajoineen ? Tulos on muotoa:
2 ρ = x±σ
textread-funktio
Tämä funktio on poistumassa käytöstä, joten sen sijasta suositellaan käytettäväksi textscan:ia.
Esimerkki: Tiedostossa mydata.dat on kullakin rivillä sekä tekstiä että liuku- ja kokonaislukuja:
Sally Type1 12.34 45 Yes Larry Type2 34.56 54 Yes Tommy Type1 67.89 23 No
>>[names, types, x, y, answer]=textread('mydata.dat', '%s %s %f
%d %s',3) names = 'Sally' 'Larry' 'Tommy' types = 'Type1' 'Type2' 'Type1' x =
12.3400 34.5600 67.8900 y =
45 54 23 answer = 'Yes' 'Yes' 'No'
Hakasuluissa määritellään, minkä nimisiin muuttujiin tallennetaan. Muuttuja names sisältää heppujen nimet jne. Hipsuissa määritellään C-kielestä tutuilla
formatointikoodeilla luettavien muuttujien tietotyypit. Viimeinen luku kertoo, montako riviä luetaan. Jälleen -1 tässä kohtaa lukee kaikki.
Kuvat, audio, video, xml ja xls
Lopuksi lyhyt kooste muista tarpeellisista tiedostoformaateista, joista voi olla hyötyä tulevaisuudessa. Tässä niitä ei käsitellä sen tarkemmin ajan puutteen takia.
imread, imwrite Kuvien luku ja kirjoitus
aufinfo, aviinfo wavinfo Tietoa .au, .avi ja .wav-tarkenteisista tiedostoista mmfileinfo Tietoa multimediaformaateista
auread, wavread Äänitiedostojen luku aviread, mmreader Videotiedostojen luku auwrite, aviwrite Äänitiedostoihin kirjoitus
xlsinfo, xlswrite, xlsread Excel-tiedostojen käsittely xmlwrite, xmlread XML-tiedostojen käsittely
Tehtävä: Lataa Matlabin hakemistopolusta löytyvä kuva cameraman.tif ja tutki, minkä kokoinen se on. Miten kuvatieto on tallennettu ?
Tehtävä: Tallenna tulokset.txt-tiedosto tulokset.xls-tiedostoksi. Tutki Excelillä, onnistuiko tiedoston tallennus.