MATLAB OPAS Matti Pastell matti.pastell@helsinki.fi Maataloustieteiden laitos, Helsingin Yliopisto 11. tammikuuta 2010 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 5 0 5 10 15 20 25 http://papers.mpastell.com/matlab_opas.pdf
SISÄLTÖ 2 Sisältö 1 Johdanto 4 2 Ohjelman hankinta ja käytön aloitus 5 3 Muuttujat ja peruslaskutoimitukset 5 3.1 Muuttujien määrittely ja peruslaskutoimitukset.......... 5 4 Vektorit ja Matriisit 6 4.1 Vektorilaskutoimituksia....................... 6 4.2 Matriisien käsittelyä......................... 7 5 Datan peruskäsittely ja kuvaajat 7 5.1 Esimerkkiohjelma 2d kuvaaja ja sen tallennus............ 9 5.2 Esimerkkiohjelma 3d kuvaaja ja sen tallennus........... 10 5.3 Julkaisukelpoiset kuvat....................... 10 6 Tiedostojen käsittely ja hakemistot 11 7 Omat ohjelmat 12 7.1 Skriptit............................... 12 7.2 Funktiot............................... 13 8 Perusohjelmointi 14 8.1 Silmukka eli loop.......................... 14 8.2 Ehtolauseet: if, else ja elseif.................... 15 9 Tehtävien automatisointi eli Batch-mode 16 10 Sekalaisia vinkkejä 17 10.1 Hyödyllisiä komentoja....................... 17 10.2 Piikkien etsintä datasta....................... 18 10.3 Tekstitiedostojen muunto *.mat formaattiin............ 19 10.4 Matlabin dialogit.......................... 20 11 Signaalin käsittely 20 11.1 FFT - taajuuden etsintä signaalista................. 20 12 Neuroverkot 21 12.1 Probabilistic Neural Network.................... 21 13 Sumea Logiikka 23
SISÄLTÖ 3 Viitteet 25
1 Johdanto 4 1 Johdanto Tämän oppaan tarkoitus on opettaa MATLABin 1 peruskäyttö ja hyödyllisiä komentoja. Mukana on myös muutama hieman edistyneempi esimerkki. MATLAB on kaupallinen ohjelma ja sen hankintahinta on melko suuri, tosin opiskelijaversio on huomattavasti halvempi, n. 70 e. Helsingin yliopistolla on ohjelmistoon laaja lisenssi, joka ei kuitenkaan kata ohjelman asennusta opiskelijoiden omille koneille. Kotoa ohjelmaa pääsee käyttämään ottamalla yhteyden yliopiston ruuvi.helsinki.fi (edellyttää Unix lupaa). Pyrin täydentämään opusta tarpeen mukaan ja viimeisimmän version löytää kotisivuiltani. Suositan aloittelijalle komentojen testaamista samalla, kun luet opasta. Parannusehdotukset ja virheilmoitukset voi lähettää sähköpostitse matti.pastell@helsinki.fi. Opas on kirjoitettu L A TEX- kuvauskielellä. Usein kysytään eikö olisi helpompaa käyttää Exceliä, SPSS tms. Komentorivipohjaiset ohjelmat saattavat tuntua aluksi vaikeilta käyttää, mutta niiden ominaisuudet ovat ylivoimaisia esim. suurten datamäärien käsittelyssä, omien funktioiden kirjoittamisessa ja simuloinnissa. Jatkuvissa mittauksissa syntyy tarve automatisoida datan käsittely. Useita satoja tai tuhansia tiedostoja analysoivan ohjelman teko on Matlabissa verraten helppoa ja säästää valtavasti aikaa. Lisäksi hieman nopeammissa mittauksissa syntyy niin paljon dataa, että sen käsittely Excelissä on käytännössä mahdotonta. Esim. 50 Hz mittaustaajuudella vuorokauden mittauksessa kertyy n. 4,2 miljoonaa datapistettä eli n. 63 Excelin täyttä saraketta. Matlabissa on graafisia työkaluja mm. tiedostojen avaamiseen ja kuvaajien piirtämiseen. Lisäksi ohjelmaan on saatavissa suuri määrä erilaisia "toolboxeja" esim. käyrän sovitusta, tilastoanalyyseja, mittauksia ja neuroverkkomalleja varten. Helsingin yliopistolla on kattava Matlab lisenssi (eli sisältää myös runsaasti toolboxeja), joka kattaa ohjelman käytön laitosten koneissa. Lisäksi Matlabiin kuuluu graafinen mallin rakennusympäristö Simulink, jota ei käsitellä tässä oppaassa mutta verkosta löytyy runsaasti ohjeita myös Simulinkille. Koodi on tekstissä värillistä ja kommentit on merkitty % merkillä 1 MATLAB http://www.mathworks.com
2 Ohjelman hankinta ja käytön aloitus 5 2 Ohjelman hankinta ja käytön aloitus Kuten edellä on mainittu niin Matlab on kaupallinen ohjelma. Tietoa Matlabin hankinnasta löytyy osoitteesta www.mathworks.com. Helsingin yliopiston lisenssi ei valitettavasti sisällä opiskelijoiden kotikäyttöä, mutta kotona Matlabia voi käyttää verkon välityksellä ottamalla ssh-yhteyden yliopiston Unix palvelimelle ruuvi.helsinki.fi, unix tunnukset saat laitoksen ATK-yhdyshenkilöltä. Asennettuasi ohjelman se löytyy Windowsin käynnistä valikosta: Matlab kansiosta ja unixissa/linuxissa kirjoittamalla komentoriville matlab. 3 Muuttujat ja peruslaskutoimitukset 3.1 Muuttujien määrittely ja peruslaskutoimitukset Peruslaskutoimitusten teko on helppoa. Muuttujia ei tarvitse erikseen määritellä vaan määrittely tapahtuu automaattisesti, kun muuttujalle annetaan arvo. Eli yksinkertaisesti kirjoitetaan komentoriville(ikkunaan): %Muuttuja a s a a arvon 1 a =1 %Muuttuja b s a a arvon 2 b=2 Tämän jälkeen voidaan suorittaa peruslaskutoimitus määritellyillä muuttujilla. Huomaa, että muuttujien kirjankoolla on väliä eli a A. c=a+b c=a b c=a *b c=a / b Huomaat, että ohjelma tulostaa vastauksesi ruudulle. Yksittäisissä laskutoimituksissa tämä ei haittaa, mutta suurilla datamäärillä tulosta ei haluta aina nähdä. Laskutoimituksen tulos saadaan piilotettua lisäämällä ; komennon perään. Tulos saadaan jälleen ruudulle kirjoittamalla muuttujan nimi. Kaikki määrittelemäsi muuttujat tallentuvat ohjelmien työtilaan Matlabissa se on näkyvissä ohjelman käyttöliittymässä. Saat listattua muuttujat työtilaan komennolla who ja työtilan saa tyhjennettyä komennolla clear. %N ä y t t ä ä k a i k k i t y ö t i l a s s a o l e v a t t i e d o s t o t
4 Vektorit ja Matriisit 6 who %T y h j e n t ä ä k a i k k i m u i s t i s s a o l e v a t m u u t t u j a t c l e a r %T y h j e n t ä ä ruudun c l c 4 Vektorit ja Matriisit Ohjelmat käsittelevät dataa matriisimuodossa tai vektorimuodossa. Muuttuja, jossa on vain yksi rivi tai sarake on vektori ja muuttuja, jossa on monta saraketta ja riviä on matriisi (array). Myös matriisimuotoisilla muuttujilla voidaan suorittaa skalaarilaskutoimituksia ja tässä oppaassa keskitytäänkin lähinnä niihin. Seuraavassa muutamia esimerkkejä laskemisesta vektoreilla ja matriiseilla. 4.1 Vektorilaskutoimituksia %Luodaan v e k t o r i, j o k a s a a a r v o t 1 5} v e k t o r i =1:5 v e k t o r i =[1 2 3 4 5] %Yhteen j a v ä h e n n y s l a s k u v e k t o r i + v e k t o r i v e k t o r i v e k t o r i v e k t o r i +5 v e k t o r i 5 %K e r r o t a a n koko v e k t o r i 2 : l l a t u p l a = v e k t o r i *2 %S k a l a a r i t u l o. HUOMAA p i s t e " v e k t o r i " : n j ä l k e e n k e r t o o % o h j e l m a l l e e t t ä k y s e e s s ä on s k a l a a r i l a s k u t o i m i t u s v e k t o r i. * t u p l a %V e k t o r i t u l o v e k t o r i * t u p l a %J a k o l a s k u v e k t o r i. / t u p l a %K o r o t e t a a n t o i s e e n v e k t o r i. ^2 luku =" v e k t o r i n " n e l j ä s numero luku = v e k t o r i ( 4 ) %V e k t o r i " l u v u t " = " v e k t o r i n " 3 : s 5: s numero l u v u t = v e k t o r i ( 3 : 5 )
4.2 Matriisien käsittelyä 7 4.2 Matriisien käsittelyä Matlabin vahvuus datan käsittelyssä on datan käsittely matriisimuodossa, joka tekee suurenkin datamäärän käsittelyn joustavaksi. Yleensä perusmittausdatan käsittelyssä ei tarvita osaamista matriisilaskennassa, vaan halutaan esimerkiksi, kertoa ja jakaa koko datamäärä esim. kalibrointikertoimellatms. tämä käy komentoriviltä hyvin helposti. Usein laskutoimituksia halutaan suorittaa myös riveittäin eli esim. laskea jokaisen rivin summa, keskiarvo, hajonta... Tämä esitellään seuraavassa kappaleessa. %Luodaan 3x2 m a t r i i s i m a t r i i s i =[3 2 ; 4 1 ; 6 3] %K e r r o t a a n k a i k k i m a t r i i s i n a r v o t 2 : h d e l l a t u p l a = m a t r i i s i * 2 ; %S k a l a a r i t u l o t u p l a. * m a t r i i s i % T r a n s p o n o i d a a n m a t r i i s i t r a n s m a t r i i s i = m a t r i i s i ' %M a t r i i s i t u l o m a t r i i s i * t r a n s m a t r i i s i m a t r i i s i * m a t r i i s i ' Jne. Käyttäytyvät samoin kuin vektorit. %V a l i t a a n m a t r i i s i n ensimmäinen r i v i ( 1 ) j a k a i k k i % s a r a k k e e t r i v i = m a t r i i s i ( 1, : ) %V a l i t a a n m a t r i i s i n kolmas ( 3 ) s a r a k e j a k a i k k i r i v i t ( : ) s a r a k e = m a t r i i s i ( :, 3 ) %V a l i t a a n m a t r i i s i n r i v i t 1 2 ( 1 : 2 ) j a s a r a k k e e t 2 3 % ( 2 : 3 ) o s a m a t r i i s i = m a t r i i s i ( 1 : 2, 2 : 3 ) %M a t r i i s i n koko s i z e ( m a t r i i s i ) 5 Datan peruskäsittely ja kuvaajat Tässä kappaleessa tutustutaan data peruskäsittelyyn. Aloitetaan luomalla data satunnaisluvuista ja laskemalla sen keskiarvo mean ja keskihajonta std. Ohjelma palauttaa ruudulle datan jokaisen sarakkeen keskiarvon ja keskihajonnan.
5 Datan peruskäsittely ja kuvaajat 8 %Luodaan d a t a (10 x5 m a t r i i s i ) s a t u n n a i s l u v u i s t a v ä l i l l ä %0 1 j a k e r r o t a a n se 1 0 : l l ä d a t a = rand ( 1 0, 5 ) ; %K e s k i a r v o mean ( d a t a ) %K e s k i h a j o n t a s t d ( d a t a ) %T a l l e n t a a k e s k i a r v o n m u u t t u j a a n ` ` k e s k i a r v o ` ` k e s k i a r v o =mean ( d a t a ) ; Usein datasta halutaan myös kuvaaja. Ohjelmassa on mahdollisuus piirtää useita erilaisia kuvaajia, alla muutamia yksinkertaisia esimerkkejä. %V i i v a k u v a a j a p l o t ( x, y ) %V i i v a k u v a a j a, v i i v a n l e v e y s, t y y p p i k a t k o v i i v a j a v ä r i %punainen k s. s e u r a a v a e s i m e r k k i p l o t ( x, y, ' r ', ' l i n e w i d t h ', 2 ) ; %P ylväsdiagr a mmi b a r ( d a t a ) %P i i r r e t ä ä n h i s t o g r a m m i e l i jakauma h i s t ( d a t a ) %P i i r a k k a d i a g r a m m i p i e ( d a t a ) Kuvien muokkaaminen onnistuu Matlabissa suoraan kuvaajan ikkunasta "plot tools":n avulla, mutta selitteiden lisääminen on usein kätevämpää komentoriviltä. Muutamia peruskomentoja: x l a b e l ( ' x a k s e l i ' ) y l a b e l ( ' y a k s e l i ' ) t i t l e ( ' k u v a a j a n o t s i k k o ' ) a x i s ( [ x p i e n i n x s u u r i n y p i e n i n y s u u r i n ] ) Kuvan tallentaminen tiedostoon onnistuu käskyllä print, tiedostomuoto määritellään syntaksilla -dmuoto. Kuvan voi tallentaa myös valikosta file->save as tai file->export setup. Esimerkkejä komentorivi: %png p r i n t dpng kuva.png %v ä r i l l i n e n p o s t s c r i p t p r i n t dpsc k u v a. p s %pdf
5.1 Esimerkkiohjelma 2d kuvaaja ja sen tallennus. 9 p r i n t dpdf k u v a. p d f %e n c a p s u l a t e d p o s t s c r i p t p r i n t dpepsc k u v a. e p s 5.1 Esimerkkiohjelma 2d kuvaaja ja sen tallennus. %S i n i k ä y r ä n p i i r t o j a t a l l e n n u s png t i e d o s t o o n a =0:0. 0 5 : 2 * p i ; p l o t ( s i n ( a ), ' r ', ' l i n e w i d t h ', 2 ) ; l e g e n d ( ' s i n ( a ) ' ) %Merkinnät j a a k s e l i e n r a j a t x l a b e l ( ' x a k s e l i ' ) ; y l a b e l ( ' y a k s e l i ' ) a x i s ( [ 0 6. 3 1. 2 1. 2 ] ) %T a l l e n n u s png f o r m a a t i s s a p r i n t dpng s i n i. p n g 1 sin(a) 0.5 y akseli 0 0.5 1 0 1 2 3 4 5 6 x akseli
5.2 Esimerkkiohjelma 3d kuvaaja ja sen tallennus 10 5.2 Esimerkkiohjelma 3d kuvaaja ja sen tallennus %Luodaan m a t r i i s i t x j a y meshgrid f u n k t i o l l a [ x, y ]= meshgrid ( [ 1 2 : 1 / 2 : 1 2 ] ) ; %L a s k e t a a n z k o o r d i n a a t t i e r i f u n k t i o n a r v o i l l a z= s i n ( s q r t ( x. *x+ y. *y ) ). / s q r t ( x. *x+ y. *y ) ; %P i i r r e t ä ä n k u v a a j a mesh ( x, y, z ) ; %Merkinnät k u v a a j a a n t i t l e ( ' Mesh ' ) x l a b e l ( ' x a k s e l i ' ) y l a b e l ( ' y a k s e l i ' ) z l a b e l ( ' z a k s e l i ' ) %T a l l e n n e t a a n k u v a 3 d. e p s t i e d o s t o o n p r i n t depsc k u v a 3 d. e p s 1 0.8 0.6 z akseli 0.4 0.2 0 0.2 0.4 15 10 5 0 y akseli 5 10 15 15 5.3 Julkaisukelpoiset kuvat 10 5 0 x akseli Julkaisukelpoisten kuvien tuottaminen Matlabilla on helppoa. Kuvia pystyy muokkaamaan Plot toolsien avulla. Työkalut saa näkyviin klikkaamalla kuvan päällä näkyvistä kuvakkeista oikean puolimmaisinta Show plot tools. Voit helposti muokata kuvaajan värejä, fonttia, viivan paksuutta, lisätä selitteitä ja myös piirtää kuvaan mm. nuolia. Ohjelmasta löytyy myös erittäin kätevä toiminto, jolla kuvan saa tallennettua haluamaansa formaattiin oikeassa koossa ja sopivalla resoluutiolla. Se löytyy valikosta File->Export Setup.... Avautuvasta ikkunasta voit muut- 5 10 15
6 Tiedostojen käsittely ja hakemistot 11 taa haluamiasi ominaisuuksia ja lopuksi tallennettua kuvan valitsemalla Export. Julkaistavia kuvia muokatessa, ehkä tärkeintä on valita riittävä resoluutio eli ainakin 300, mutta mieluummin 600 dpi (löytyy rendering - välilehdeltä). Hyviä laadullisesti häviöttömiä formaatteja kuvien tallennukseen ovat eps, pdf, tiff ja png (toisin kuin esim. jpg ja gif). 6 Tiedostojen käsittely ja hakemistot Matlab tunnistaa dos- ja unix-komentoja hakemistoissa liikkumiseen ja tiedostojen käsittelyyn. Hakemistoissa liikkuminen tapahtuu komennolla cd hakemisto. cd d : \ d a t a cd c : \ Hakemistossa olevat tiedostot saadaan listattua ruudulle komennoilla l s d i r % L i s t a a k a i k k i t e k s t i t i e d o s t o t h a k e m i s t o s s a l s *. t x t d i r *. t x t t i e d o s t o t = d i r ( ' *. t x t ' ) ; Numeroarvoja sisältävä tiedosto saadaan ladattua ohjelmaan komennolla load tai komennolla dlmread Matlabin valikoista löytyy myös työkalu nimeltä Import wizard. Excel tiedostoja voi lukea komennolla xlsread. Esim. luetaan tiedoston "data.txt"sisältö muuttujaan "data". Puolipiste komennon viimeisenä kertoo ohjelmalle, että kaikkia numeroita ei tulosteta näytölle. Huomioi, että desimaalierottimena toimii ainoastaan piste, jos siis olet käyttänyt pilkkua ohjelma ei osaa lukea numeroita ja on syytä käyttää esim. notepadin korvaa toimintoa pilkkujen muuntamisessa pisteiksi. Ohjelmien omassa formaatissa olevien tiedostojen avaaminen on vielä helpompaa: %T oimii j o s t i e d o s t o s s a on p e l k k i ä n u m e r o i t a d a t a = l o a d ( ' d a t a. t x t ' ) ; %L uetaan d a t a ohjelmaan j ä t t ä e n ensimmäinen r i v i p o i s % ( 1, 0 ) j a k ä y t e t ä ä n e r o t t i m e n a s a r k a i n t a ) d a t a = dlmread ( ' d a t a. t x t ', ' \ t ', 1, 0 ) ; %Avataan ohjelman oma t i e d o s t o t i e d o s t o. m a t k s. % t a l l e n t a m i n e n a l l a
7 Omat ohjelmat 12 l o a d t i e d o s t o. m a t Tiedostojen tallentaminen Matlabin omassa binäärimuotoisessa *.mat formaatissa onnistuu komennolla save. Data on myös mahdollista tallentaa ASCII-muodossa komennolla dlmwrite ja excel muodossa komennolla xlswrite. Tässä muutamia esimerkkejä save käskyn käytöstä: %T a l l e n t a a k a i k k i t y ö t i l a n m u u t t u j a t t i e d o s t o o n % t i e d o s t o. m a t save t i e d o s t o. m a t %T a l l e n t a a t y ö t i l a s s a o l e v a t m u u t t u j a t " m u u t t u j a 1 " j a " % m u u t t u j a 2 " t i e d o s t o o n t i e d o s t o. m a t m u u t t u j a 1 =1; m u u t t u j a 2 =2; save t i e d o s t o. m a t m u u t t u j a 1 m u u t t u j a 2 %T a l l e n n e t a a n M a t l a b i n 6 v e r s i o n k a n s s a y h t e e n s o p i v a % t i e d o s t o. T a r v i t a a n, j o s h a l u t a a n k ä y t t ä ä m a t l a b i n %vanhaa v e r s i o t a t a i e s i m. Octave j a R o h j e l m i a % t i e d o s t o n avaamiseen save v6 t i e d o s t o. m a t 7 Omat ohjelmat Käyttäjän omia ohjelmia Matlabissa ovat m-filet eli *.m päätteiset tiedostot. Niiden avulla pystyään automatisoimaan tiedostojen käsittely tai tekemään esimerkiksi simulointiohjelma. M-filejä on kahta tyyppiä: itsenäisesti komentoriviltä ajettavia ohjelmia eli skriptejä, joilla voi automatisoida tehtäviä ja funktioita, joita voi kutsua komentoriviltä (tai toisista ohjelmista) ohjelman omien funktioiden tapaan, kuten esim. mean - funktiota. Matlabissa on oma editori ja uusi M-file saadaan tehty valitsemalla "File>new>M-file". 7.1 Skriptit Skripti on sarja komentoja, jotka suoritetaan peräkkäin. Ohjelma voi sisältää myös ehtolauseita, silmukoita ja kutsuja toisiin ohjelmiin. Alla yksinkertainen esimerkki. Kaikki skriptissä määritellyt muuttujat jäävät muistiin ohjelman työtilaan. %Tämän e s i m e r k i n t a r k o i t u k s e n a on n ä y t t ä ä miten M f i l e % t o i m i i. E nsin m ä ä r i t e l l ä ä n m u u t t u j a t j a s i t t e n % s u o r i t e t a a n l a s k u t o i m i t u s j a t a l l e n n e t a a n t u l o s. % K i r j o i t a t a i k o p i o i tämä t e k s t i s u o r a a n e d i t o r i i n j a
7.2 Funktiot 13 % t a l l e n n a e s i m. n i m e l l ä koe.m, j o h o n k i n hakemistoon %missä t i e d ä t sen o l e v a n. %T y h j e n n e t ä ä n t y ö t i l a, e t t e i v ä t a i k a i s e m m a t m u u t t u j a t % s o t k e ohjelmaa c l e a r ; %x=100 x1 v e k t o r i, j o s s a on s a t u n n a i s l u k u j a x= rand ( 1 0 0, 1 ) ; %l a s k e t a a n x : n k e s k i a r v o k e s k i a r v o =mean ( x ) %l a s k e t a a n x : n k e s k i h a j o n t a k e s k i h a j o n t a = s t d ( x ) %P i i r r e t ä ä n x : s t ä k u v a a j a p l o t ( x ) x l a b e l ( ' x a k s e l i ' ) y l a b e l ( ' y a k s e l i ' ) %T a l l e n n e t a a n t u l o s save t u l o s. m a t %Tämän j ä l k e e n a j a t i e d o s t o s i i r t y m ä l l ä k y s e i s e e n %hakemistoon j a k i r j o i t a m f i l e n nimi e l i " koe.m " > %ENTER. 7.2 Funktiot Funktio luodaan samalla tavalla, kuin itsenäisesti ajettava ohjelma, mutta sen alkuun kirjoitetaan määrittely, että kyseessä on funktio. Funktiota kutsutaan myös komentoriviltä kuten skriptiä, mutta funktioon annetaan haluttu määrä argumentteja (dataa, kertoimia tms.) ja myös kerrotaan mitä muuttujia funktion halutaan palauttavan. Erotuksena skriptiin funktio toimii omassa työtilassaan eli funktiossa määritellyt muuttujat eivät jää ohjelman muistiin. Funktiot ovat käteviä usein suoritettavien laskujen automatisoinnissa. Myös pitkän skriptin pystyy lyhentämään tekemällä sen osista funktioita (aliohjelmia), joita kutsuu pääohjelmasta. Pystyt kutsumaan tekemääsi funktiota mistä tahansa hakemistosta, jos sijoitat sen ohjelman polussa olevaan hakemistoon (tai lisäät oman hakemistosi polkulistaan (search path)). Soveltuvat hakemistot saat listattua komennolla path ja oman hakemiston saat lisättyä polkuun komennella addpath tai valikosta File->Set Path. Ohjelmat eivät tallennna addpath-komennolla lisäämääsi hakemistoa polkuun vaan se pysyy siellä ainoastaan kunnes ohjelma sammutetaan, tästä ongelmasta pääsee lisäämällä komennon ohjelman käynnistyessään ajamaan tiedostoon (matlabrc.m). Samaiseen käynnistystiedostoon voi lisätä muitakin haluamiaan komentoja esim. cd omahakemisto; clc
8 Perusohjelmointi 14 %Tämä on M a t l a b i n e s i m e r k k i f u n k t i o " k l u v u t ", j o k a l a s k e e % s i i h e n %s y ö t e t y n d a t a n k e s k i a r v o n, hajonna n j a k e s k i a r v o n %k e s k i v i r h e e n. T a l l e n n a t i e d o s t o a i n a s a m a l l a n i m e l l ä, %mikä on %f u n k t i o n nimi e l i n y t k l u v u t. m Kutsu k o m e n t o r i v i l t ä %muotoa %[ k e s k i a r v o, k e s k i h a j o n t a, k e s k i v i r h e ]= k l u v u t ( arvo ) HUOMAA %, e t t ä %" k e s k i a r v o, k e s k i h a j o n t a, k e s k i v i r h e j a l u v u t " o v a t % m u u t t u j a n nimiä %j a n i i d e n t i l a l l a v o i d a a n k ä y t t ä ä h a l u t t u j a n i m i ä. % M u u t t u j a s s a " arvo " %on k ä s i t e l t ä v ä data, " k e s k i a r v o " k e s k i h a j o n t a j a % k e s k i v i r h e " o v a t %f u n k t i o n t u l o k s i a. f u n c t i o n [ k e s k i a r v o, k e s k i h a j o n t a, k e s k i v i r h e ]= k l u v u t ( arvo ) k e s k i a r v o =mean ( arvo ) ; k e s k i h a j o n t a = s t d ( arvo ) ; %L a s k e t a a n d a t a s s a o l e v i e n a r v o j e n määrä, e l i n n= l e n g t h ( arvo ) ; %Keskiarvon k e s k i v i r h e on keskihajonta n k e s k i v i r h e = k e s k i h a j o n t a / s q r t ( n ) ; Kun olet tehnyt funktion siirry siihen hakemistoon mihin se on tallennettu ja koita, että funktio toimii: Luodaan funktiolle annettavat arvot, 1000 satunnaislukua d a t a = rand ( 1 0 0 0, 1 ) ; %K u t s u t a a n äsken t e h t y ä f u n k t i o t a k l u v u t k o m e n t o r i v i l t ä % j a t a l l e n n e t a a n t u l o k s e t m u u t t u j i i n x, y j a z [ x, y, z ]= k l u v u t ( d a t a ) 8 Perusohjelmointi 8.1 Silmukka eli loop Yksi lähes joka ohjelmassa tarvittava komponentti on silmukka eli loop. Silmukan sisällä olevat toiminnot toistetaan jokaisella ajokerralla. Silmukkaa tarvitaan esimerkiksi simuloinnissa tai jos halutaan suorittaa lukea monta tiedostoa ohjelmaan ja analysoida ne samalla tavalla. Silmukka ajetaan niin monta kertaa,
8.2 Ehtolauseet: if, else ja elseif 15 kunnes annettu pysäytysehto täyttyy. Yleensä toiminta saadaan suoritettua käyttämällä for - looppia, joka ajaa komennot tietyn määrän kertoja. Lue lisää matlabin ohjeesta. %E s i m e r k k i a j e t a a n silmukka 10 k e r t a a, m u u t t u j a k e r t a s a a % j o k a i s e l l a a j o k e r r a l l a uuden a r v o n. Ajamalla ohjelman % s a a t k ä s i t y k s e n mitä t a p a h t u u l o o p i s s a.. %A l o i t e t a a n silmukka f o r k e r t a =1:10 k e r t a %Rakennetaan l o o p i l l a v e k t o r i, j o k a s a a a i n a arvon k e r t a %*2 v e k t o r i ( k e r t a ) = k e r t a *2 %L o p e t e t a a n silmukka end 8.2 Ehtolauseet: if, else ja elseif Silmukoiden lisäksi ohjelmissa tarvitaan usein ehtolauseita, joilla kontrolloidaan tiettyjen käskyjen suorittamista. Ehtolauseet toteutetaan komennoilla if, else ja elseif. if ja elseif komennot päätetään komennolla end. Yksinkertaisia esimerkkejä: %b=3 j o s a >4 i f a >4 b=3 end %b=3 j o s a >3 j a b=6 j o s a <2, muussa t a p a u k s e s s a b=0 i f a >3 b=3 e l s e i f a <2 b=6 e l s e b=0 end end
9 Tehtävien automatisointi eli Batch-mode 16 9 Tehtävien automatisointi eli Batch-mode Usein mittauksissa kertyy suuri määrä samanlaisia tai lähes samanlaisia tiedostoja joiden käsittely halutaan tehdä mahdollisimman automaattisesti. Tämä tapahtuu tekemällä oma peräkkäisistä komennoista koostuva ohjelma, jolla voi vaikkapa laskea kaikkien hakemistossa olevien tiedostojen keskiarvon. Esimerkkinä käytän lehmän jalkapainomittauksesta saatua dataa, jonka voi ladata internetistä http://files.mpastell.com/hdata.zip. Myös ao. koodi löytyy samasta zipistä nimellä hdata.m. Data on saatu mittaamalla lehmän jokaisen jalan painoa erikseen lypsyn aikana ja tiedosto koostuu neljästä sarakkeesta, joista jokaisessa on yhden jalan paino. Esimerkissä lasketaan jokaisen jalan keskipaino ja keskihajonta lehmän kokonaispaino, ja tallennetaan jokaisesta tiedostosta kuvaaja erilliseen hakemistoon. %D a t a s s a on o t s i k k o r i v i j a i t s e m i t t a u s t i e t o 7 : s s ä % s a r a k k e e s s a. H a r j o i t u k s e s s a k ä y t e t ä ä n s a r a k k e i t a 2 5, % j o i s s a on lehmän j o k a i s e n j a l a n p a i n o l y p s y n a i k a n a. c l e a r ; c l c ; %L uetaan k a i k k i hakemiston t e k s t i t i e d o s t o t m u u t t u j a a n ` ` % t i e d o s t o t ` ` t i e d o s t o t = d i r ( ' *. t x t ' ) ; %L a s k e t a a n t i e d o s t o j e n määrä j a l u o d a a n h a k e m i s t o k u v i l l e maara = l e n g t h ( t i e d o s t o t ) ; mkdir ( ' k u v a t ' ) %A j e t a a n silmukka, j o s s a k ä s i t e l l ä ä n k a i k k i h a k e m i s t o s s a % o l e v a t t i e d o s t o t f o r k e r t a =1: maara %L uetaan silmukan a j o k e r r a n o s o i t t a m a t i e d o s t o d a t a = dlmread ( t i e d o s t o t ( k e r t a ).name, ' \ t ', 1, 0 ) ; %V a l i t a a n k i i n n o s t u k s e n k o h t e e n a o l e v a s a r a k k e e t 2 5 d a t a = d a t a ( :, 2 : 5 ) ; %L a s k e t a a n lehmän k o k o n a i s p a i n o j a l k a p a i n o j e n summana d a t a ( :, 5 ) =sum ( data, 2 ) ; %L a s k e t a a n t i e d o s t o n j o k a i s e n s a r a k k e e n k e s k i a r v o. %Lopuksi m u u t t u j a s s a on k a i k k i e n t i e d o s t o j e n % k e s k i a r v o t, j o k a i n e n omalla r i v i l l ä ä n. k e s k i a r v o ( k e r t a, 1 : 5 ) =mean ( d a t a ) ; %L a s k e t a a n k e s k i h a j o n t a k e s k i h a j o n t a ( k e r t a, 1 : 5 ) = s t d ( d a t a ) ; %P i i r r e t ä ä n k u v a a j a j a l i s ä t ä ä n s e l i t t e e t p l o t ( d a t a ) x l a b e l ( ' measurement p o i n t ' )
10 Sekalaisia vinkkejä 17 y l a b e l ( ' weight ( kg ) ' ) %T u l o s t e t a a n kuva png t i e d o s t o o n. p r i n t ( [ ' k u v a t / ' num2str ( k e r t a ) '. p n g ' ], ' dpng ' ) end 10 Sekalaisia vinkkejä Tämän otsikon alla on muutamia esimerkkiohjelmia ja mielestäni hyödyllisiä komentoja.tämän osion esimerkkejä on kommentoitu vähemmän kuin alkuosaa, tarkoituksena on myös että niitä soveltaessa pitää ymmärtää mitä tekee. 10.1 Hyödyllisiä komentoja 1. find komennolla voidaan etsiä vektorista tai matriisista kaikki tietyn ehdon täyttävät arvot. Mielestäni hyödyllisin komento, säästää valtavasti laskentaaikaa jos käytetään loopin sijaan (Ks. seuraava kappale). Esim. haetaan muuttujasta data, kaikki yli 3*keskihajonta keskiarvosta poikkeavat arvot ja poistetaan ne. d a t a =[2 3 4 3 3 2 4 4 2 3 3 3 3 4 4 2 2 5 0 ] ; sd = s t d ( d a t a ) ; ka=mean ( d a t a ) ; p o i s = f i n d ( data >ka +3* sd data <ka 3*sd ) ; d a t a ( p o i s ) = [ ] ; 2. diff ( data ) käsky laskee vektorin data peräkkäisten elementtien välisen erotuksen. Esimerkki seuraavassa kappaleessa. 3. tic ja toc komennot mittaavat komentojen välissä kulunutta aikaa. Lisäämällä komennot ohjelmaan alkuun ja loppuun saadaan selville ohjelman suorittamisessa kulunut aika. 4. pause(1) lisää ohjelmaan 1 sekunnin mittaisen tauon. 5. sortrows ( data,[1 2]) järjestää matriisin rivit ensiin sarakkeen 1 mukaan ja sitten sarakkeen 2 mukaan. 6. vektori (10) =[] poistaa vektorin 10:n elementin 7. [a b] yhdistää vektorit tai matriisit a ja b.
10.2 Piikkien etsintä datasta 18 10.2 Piikkien etsintä datasta Seuraavilla esimerkeillä lasketaan kuinka monta kertaa data ylittää tietyn rajaarvon. Samalla tavalla laskea minkä tahansa piikkien määrää datassa. Laitoksella samantyyppistä laskentaa on hyödynnetty mm. lehmän potkujen määrän laskemiseksi lypsyn aikana jalkapainodatasta 1, 2 ja lehmän hengitystaajuuden laskennassa lypsyn aikana. 3 %L a s k e t a a n kuinka monta k e r t a a k u v a a j a y l i t t ä ä arvon 0. 2 c l e a r ; c l c ; d a t a = s i n ( 0 : 0. 1 : 5 0 ) ; %Raja arvon y l i t t a v ä t p i s t e e t p y l i = f i n d ( data >0. 2 ) ; %K e r r a t j o l l o i n r a j a arvo y l i t e t ä ä n y l i = f i n d ( d i f f ( p y l i ) >1) ; k e r r a t = l e n g t h ( y l i ) ; %Ensimmäinen k e r t a j ä ä l a s k e m a t t a j o s a l k u a r v o <0. 2 ; i f d a t a ( 1 ) <0. 2 k e r r a t = k e r r a t +1; end p l o t ( d a t a ) t i t l e ( [ ' Ohjelma l a s k i ' num2str ( k e r r a t ) ' y l i t y s t ä. ' ] ) Rajan ylitykset voi laskea myös hyödyntämällä pelkästään find käskyä. Ohjelma on myös helpohkosti muokattavissa huippujen haku ohjelmaksi: %L a s k e t a a n kuinka monta k e r t a a k u v a a j a y l i t t ä ä arvon 0. 2 c l e a r ; c l c ; d a t a = s i n ( 0 : 0. 1 : 5 0 ) ; d a t a 2 ( 2 : l e n g t h ( d a t a ) +1) = d a t a ; d a t a ( l e n g t h ( d a t a ) +1) =NaN ; y l i = f i n d ( data >0. 2 & d a t a 2 0. 2 ) ; k e r r a t = l e n g t h ( y l i ) ; y ( 1 : k e r r a t ) =0. 2 ; p l o t ( d a t a ) ; hold on p l o t ( y l i, y, ' * r ' ) ; t i t l e ( ' Y l i t y s = punainen * ' )
10.3 Tekstitiedostojen muunto *.mat formaattiin 19 1 Ylitys = punainen * 0.5 0 0.5 1 0 100 200 300 400 500 10.3 Tekstitiedostojen muunto *.mat formaattiin Joskus on hyödyllistä muuntaa ASCII - muotoista (txt) dataa Matlabin omaan dataformaattiin. Tähän on 2 syytä: tiedostot vievät paljon vähemmän tilaa ja aukeavat ohjelmissa suunnattoman paljon nopeammin. Alla oleva ohjelma muuntaa kaikki hakemistossa olevat *.txt tiedostot *.mat tiedostoiksi säilyttäen tiedostonimen muuten ennallaan. Uuteen *.mat tiedostoon tallennnetaan tiedostossa oleva data muuttujaan data ja tiedoston tallennuspäivämäärä muuttujaan date. c l c ; c l e a r ; %L i s t a t a a n hakemiston *. t x t t i e d o s t o t s t r u k t u u r i i n f i l e s f i l e s = d i r ( ' *. t x t ' ) ; tlkm = s i z e ( f i l e s, 1 ) f o r end i =1: tlkm %K ä y t e t ä ä n dlmread komentoa, j o s d a t a s s a on % o t s i k k o r i v i, l o a d komentoa j o s e i o l e ( k ä y t t ä j ä % v a l i t s e e ). %d a t a =dlmread ( f i l e s ( i ).name, ' \ t ', 1, 0 ) ; d a t a = l o a d ( f i l e s ( i ).name ) ; d a t e = f i l e s ( i ). d a t e ; nimi = s t r r e p ( f i l e s ( i ).name, ' t x t ', ' mat ' ) ; save ( nimi, ' d a t a ', ' d a t e ' )
10.4 Matlabin dialogit 20 10.4 Matlabin dialogit Matlabin ohjelmiin voi lisätä myös mm. graafisia dialogeja, joilla voidaan esimerkiksi seurata silmukan edistymistä (tämä on joskus mukava ominaisuus hieman enemmän aikaa vievässä ohjelmassa) tai valita avattava/tallennettava tiedosto. Lisätietoa löytyy Matlabin helpistä kohdasta Predefined Dialog Boxes. Esimerkkiohjelma luo silmukan edistymistä seuraavaan näytön. %E s i m e r k k i ' w a i t b a r ' k ä s k y s t ä. h= w a i t b a r ( 0, ' O d o t a... ' ) ; f o r i =1:100 pause (0. 1 ) w a i t b a r ( 1 / 1 0 0 ) end c l o s e ( h ) 11 Signaalin käsittely 11.1 FFT - taajuuden etsintä signaalista FFT (Fast Fourier Transform) on laskentamenetelmä, jolla voidaan laskea signaalissa esiintyvien taajuuksien voimakkuus. Alla esimerkki FFT:n laskemisesta Matlabilla. c l e a r ; c l c ; %FFT : l l ä v o i d a a n l a s k e a e r i t a a j u u k s i e n voimakkuus % s i g n a a l i s s a. Tämä on e s i m e r k k i FFT : n k ä y t ö s t ä % M a t l a b i s s a. D a t a p i s t e e t 512 kpl, m i t t a u s t a a j u u s 100 hz d a t a = ( 0 : 0. 1 : 5 1. 1 ) ; %Luodaan h ä i r i ö t ä d a t a a n n o i s e = randn ( 1, 5 1 2 ) ; %L i s ä t ä ä n h ä i r i ö s i n ( d a t a a n ) h d a t a = s i n ( d a t a ) + n o i s e / 5 ; p l o t ( data, h d a t a ) %Merkinnät j a a k s e l i e n r a j a t t i t l e ( ' Data ' ) x l a b e l ( ' Aika ' ) y l a b e l ( ' Voimakkuus ' ) %L a s k e t a a n DFT h ä i r i ö l l i s e s t ä d a t a s t a f f t f u n k t i o l l a Y = f f t ( hdata, 5 1 2 ) ;
12 Neuroverkot 21 %L a s k e t a a n power s p e c t r a l d e n s i t y e l i e r i t a a j u u k s i e n %voimakkuus s i g n a a l i s s a Pyy = Y.* c o n j (Y) / 512; %A i n o a s t a a n e n s i m m ä i s i l l ä 257 p i s t e e l l ä on m e r k i t y s t ä. % L a s k e t a a n t a a j u u s v e k t o r i e l i t a a j u u s / f f t : n p i s t e i d e n %määrä f = 1 0 0 * ( 0 : 2 5 6 ) / 5 1 2 ; %P l o t a t a a n f f t : n t u l o s u u t e e n kuvaan f i g u r e p l o t ( f, Pyy ( 1 : 2 5 7 ) ) x l a b e l ( ' T a a j u u s ( hz ) ' ) y l a b e l ( ' Voimakkuus ( db ) ' ) t i t l e ( ' FFT : n t u l o s ' ) Data FFT:n tulos Voimakkuus 1 0 1 0 20 40 60 Aika Voimakkuus (db) 100 50 0 0 10 20 30 40 50 Taajuus (hz) 12 Neuroverkot Tämän ja seuraavan kappaleen tarkoituksena on osoittaa, että hienojen termien Neuroverkko ja Sumea logiikka toteutus onnistuu ilman mitään toolboxeja ja melko yksinkertaisilla laskutoimituksilla. Mallien toimintaan perehtyminen kirjallisuuden perusteella voi olla aluksi vaikeaa, koska niissä käytetään paljon omaa terminologiaa ja sinällänsä helpoille laskutoimituksille on annettu hienot nimet. Toivottavasti nämä yksinkertaiset esimerkit hieman selventävät asiaa. 12.1 Probabilistic Neural Network Probabilistic Neural Network (PNN) on neuroverkkomalli, joka luokittelee uusia vektoreita opetusdatan perusteella. Malli säilyttää koko opetusdatan toisin kuin monet muut samaan tarkoitukseen kehitetyt NV-mallit. Esimerkki mallin toiminnasta:
12.1 Probabilistic Neural Network 22 %PNN k a h d e l l a l u o k i t u k s e l l a t ä s s ä e s i m e r k i s s ä % o p e t u s d a t a n a o v a t %k e k s i t y t a j a b, mutta ne v o i d a a n h e l p o s t i k o r v a t a % o i k e a l l a %m i t t a u s d a t a l l a. O p e t u s d a t a n r i v e i l l ä on e s i m e r k i s s ä v a i n % 2 arvoa, %koska se on h e l p o i n t a e s i t t ä ä g r a a f i s e s t i. Arvoja v o i % k u i t e n k i n %l i s ä t ä l ä h e s r a j a t t a. M a l l i n t o i m i n t a a s ä ä d e t ä ä n % m u u t t a m a l l a %s p r e a d i n =s a r v o a c l e a r ; c l c ; %O p e t u s d a t a a j a b=pnn: n 2 l u o k k a a a =[1 2 ; 2 1 2 ; 5 6 ; 7 8] b =[1 7 ; 22 4 ; 5 2 ; 7 10] %s on smoothing p a r a m e t e r ( s p r e a d ) s =0. 2 ; %c on l u o k i l t e l t a v a v e k t o r i c =[6 10] %L a s k e t a a n e t ä i s y y d e t molempien l u o k k i e n j o k a i s e e n %v e k t o r i i n (= r i v i i n ) f o r i =1: l e n g t h ( a ) ; e t a ( i ) = s q r t ( sum ( ( a ( i, : ) c ). ^ 2) ) e t b ( i ) = s q r t ( sum ( ( b ( i, : ) c ). ^ 2) ) end %R a d i a l b a s i s a c t i v a t i o n f u n c t i o n s a a arvon 1, kun % e t ä i s y y s on 0 j a muulloin <1. A k t i v o i n t i f u n k t i o n " % l e v e y s " r i i p p u u s : n a r v o s t a. r b a =exp ( s * e t a. * e t a ) rbb=exp ( s * e t b. * e t b ) %L a s k e t a a n k a i k k i e n r a d i a l b a s i s f u n k t i o i d e n summa %molemmille l u o k i l l e f a x =sum ( r b a ) fbx=sum ( rbb ) %P l o t a t a a n v e k t o r i t v a l i t a a n isompi luokka j a n ä y t e t ä ä n %se k u v a s s a p l o t ( a ( :, 1 ), a ( :, 2 ), ' s q u a r e b l a c k ' ) hold on p l o t ( b ( :, 1 ), b ( :, 2 ), ' +b ' ) p l o t ( c ( :, 1 ), c ( :, 2 ), ' * r ' ) l e g e n d ( ' luokka a ', ' luokka b ', ' u u s i ' )
13 Sumea Logiikka 23 %L u o k i t u k s e n v a l i n t a i f fax > fbx t i t l e ( ' V e k t o r i kuuluu luokkaan A ' ) e l s e t i t l e ( ' V e k t o r i kuuluu luokkaan B ' ) end hold o f f 14 12 10 Vektori kuuluu luokkaan B luokka a luokka b uusi 8 6 4 2 0 0 5 10 15 20 25 13 Sumea Logiikka Tämä on tarkoitettu esimerkiksi laskennasta sumean logiikan idean tunteville. Ensin tehdään gaussinen jäsenyysfunktio gausf.m ja sitten lasketaan yksinkertainen esimerkki sumeasta mallista. Mallissa on kolme jäsenyysfunktiota ja kaikilla jäsenyysfunktioilla on mallissa yhtä suuri paino. Gaussinen jäsenyysfunktio:f(x) = e (x c) 2σ 2 %J ä s e n y y s f u n k t i o gausf.m, c=jakauman k e s k i p i s t e, s= % h a j o n t a e l i sigma, x on u u s i p i s t e f u n c t i o n mf = g a u s f ( x, c, s ) mf=exp ( (x c ). ^ 2 / ( 2 * s ^ 2) ) ; Seuraavaksi malli: %Luodaan sumea m a l l i, j o s s a on kolme g a u s s i s t a % j ä s e n y y s f u n k t i o t a. c= f u n k t i o n k e s k i p i s t e j a s= h a j o n t a
13 Sumea Logiikka 24 % j a a= t u l o s, kun kuuluu f u n k t i o o n j ä s e n y y s a s t e e l l a 1. %Lopuksi l a s k e t a a n p i s t e e n p arvo m a l l i l l a c l c ; c l e a r ; %M ä ä r i t e l l ä ä n j ä s e n y y s f u n k t i o t c1 =4; s1 =2; a1 =1; c2 =10; s2 =2. 6 ; a2 =2; c3 =15; s3 =2; a3 =3; %P i i r r e t ä ä n k u v a a j a t p i s t e e t = 8:0. 1 : 8 ; mf1= g a u s f ( c1+ p i s t e e t, c1, s1 ) ; mf2= g a u s f ( c2+ p i s t e e t, c2, s2 ) ; mf3= g a u s f ( c3+ p i s t e e t, c3, s3 ) ; p l o t ( p i s t e e t +c1, mf1, ' b ' ) ; hold on p l o t ( p i s t e e t +c2, mf2, ' r ' ) ; p l o t ( p i s t e e t +c3, mf3, ' g ' ) ; %L a s k e t a a n p i s t e e n p arvo j a p i i r r e t ä ä n j ä s e n y y s a s t e e t %kuvaan p =8; j 1 = g a u s f ( p, c1, s1 ) ; j 2 = g a u s f ( p, c2, s2 ) ; j 3 = g a u s f ( p, c3, s3 ) ; p l o t ( p, j1, ' *b ' ) p l o t ( p, j2, ' xr ' ) p l o t ( p, j3, ' og ' ) t u l o s = j 1 * a1+ j 2 * a2+ j 3 * a3 ; hold o f f t i t l e ( [ ' T ulos = ' num2str ( t u l o s ) ] ) 1 0.8 0.6 0.4 0.2 Tulos= 1.6297 0 5 0 5 10 15 20 25
VIITTEET 25 Viitteet [1] Pastell, M., H. Takko, H. Grohn, M. Hautala, V. Poikalainen, J. Praks, I. Veermae, M. Kujala and J. Ahokas. 2006. Assessing cows welfare: Weighing the cow in a milking robot. Biosystems Engineering. 93:81-87. [2] Pastell, M., H. Takko, H. Grohn, M. Hautala, V. Poikalainen, J. Praks, I. Veermae, M. Kujala and J. Ahokas. 2006. Assessing cows welfare: Weighing the cow in a milking robot. Biosystems Engineering. 93:81-87. [3] Pastell, M., A. M. Aisla, M. Hautala, J. Ahokas, V. Poikalainen, J. Praks and I. Veermae. 2006. Automatic cow health measurement system in a milking robot. in ASABE annual international meeting, Portland, USA.
Hakemisto array, 6 clear, 5 desimaalierotin, 11 dialogi, 20 dlmread, 11 dlmwrite, 12 ehtolause, 15 else,elseif, 15 excel, 11 export setup, 8, 10 fft, 20 find, 17 for, 15 funktio, 12, 13 argumentti, 13 muuttuja, 5 plot tools, 8, 10 save, 12 silmukka, 14 skripti, 12 std, 7 toolbox, 4 Unix tunnus, 5 vektori, 6 who, 5 xlsread, 11 xlswrite, 12 if, 15 import wizard, 11 kalibrointikerroin, 7 komentorivi, 5 kuvaaja, 8 load, 11 m-file, 12 mat formaatti, 19 mat tiedostot, 12 matriisi, 6 mean, 7