• Ei tuloksia

Tietojen tallennus ja luku

N/A
N/A
Info
Lataa
Protected

Academic year: 2022

Jaa "Tietojen tallennus ja luku"

Copied!
14
0
0

Kokoteksti

(1)

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

(2)

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:

(3)

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:

(4)

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.

(5)

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:

(6)

>> 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

(7)

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);

(8)

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

(9)

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.

(10)

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

(11)

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);

(12)

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±σ

(13)

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.

(14)

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.

Viittaukset

LIITTYVÄT TIEDOSTOT

It uses the narrative mode of free indirect discourse (=FID), which carries traces of the discourse both of the character and the third person narrator as it depicts a

Myös tässä mielessä on olennaista nähdä informaation uusi maailma osana pitkää älyllisen kehityksen traditiota.. 100-vuotisjuhlavuoteen valmistautuva FID

meksikolainen Jesus Lau, jonka aiheena oli eteläisen pallon- puoliskon tiedon niukkuusloukku (scarce- knowledge trap of the Southern Hemisphere). Hän olisi puhunut, jos olisi

When the LC-MS method was compared with GC- FID and GC-MS methods in quantification of secondary oxidation products of plant sterols in complicated mixtures, all methods gave a

3 B Chromatograms (GC-FID) of mineral oil content of lube oil, diesel oil and gasoline contaminated soil compost matrices (time 0)... 4 Chromatograms (GC-FID) of mineral oil content

Assume the input (V) with the following equation. You should include all the used parameters in the Simulink model in a separate file. After executing this file, all

• FTP (File Transfer Protocol): one of the 1 st and still widely used file transfer application. – Specified in

Whenever you have a file containing data you wish to import, try dragging and dropping the file onto the command window. If the file is recognised by MATLAB as importable, an