MATLAB-ohjelmointi. COMSOL Oy Lauttasaarentie 52 00200 Helsinki Puh. 09-2510 400, Fax 09-2510 4010 info@comsol.fi www.comsol.fi



Samankaltaiset tiedostot
Zeon PDF Driver Trial

Harjoitus 1: Matlab. Harjoitus 1: Matlab. Mat Sovelletun matematiikan tietokonetyöt 1. Syksy 2006

T Sovellusohjelmat Matlab osa 4: Skriptit, funktiot ja kontrollirakenteet

Matriisit ovat matlabin perustietotyyppejä. Yksinkertaisimmillaan voimme esitellä ja tallentaa 1x1 vektorin seuraavasti: >> a = 9.81 a = 9.

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Ohjelmoinnin perusteet Y Python

Ohjelmointiharjoituksia Arduino-ympäristössä

Matlabin perusteita Grafiikka

SIMULINK S-funktiot. SIMULINK S-funktiot

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Luento 5. Timo Savola. 28. huhtikuuta 2006

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Matlab-perusteet. Jukka Jauhiainen. OAMK / Tekniikan yksikkö. Hyvinvointiteknologian koulutusohjelma

Harjoitustyö: virtuaalikone

3. Muuttujat ja operaatiot 3.1

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.

Ohjelmoinnin peruskurssi Y1

Matlabperusteita, osa 1. Heikki Apiola Matlab-perusteita, osa 1. Heikki Apiola. 12. maaliskuuta 2012

Ohjelmoinnin perusteet Y Python

Matriiseista. Emmi Koljonen

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Käyttöliittymäohjelmointi

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Ohjelmoinnin perusteet, syksy 2006

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Osoitin ja viittaus C++:ssa

1. Omat operaatiot 1.1

Matlab- ja Maple- ohjelmointi

Ohjelmoinnin perusteet Y Python

Taulukot. Jukka Harju, Jukka Juslin

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

5.6. C-kielen perusteet, osa 6/8, Taulukko , pva, kuvat jma

Tietueet. Tietueiden määrittely

Ohjelmointi 1 C#, kevät 2013, 2. tentti

Ohjelmoinnin perusteet Y Python

Luku 3. Listankäsittelyä. 3.1 Listat

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

ITKP102 Ohjelmointi 1 (6 op)

811120P Diskreetit rakenteet

Ohjelmiston testaus ja laatu. Testausmenetelmiä

Valitse ruudun yläosassa oleva painike Download Scilab.

BL40A0000 Säätötekniikan ja signaalinkäsittelyn

13. Loogiset operaatiot 13.1

Ohjausjärjestelmien jatkokurssi. Visual Basic vinkkejä ohjelmointiin

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Muuttujien roolit Kiintoarvo cin >> r;

811120P Diskreetit rakenteet

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Matemaattiset ohjelmistot A. Osa 2: MATLAB

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Python-ohjelmointi Harjoitus 2

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla

Sisältö. 2. Taulukot. Yleistä. Yleistä

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

5. HelloWorld-ohjelma 5.1

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Harjoitus 10: Mathematica

3.1 Mitä tarkoittaan heredoc? Milloin sitä kannattaa käyttää? Kirjoita esimerkki sen käyttämisestä.

Ohjelmoinnin jatkokurssi, kurssikoe

Johdatus Ohjelmointiin

Harjoitus 1 -- Ratkaisut

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Heikki Apiola, Juha Kuortti, Miika Oksman. 5. lokakuuta Matlabperusteita, osa 1

Listarakenne (ArrayList-luokka)

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Kokonaislukuaritmetiikka vs. logiikkaluupit

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

Olio-ohjelmointi Syntaksikokoelma

Algoritmit 2. Luento 2 To Timo Männikkö

Java-kielen perusteita

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

ASCII-taidetta. Intro: Python

Rakenteiset tietotyypit Moniulotteiset taulukot

Sisältö. 22. Taulukot. Yleistä. Yleistä

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Muuttujien määrittely

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Toinen harjoitustyö. ASCII-grafiikkaa 2017

MATLAB 6.0 m-tiedoston ohjelmointiopas. lähteenmäki.m

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

12. Javan toistorakenteet 12.1

Loppukurssin järjestelyt C:n edistyneet piirteet

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

1. Mitä tehdään ensiksi?

Transkriptio:

MATLAB-ohjelmointi COMSOL Oy Lauttasaarentie 52 00200 Helsinki Puh. 09-2510 400, Fax 09-2510 4010 info@comsol.fi www.comsol.fi

MATLAB-Ohjelmointi Sivu 2

Sivu 3 SISÄLLYSLUETTELO 1 JOHDANTO... 5 1.1 MIKÄ IHMEEN MATLAB?... 5 1.2 KURSSIN KUVAUS JA TAVOITE... 5 2 ALKULÄMMITTELY, FUNKTIOT MATLABISSA... 7 2.1 FUNKTION RAKENNE... 7 2.2 ALIOHJELMAT JA PRIVATE-FUNKTIOT... 8 2.2.1 Kutsujärjestys... 8 2.2.2 Aliohjelmat... 9 2.2.3 Private-funktiot... 9 2.2.4 P-tiedostot... 10 2.3 KOMENTOJEN KUTSUMINEN FUNKTIOINA... 11 2.4 KIELEN RAKENTEET, OPERAATTORIT JA TESTAUS... 11 2.4.1 Vuonohjaus... 11 2.4.2 Operaattorit... 12 2.4.3 Onko X... 12 2.4.4 Esimääritellyt muuttujat... 13 2.5 FUNKTIOIDEN JA KOMENTOJONOTIEDOSTOJEN EROT... 14 2.6 EVAL JA EVALIN... 14 2.6.1 Virheiden käsittely... 15 2.6.2 Epäröivä funktio... 16 2.7 MUISTINKÄSITTELY... 17 2.8 PROFILER-TOIMINTO JA DEBUGGERI... 18 2.8.1 Debuggeri... 18 2.8.2 Profiler-toiminto... 19 3 MATLABIN TIETOTYYPIT... 20 3.1 NUMEERISET TIETOTYYPIT JA MERKKIJONOT... 20 3.2 STRUKTUURIT... 21 3.3 TIETOTYYPPI CELL... 22 3.3.1 Muuttuva määrä parametrejä... 24 3.4 PILKULLA EROTETUT LISTAT MATLABISSA... 24 4 KOODIN MUUTTAMINEN VEKTORIMUOTOON (ELI KUINKA TEHDÄÄN NOPEAA JA TIIVISTÄ KOODIA)... 26 4.1 TEKNIIKKA... 26 4.2 VAIKEAMPAA VEKTOROINTIA... 30 5 ESIMERKKEJÄ JA HARJOITUKSIA KAPPALEISIIN 2, 3 JA 4... 32 5.1 HYÖDYLLISIÄ APUVÄLINEITÄ... 32 5.2 YKSINKERTAISESTI VEKTORIMUOTOON... 33 5.3 ESIMERKKEJÄ PROFILER- JA DEBUGGER-TOIMINNOISTA... 33 5.3.1 Graafinen debuggeri... 33 5.3.2 Profiler-toiminto... 34 5.4 TIEDOSTON LUKEMINEN... 34 5.5 VAIKEAMPAA VEKTOROINTIA... 35 6 OLIOPOHJAINEN OHJELMOINTI (HAJOITA JA HALLITSE)... 36 6.1 KÄYTETTÄVISSÄ OLEVAT TYÖKALUT... 37 6.2 LUOKAN KÄSITE MATLABISSA... 39 6.2.1 Funktiot luokkien välisiin muunnoksiin... 40 6.2.2 Operaattorien kuormittaminen ja objektien prioriteetti... 40 6.2.3 Periytyminen... 41 6.2.4 Kuinka MATLAB kutsuu metodeja... 41

Sivu 4 6.3 ESIMERKKEJÄ JA HARJOITUKSIA... 42 6.3.1 Lisää uint8-metodi... 42 6.3.2 Harjoituksia polynom-luokkaan liittyen... 43 7 HANDLE GRAPHICS, TAPAHTUMAOHJATTUA OHJELMOINTIA... 45 7.1 TUTKI JA MUUTA OMINAISUUKSIA KOMENNOILLA SET JA GET... 46 7.2 CALLBACK-FUNKTIOT... 48 7.3 GUIDE (GRAPHICAL USER INTERFACE DESIGN ENVIRONMENT)... 51 7.4 ESIMERKKEJÄ JA HARJOITUKSIA... 52 7.4.1 Radionäppäimet... 52 7.4.2 Etsi kaikki HG-objektit... 52 7.4.3 UIMENU-harjoitus... 53 7.4.4 Toinen UIMENU-harjoitus (ja hieman tiedostonkäsittelyä)... 53 7.4.5 Ensimmäinen GUI... 53 7.4.6 3D-kuvaajan pyörittäminen... 54 7.4.7 Käyttöliittymän luonti olemassaolevalle funktiolle... 54 8 SYSTEEMI... 56 8.1 KUINKA MATLABIA KONFIGUROIDAAN? STARTUP.M JA FINISH.M... 56 8.2 KÄYNNISTYSPARAMETRIT... 56 8.3 MATLAB TEKNISEN PROSESSIN TAI MITTAUSLAITTEEN OHJAAMISESSA... 56 9 LIITE 1: PIKAOPAS... 58

Sivu 5 1 Johdanto 1.1 Mikä ihmeen MATLAB? MATLAB (MATrix LABoratory) on tieteelliseen laskentaan soveltuva interaktiivinen laskentaja kuvantamisohjelma. MATLAB yhdistää numeerisen analyysin, matriisilaskennan, signaalinkäsittelyn sekä grafiikkaominaisuudet käyttäjälle miellyttävään työskentely-ympäristöön, jossa tehtävät voidaan esittää tutussa matemaattisessa muodossa eikä varsinaista ohjelmointia tarvita. MATLABin avulla useat numeeriset ongelmat voidaan ratkaista erittäin nopeasti ja yksinkertaisesti esim. C- tai Fortran-ohjelmiin verrattuna. MATLAB on teollisuuden standardiapuväline teknisessä tutkimustyössä ja matemaattisten ongelmien ratkaisussa. Ohjelmisto on myös käytössä useissa yliopistoissa ja korkeakouluissa tutkimuksen ja opetuksen apuna. MATLAB on laajennettavissa sovelluskohtaisten funktiokokoelmien, "toolboxien", avulla. Funktiokokoelman M-tiedostoissa olevat funktiot laajentavat MATLABin käyttöä omien määrättyjen osa-alueidensa ongelmanratkaisua varten. Juuri joustava laajennettavuus on MATLABin suurin etu. Käyttäjä voi itse kirjoittaa tarvitsemansa funktiot tiedostoon ja laajentaa näin ohjelmaa toimimaan omien tarpeidensa mukaan. Suuri osa ohjelman mukana seuraavista funktioista on niin ikään muokattavissa tekstimuodossa. MATLAB on siis myös monipuolinen tietolähde, jota käyttäjä voi tutkia ja laajentaa halunsa mukaan. 1.2 Kurssin kuvaus ja tavoite MATLABin ammattimainen käyttö voidaan jakaa kahteen erilliseen osaan. 1. Kykyyn hyödyntää täysin ohjelmiston tarjoamat matemaattiset sovellusmahdollisuudet, mikä tarkoittaa ensi sijassa lineaarisen algebran ja numeerisen laskennan tuntemusta. Tätä ajatellen hyvä lähdeteos voisi olla esim. Gilbert Strangin "Introduction to Applied Mathematics", Wellesley-Cambridge press 1986. Kirja käsittelee suuria osia sovelletusta matematiikasta luettevalla ja helppotajuisella kielellä. Eri funktiokokoelmien tehokkaaseen käyttöön tarvitaan luonnollisesti kyseisen sovellusalueen erikoisosaamista. 2. Kykyyn ohjelmoida MATLABia. Vanhan sanonnan mukaan: "Sadan sivun Fortran-ohjelman voi MATLABilla lyhentää kymmeneen sivuun, mutta sadan sivun MATLAB-ohjelma on mahdottomuus." Väite pitikin osittain paikkansa ennen MATLAB 5:en julkaisua. Nykyään ohjelmointikieleen sisältyvät uudet rakenteet ja mukana seuraavat työkalut poistavat aikaisemmat puutteet. Kielen rakenteet ovat C:n kaltaisia, mutta useissa tapauksissa huomattavasti yksinkertaisempia. Toisaalta tapahtumia ei ole mahdollista ohjata yhtä pikkutarkasti kuin C-ohjelmissa, eikä rautaa tai oheislaitteita voi käsitellä suoraan. Lopputuloksena on, että vaikka MATLAB-ohjelmointikieli muistuttaakin C:tä, niin useissa tapauksissa C-kielessä tehokkaat ohjelmarakenteet eivät MATLABissa tuo nopeinta mahdollista lopputulosta. MATLABissa on niin ikään useita lisäyksiä, jotka helpottavat ohjelmointia jos niitä vain osaa käyttää. Kurssin tarkoitus on opettaa MATLABin käyttöä tehostavia menetelmiä ja tekniikoita. Tutkimme miten MATLABin vahvoja puolia voi käyttää hyväksi ja miten heikkoudet vältetään.

Sivu 6 Soveltuvilta osin tehdään vertailua muiden ohjelmointikielten kanssa (lue C:n kanssa). Oppaan sanastoon kuuluu paljon MATLABissa käytettyä englanninkielisiä termejä, joita ei tarkoituksenmukaisuussyistä ole suomennettu, vaikka se joiltain osin olisikin ollut mahdollista. Kurssi, joka käsittelee yksinomaan jälkimmäistä edellä mainituista kahdesta kohdasta, koostuu mm. Seuraavista osista: Funktion käsite MATLABissa, aliohjelmat, private-funktiot, kutsujärjestys Virheiden käsittely Koodin muuntaminen vektorimuotoon Tietotyypit, tiedonkäsittely, MATLAB mittaustietojen jälkikäsittelyssä Oliopohjainen ohjelmointi Handle graphics Mistä löytyy lisätietoja? Joitakin ohjeita ja vinkkejä Sisältöä selvennetään kohta kohdalta pienillä esimerkeillä ja harjoituksilla. Kurssi ei käsittele suurten ohjelmointiprojektien toteutusta. Analyysin ja suunnittelun tekniikoita, algoritmeja (puita, listoja tms.) tai algoritmien analyysiä ei myöskään käsitellä. Näitä varten tekstissä on viitteitä ammattikirjallisuuteen. Kurssin viitekirjallisuus koostuu MATLABin mukana toimitettavista käsikirjoista, tärkeitä ovat ennen kaikkea: Matlab 6 New Features Using MATLAB Using MATLAB Graphics Building GUIs with MATLAB Application Program Interface Guide

Sivu 7 2 Alkulämmittely, funktiot MATLABissa Aluksi palautetaan mieliin kuinka MATLABissa kirjoitetaan omia funktioita. Tämä on ensiarvoisen tärkeää kurssin jatkon kannalta. 2.1 Funktion rakenne Periaatteessa funktio näyttää seuraavalta: function out=oma_funktio(in); % Funktion määrittely % FUNKTIO. Ohjeteksti. % Tekijän nimi, versionumero, päivämäärä if (funktion syötetiedot tarkastava ehtolause) % Suoritetaan jos syötetiedot virheellisiä. end % Varsinainen ohjelmakoodi function out1=aliohjelma(in1); % Aliohjelmat sijoitetaan aina % Aliohjelman koodi % pääfunktion koodin jälkeen % Lisää aliohjelmia? Tiedosto määritellään funktioksi ensimmäisellä rivillä olevalla avainsanalla function. Out ja in määrittelevät funktiot syötteenä käytettävien parametrien ja funktion palauttamien arvojen tyypit. Funktion määrittelyn jälkeen seuraa tavallisesti yksi tai useampia kommenttirivejä, jotka sisältävät funktion käyttöohjeet. Käyttöohjeet saa esille komennolla help funktio 1. Käyttöohjeen ensimmäisen rivin tulee sisältää funktion nimi ja lyhyt kuvaus sen toiminnasta. Komennolla lookfor, joka tutkii kaikkien funktioiden käyttöohjeiden ensimmäiset rivit, voi tällöin etsiä esim. funktioita joilla on jotain tekemistä FFT-algoritmin kanssa (lookfor fft). Hyvään ohjelmointitapaan kuuluu tutkia kaikki funktiolle syötettävät parametrit. Tämä tehdään yleensä funktion alkuosassa. Seuraavana on vuorossa funktion ohjelmakoodi, joka suorittaa funktion varsinaisen tehtävän. MATLABin versiosta 5 alkaen funktioon voi kuulua myös aliohjelmia. Näitä ja niin kutsuttuja private-funktioita käsitellään kappaleessa 2.2. Lopuksi funktiotiedostolle annetaan nimi oma_funktio.m. Joitakin asiaan liittyviä funktioita ovat mm. 1 Oppaan lopussa on liitteenä aiheryhmittäin jaoteltu pikaohje. Se käsittää suurimman osan MATLAB-funktioista ja on erittäin hyödyllinen etsittäessä tiettyä funktiota tai funktioryhmää. MATLABin viitosversiosta lähtien mukana on myös kattava hypertekstipohjainen tietokanta, jota käytetään selaimella. Tietokanta käynnistetään komennolla helpdesk.

Sivu 8 which - Locate functions and files. what - List MATLAB-specific files in directory. exist - Check if variables or functions are defined. inmem - List functions in memory. inputname - Input argument name. clear - Clear functions and variables from memory. dir - List directory. type - List M-file. dbtype - List M-file with line numbers. 2.2 Aliohjelmat ja private-funktiot Käynnistyksen yhteydessä MATLAB tekee listan kaikista pathdef-muuttujan määrittelemissä hakemistoissa olevista M-, P- 2 ja MEX-tiedostoista. Listan voi päivittää komennolla matlabpath(matlabpath). Kun mitä tahansa funktiota kutsutaan ensimmäistä kertaa, se käännetään pseudokoodiksi (vain M-tiedostot, P-tiedostot on jo käännetty) ja ladataan muistiin. Funktiot pysyvät muistissa kunnes niitä kutsutaan uudestaan ja funktiosta on olemassa uudempi versio. Funktiot voidaan myös poistaa muistista komennolla clear. Muistissa olevat tiedostot voidaan listata komennolla inmem. 2.2.1 Kutsujärjestys kun MATLABiin syötetään uusi funktion tai muuttujan nimi X, tutkitaan järjestyksessä seuraavat asiat: 1. Onko X MATLABin työmuistissa oleva muuttuja? 2. Onko X sisäänrakennettu funktio? 3. Onko X suoritettavan funktion aliohjelma (katso kappale 2.2.2)? 4. Onko X private-funktio (kappale 2.2.3)? 5. Onko X tiedosto nykyisessä hakemistossa tai MATLABin hakupolussa (kokeile komentoa matlabpath)? Funktioilla on seuraava kutsujärjestys: MEX- P- M-tiedostot (laskeva prioriteetti). Ensimmäinen löytynyt funktio suoritetaan. Esimerkki: exist on käyttökelpoinen funktio, kun halutaan tutkia jonkin muuttujan tai funktion alkuperää. 2 P-tiedostoja käsitellään kappaleessa 2.2.4.

Sivu 9» help exist EXIST Check if variables or functions are defined. EXIST('A') returns: 0 if A does not exist 1 if A is a variable in the workspace 2 if A is an M-file or a file of unknown type on MATLAB's search path 3 if A is a MEX-file on MATLAB's search path 4 if A is a MDL-file (SIMULINK model) on MATLAB's search path 5 if A is a built-in MATLAB function 6 if A is a P-file on MATLAB's search path 7 if A is a directory EXIST('A') or EXIST('A.EXT') returns 2 if a file named 'A' or 'A.EXT' is on MATLAB's search path and the extension isn't a P or MEX function extension. EXIST('A','var') checks only for variables. EXIST('A','builtin') checks only for built-in functions. EXIST('A','file') checks for files or directories on MATLAB's search path. EXIST('A','dir') checks only for directories. EXIST returns 0 if the specified instance isn't found. See also DIR, WHAT, ISEMPTY. (exist is a built-in MATLAB function) Huomaa että annettu numerointi ei mitenkään vastaa käytettyä kutsujärjestystä. Käyttöohjeesta käy ilmi millaisia tiedostoja MATLAB käyttää omien MAT-päätteisten datatiedostojen lisäksi. Yksinkertainen esimerkki antaa tuloksen:» exist fft ans = 5» fft=3;» exist fft ans = 1 Harjoituksen jälkeen fft-funktio on käyttökelvoton kunnes samanniminen muuttuja poistetaan muistista komennolla clear fft. 2.2.2 Aliohjelmat Itse funktion kanssa samassa tiedostossa voi olla myös yksi tai useampia aliohjelmia. Ne kirjoitetaan pääfunktion ohjelmakoodin jälkeen ja niitä voivat kutsua vain pääfunktio ja samassa tiedostossa olevat muut aliohjelmat. Aliohjelmien käyttö tekee funktioiden rakenteesta selkeämmän. Aliohjelmia ei myöskään ole mahdollista kutsua suoraan callback-toiminnon avulla (katso kappale Handle Graphics), koska callback-funktioita täytyy voida kutsuakomentoriviltä. 2.2.3 Private-funktiot Private-funktiot ovat M-, P- tai MEX-tiedostoja, jotka on laitettu PRIVATE-nimiseen alihakemistoon. PRIVATE-hakemistossa olevia funktioita voivat kutsua vain hakemiston isäntähakemistossa (kuvassa PRGM1) olevat funktiot. PRIVATE-hakemistoja ei saa liittää MATLABin hakupolkuun. Siksi private-funktioilla voi olla sama nimi kuin jollain jo olemassa

Sivu 10 olevalla funktiolla. PRGM1-hakemistossa olevat funktiot voisivat esimerkiksi käyttää muunneltua versiota funktiosta fft2 (fft2 on normaalisti hakemistossa MATLAB\TOOLBOX\MATLAB\DATAFUN oleva M-tiedosto). C:\ juurihakemisto Rotkatalog MATLAB $MATLAB $MATLAB PROJECT PRGM1 PRIVATE projektin hakemisto Projektkatalog Ohjelman hakemisto, Programkatalog lisää tämä MATLABin polkuun komennolla addpath. addpath private-funktioiden Privatkatalog hakemisto till prgm1 2.2.4 P-tiedostot Jokainen MATLABin löytämä uusi M-tiedosto tarkastetaan ja käännetään ajettavaan muotoon. Tämä tapahtuu automaattisesti ja on normaalisti erittäin nopea toimenpide. Kääntäminen voidaan haluttaessa suorittaa myös etukäteen komennolla pcode, jolloin tuloksena on P-tiedosto (*.p). Kääntämiseen on yleensä kaksi syytä. 1. Ohjelma ei enää ole luettavissä tekstitiedostona. Näin voidaan suojella esim. tekijän kannalta tärkeitä algoritmeja. 2. Suuret graafiset sovellukset, kuten käyttöliittymät käynnistyvät nopeammin valmiiksi käännettyinä. Pcode-komennon haittapuolena on, että myös käyttöohje katoaa. Siksi jokainen M-tiedosto tulisi korvata kahdella uudella tiedostolla: pcode-komennolla luodulla funktio.p -tiedostolla ja funktio.m -tiedostolla, joka sisältää käyttöohjeen. P-tiedostojen haittana on myös riippuvuus laiteympäristöstä. The MathWorks toimittaa graafisiin sovelluksiin kuuluvat funktiot usein sekä P- että M- tiedostoina. Jos M-tiedostoa jostain syystä muutetaan täytyy myös P-tiedosto päivittää

Sivu 11 komennolla pcode funktio.m. Koska P-tiedostot ovat kutsujärjestyksessä ennen M-tiedostoja, ei muutoksella muutoin olisi mitään vaikutusta. 2.3 Komentojen kutsuminen funktioina Monia komentoja, esim. dir, cd, dos, load, save ja lasterr, voidaan myös kutsua funktioina. Esimerkiksi seuraavat rivit ovat toiminnaltaan identtisiä: lasterr Tapahtui_virhe lasterr('tapahtui_virhe') Ohjelmointiteknisesti funktiokutsu on parempi, koska se mahdollistaa moniosaisten merkkijonojen käyttämisen parametreina: lasterr( sprintf('tapahtui virhe %s', 3, date ) ); Kutsu kirjoittaa virheilmoituksen sitä varten varattuun muistiosoitteeseen. Edellisen kutsun parametrina ollut merkkijono voidaan tulostaa komennolla lasterr tai get(0, 'errormessage'). Virheilmoitus tallennetaan automaattisesti virheen tapahtuessa, esim funktion error suorituksen yhteydessä. Edellä esitetty rakenne on hyvin käyttökelpoinen paitsi graafisissa sovelluksissa, myös monissa muissa tilanteissa. 2.4 Kielen rakenteet, operaattorit ja testaus 2.4.1 Vuonohjaus MATLABissa on neljä eri tapaa ohjata ohjelman suoritusta. Ne ovat if, for, while ja switch. Kaikki ovat C:n kaltaisia ja niiden syntaksi on if looginen lauseke koodia elseif looginen lauseke koodia else koodia end for laskuri=alkuarvo:askelpituus:loppuarvo koodia end while looginen lauseke koodia end switch skalaariarvoinen lauseke tai merkkijono case lausekkeen_arvo % tai useampia arvoja soluvektorissa koodia otherwise koodia end MATLAB käsittelee loogiset lausekkeet suhteelisen tehokkaasti. Esim. lausekkeessa if (a b c), (a tai b tai c) b ja c jätetään laskematta mikäli a on tosi. Seuraavassa on esimerkki switch-rakenteen käytöstä:

Sivu 12 switch (fcn) % fcn on sisäänrakennettu funktio case {'max','min','sort'} % useampia vaihtoehtoja soluvektorissa. narg_out=2; % C-kielessä ei vastinetta case {'fft'} narg_out=1; otherwise narg_out=[]; error('unknown type'); end Syy esimerkkiin on, että funktiota nargout voi soveltaa ainoastaan M- tai P-tiedostoissa oleviin funktioihin, ei siis sisäänrakennettuihin funktioihin. Voit huomata tämän kokeilemalla itse komentoja nargout('fft2'), nargout('fft') ja nargout('deal'). C-kielestä eroavasti case-lauseen jälkeen ei tarvitse määritellä break-lausetta, vaan se on oletuksena. Tämän seurauksena useamman kuin yhden case-lauseen suorittaminen ei ole mahdollista. MATLABissa break-komento keskeyttää vain for- ja while-silmukoita. Lisätietoa kielen rakenteisiin liityvistä funktioista saat komennolla help lang. 2.4.2 Operaattorit MATLABissa on suuri joukko aritmeettisia-, loogisia- ja relaatio-operaattoreita. Lisätietoa operaattoreista saat komennolla help ops tai pikaoppaan osasta "Operators and special characters. Esimerkkinä tutkimme funktiota times. Siinä käytetään operaattoria.*, joka kertoo kaksi matriisia alkioittain. t=0:.1:2; [x y z]=meshgrid(t); % Mitä meshgrid oikeastaan tekee? F=z.*exp(-z-2*x.*y); % F on skalaareista koostuva kolmiulotteinen taulukko slice(x,y,z,f,[.8 2],1,[.5 1.5],'linear'); colormap(hot); colorbar; MATLABissa, jonka perustietotyyppinä on matriisi, ja jossa laskutoimituksiin tarvitut silmukat ovat sisäänrakennettuina, tulee kaavoista ja matemaattisista lausekkeista yleensä erittäin tiiviitä. Hyvä esimerkki tästä on kaksiulotteisen nopean Fourier-muunnoksen toteuttava lauseke: f = fft(fft(x).').'; % M-tiedoston fft2.m ydin jossa fft on suorituksen nopeuttamiseksi sisäänrakennettu funktio. fft2 kutsuu fft-funktiota kahdesti, ja pari transponointia pitää huolen siitä, että muunnos tapahtuu sekä x- että y-akselilla ja että lopullinen tulosmatriisi on oikean suuntainen. Huomaa, että lausekkeessa käytetään operaattoria.' eikä ' (vertaa funktioita transpose ja ctranspose). Operaattori.' transponoi matriisin sellaisenaan ottamatta liittolukuja. XOR (eksklusiivinen tai) on myös hyvin tiivis: xor = (a b) & ~(a&b); muuttujien a ja b dimensio voi olla mielivaltainen. Kaksi muuta erittäin tärkeää operaattoria ovat: any tosi jos vektorin jokin elementti on erisuuri kuin 0 all tosi jos vektorin kaikki elementit ovat erisuuria kuin 0 Tärkein operaattori on sen sijaan :, colon, jota tarkastelemme kappaleessa 4. 2.4.3 Onko X... MATLABissa on useita hyödyllisiä is-alkuisia funktioita, joilla tutkitaan muuttujien tai olioiden ominaisuuksia. Ne ovat

Sivu 13 ismember - True for set member. M isglobal - True for global variables. B isempty - True for empty matrix. B isequal - True if arrays are identical. B isnumeric - True for numeric arrays. M islogical - True for logical array. B isnan - True for Not-a-Number. B isinf - True for infinite elements. B isfinite - True for finite elements. B isreal - True for real array. B isprime - True for prime numbers. M issparse - True for sparse matrix. B ishold - Return hold state. M ishandle - True for graphics handles. B ischar - True for character array (string). B iscellstr - True for cell array of strings. M isletter - True for letters of the alphabet. B isspace - True for white space characters. B iscell - True for cell array. M isfield - True if field is in structure array. M isstruct - True for structures. M isa - True if object is a given class. B isobject - True for objects. M isunix - True for the UNIX version of MATLAB. M Kirjaimet M ja B oikeassa reunassa tarkoittavat M-tiedostoa ja vastaavasti sisäänrakennettua funktiota. Esimerkiksi yhtäläisyysoperaattorin == avulla ei ole mahdollista tunnistaa muuttujan arvoa NaN. Lausekkeen (a==nan) arvo ei koskaan ole 0, mikä on oikein, sillä NaN (Not a Number) ei voi olla yhtäsuuri minkään luvun kanssa. Tällöin tunnistamiseen täytyy käyttää funktiota isnan. Huomaa, että lauseke isnumeric(nan) on kuitenkin tosi. 2.4.4 Esimääritellyt muuttujat Seuraavassa on listattu MATLABin tärkeimmät esimääritellyt muuttujat: i, j Imaginääriyksikkö, määritelmänä sqrt(-1). Muuten i ja j eivät poikkea mitenkään tavallisista muuttujista. Niiden arvon voi halutessaan muuttaa yksinkertaisella sijoituslausekkeella. eps Liukulukulaskennan suhteellista tarkkuutta kuvaava muuttuja, määritelmänä eps=(pienin_ykköstä_suurempi_liukuluku - 1). Monien funktioiden laskentatarkkuus (TOLERANCE) on jotain*eps. computer Tietokoneen tyyppi. Mahdollistaa kone- ja käyttöjärjestelmäkohtaisen koodin käytön: switch (computer) case 'PCWIN' % Jos käytössä PC % koodia otherwise % Muuten % koodia end % Komennolla type filesep näet oikean esimerkin Inf IEEE standardin (Institute of Electrical and Electronics Engineers) mukainen positiivinen äärettömyys. Tuloksena esim. jaettaessa nollalla. NaN Not a Number, esim. 0/0 tai inf/inf. Aritmeettinen esitys ei numerolle IEEE standardia noudattavilla koneilla.

Sivu 14 Laskutoimitusten tuloksena voi olla NaN tai Inf ilman että tuloksena on virheilmoitus. Inf+Inf on edelleen Inf ja NaN+NaN tai Inf+NaN antaa tulokseksi NaN. Mitä on tuloksena laskutoimituksesta Inf-Inf? NaN ja Inf eivät näy piirtotoiminnoissa. Tätä voi hyödyntää haluttaessa piilottaa osia kuvaajasta: z=peaks; % Korkeusinformaatio z(30:40,20:30)=nan; % Korvataan tietyt pisteet arvolla NaN % z(30:40,20:30)=nan*z(30:40,20:30); % Sama operaatio MATLAB 4:ssä mesh(peaks,z); % mesh(korkeusinformaatio, väri-informaatio) colormap(copper); rotate3d % Pyöritetään kuvaajaa hiiren osoittimella (rotate3d) 2.5 Funktioiden ja komentojonotiedostojen erot Ainoa näkyvä ero funktion ja komentojonon välillä on funktiotiedostossa ensimmäisenä oleva funktion määrittely. Toiminnallisia eroja on kuitenkin useita. Komentojono varaa aina muuttujilleen tilan perustyötilasta (base workspace). Eri komentojonotiedostot näkevät täten toistensa muuttujat ja voivat muuttaa niitä tarpeen mukaan. Funktion suorituksen yhteydessä luodaan puolestaan tilapäinen työtila (function workspace). Kaikki funktion muuttujat ovat paikallisia, ellei toisin ole määritelty, eivätkä muut funktiot tai komentojonot voi muuttaa niitä. Funktion suorituksen loputtua varattu muisti vapautetaan. Kaikki parametrit, globaaleja muuttujia lukuunottamatta, välitetään funktion määrittelyssä olevan parametrilistan kautta 3. Sekä funktiot että komentojonot käännetään pseudokoodiksi ja ladataan muistiin ensimmäisellä suorituskerralla. MATLABin aikaisemmat versiot käänsivät vain funktiot. Komentojonot tulkattiin rivi kerrallaan, mikä teki niistä suhteellisesti hitaampia. Milloin sitten kannattaa käyttää komentojonoa ja milloin funktiota? Hyvänä nyrkkisääntönä voidaan sanoa, että funktiota tulee käyttää aina muutamaa erikoistapausta lukuunottamatta: 1. Suuremmissa ohjelmointiprojekteissa esimääritellyt muuttujat, globaalit tai paikalliset 4, kannattaa laittaa erilliseen tiedostoon. 2. Komentojonon käyttö helpottaa uusien funktioiden testausta, koska tällöin välttyy funktion vaatimalta parametrien määrittelyltä. 3. Komentojonoja kannattaa käyttää myös mikäli kyseessä on usein toistuva laskutoimitus, jonka tulos tallennetaan perustyötilaan. Funktion paikallisille muuttujille ei tällöin tarvitse varata muistia ja itse funktion kutsuun kuluva, useimmiten huomattava, aika säästyy. 2.6 eval ja evalin Funktio eval suorittaa sille parametrina syötetyn merkkijonon kuten tavallisen lausekkeen: 3 Käytännössä asia on näin. Katso eval- ja evalin-funktioita käsittelevä kappale. 4 Globaaleja muuttujia kannattaa välttää viimeiseen asti. Useimmiten ne tekevät ohjelmista hajanaisia ja vaikeasti ylläpidettäviä. Lisätietoja globaaleista muuttujista saat komennolla help global.

Sivu 15» ii=3;» s=['x',int2str(ii+1000),'=z',int2str(ii),'(:,',int2str(ii),');'] % Älä unohda merkkijonon % päättävää puolipistettä s = X1003=Z3(:,3);» eval(s) Varmista että merkkijono on halutun kaltainen ennen eval-funktion kutsumista. Yllä oleva esimerkki esittelee erään klassisen sovelluksen: käyttäjä ei etukäteen tiedä kuinka monta muuttujaa mittaustiedoston pohjalta syntyy, joten ne on luotava dynaamisesti. Samalla tavalla voidaan helposti luoda sarja tiedostonimiä, TULOS1.DAT, TULOS2.DAT jne. Eval-funktio on loistava työkalu. Sillä syntyy helposti tehokkaita, dynaamisia ja ennen kaikkea vaikeaselkoisia lausekkeita. Pienenä haittapuolena on kuitenkin lausekkeiden monimutkaisuudesta johtuva hitaus. Suurempi ongelma on, että eval-kutsuja sisältäviä M-tiedostoja ei voi kääntää MEXtiedostoiksi mcc-ohjelmalla (MATLAB Compiler). Eval-funktiota on syytä käyttää harkiten ja se kannattaa mahdollisuuksien mukaan korvata feval-funktiolla, joka on nopeampi eikä estä M- tiedostojen kääntämistä. evalin vastaa eval-funktiota, mutta sen käyttämän muistialueen voi valita. Kutsu on muotoa evalin(x, 'lauseke'); % X on joko 'base' tai 'caller' jossa X on 'base' tai 'caller'. 'lauseke' suoritetaan siis joko perustyötilassa tai kutsuvan funktion paikallisessa työtilassa. Evalin-funktio antaa mahdollisuuden päästä käsiksi funktion muuten erilliseen muistialueeseen. Tehokasta, mutta samanaikaisesti ohjelmista tulee epäselviä, joten mahdollisuutta kannattaa käyttää varoen. Vertaa funktioita evalin ja assignin. Miten ne eroavat toisistaan? 2.6.1 Virheiden käsittely Eval- ja evalin-funktioilla on vielä yksi arvokas ominaisuus. Ne osaavat käsitellä mahdollisia virheitä: eval('komento', 'Virheen_sattuessa_suorita_sen_sijaan_tämä_komento.'); evalin(x, 'komento', 'Virheen_sattuessa_suorita_sen_sijaan_tämä_komento.'); Myös tässä X on 'base' tai 'caller'. Virheen sattuessa vaihtoehtoinen komento suoritetaan sen funktion muistialueella, jossa virhe sattui. Oletetaan että joudumme käsittelemään suurta määrää datatiedostoja. Eval-funktion avulla tulosten katoaminen ja tarpeettomat keskeytykset funktion suorituksessa voidaan välttää tilanteessa, jossa jokin tiedostoista on vahingoittunut ja aiheuttaa (tuntemattoman) virheen. Funktiossa isfield eval-funktiota käytetään seuraavasti: tf = logical(1); % Oletuksena lippu tf on TOSI eval(['s.',k,';'], 'tf=logical(0);') % struktuuri.kenttä; Jos struktuurissa 5 s ei ole kenttää k, niin tapahtuu virhe ja lipun tf arvoksi tulee EPÄTOSI. Tämä on hyvä esimerkki eval- ja evalin-funktioiden käyttökelpoisuudesta. Toisaalta isfield-funktion pitäisi toki olla sisäänrakennettu. 5 Katso kappale 3.2.

Sivu 16 2.6.2 Epäröivä funktio C-kielessä on mahdollista määritellä staattisia muuttujia (ja funktioita). Ne tallennetaan erilliselle muistialueelle koko ohjelman suorituksen ajaksi ja alustus tapahtuu vain kerran; ohjelman alussa. MATLABissa ei ole vastaavaa mahdollisuutta, mutta alla olevan funktion static.m avulla voidaan käyttää "staattisia" muuttujia määrittelemällä halutut muuttujat globaaleiksi kutsuvan funktion ('caller') muistialueella. function static(varargin) % STATIC. Määritellään "staattisia" muuttujia (globaalien avulla) % sillä aikaa kun odotamme, että The MathWorks ottaa käyttöön staattiset % muuttujat. ÄLÄ käytä samoja muuttujanimiä eri funktioissa. % "staattista" muuttujaa EI saa muuttaa tyhjäksi ([]) suorituksen % aikana. Se poistetaan komennolla clear global muuttuja; % % esimerkki kutsusta: static XXX=99 DONE=logical(0) % Mats S, kurssitiedosto 1997 for ( ii=1:nargin ) % Silmukka tutkii yhden syöteparametrin kerrallaan v=varargin{ii}; var=v; value=[]; % varargin % Ensin tutkitaan tapahtuuko alustus asianmukaisesti yhdessä % muuttujan staattiseksi määrittelyn yhteydessä. eq=findstr('=',v); if ( length(eq)>1 ) error(['virheellinen määrittely: ',v]) elseif ( ~isempty(eq) ) var=v(1:(eq-1)); value=v((eq+1):length(v)); end % Määritellään muuttujat globaaliksi kutsuvan funktion paikallisessa työtilassa "caller workspace" % Tarvitaan kaksi kutsua, koska lauseke global muuttuja=arvo ei ole MATLABissa kelvollinen. % Ensimmäinen kutsu varmistaa, että muuttuja on olemassa kutsuvan funktion työtilassa % ja toinen alustaa muuttujan mikäli se oli aikaisemmin tyhjä. s=['global ',var,';']; evalin('caller', s); s=['if ( isempty(',var,') ), ',v,'; end']; % vain jos muuttuja=[] evalin('caller', s, 'error(''impossible'')'); end Varargin-toiminto käsitellään kappaleessa 3.3.1. Staattisia muuttujia voidaan käyttää esim. muuttujien alustamiseen kutsuttaessa funktiota ensimmäisen kerran: static START=logical(1); % Annetaan muuttujalle START alussa arvo TOSI if (START) % omat alustukset START=logical(0); % Annetaan muuttujalle START arvo EPÄTOSI else % Ensimmäisen kutsun jälkeen tehdään jotain muuta. end Kokeile static-funktiota funktion add.m avulla:

Sivu 17» type add function SUMMA_ADD=add(x); static SUMMA_ADD=0; SUMMA_ADD=SUMMA_ADD+x; % Määritellään muuttuja SUMMA_ADD "staattiseksi"» add(2) ans = 2» add(-5) ans = -3 Static on kaikesta huolimatta funktio. Sitä ei kannata käyttää nopeuden kannalta kriittisissä silmukoissa tai usein kutsuttavissa funktioissa, sillä jokainen kutsu vie muutamia millisekunteja. 2.7 Muistinkäsittely Kuten aikaisemmin mainittiin luo MATLAB käynnistyksen yhteydessä listan kaikista pathdefmuuttujan määrittelemissä hakemistoissa olevista M-, P- ja MEX-tiedostoista. Lista voidaan päivittää komennolla matlabpath(matlabpath). Kun funktiota kutsutaan ensimmäistä kertaa, se käännetään pseudokoodiksi (vain M-tiedostot, P-tiedostot on jo käännetty) ja ladataan muistiin. Funktiot pysyvät muistissa kunnes niitä kutsutaan uudestaan ja funktiosta on olemassa uudempi versio. Funktiot voidaan myös poistaa muistista komennolla clear. Mutta mitä funktiota kutsuttaessa oikein tapahtuu? function y=funktio(x); % Kutsutaan funktiota komennolla % Y=funktio(X); Useissa ohjelmointikielissä funktioita voidaan kutsua kahdella eri tavalla. Parametrista X voidaan joko tehdä kopio funktion käyttöön tai funktiolle voidaan antaa osoitin parametriin X. MATLABin funktiokutsut tehdään osoittimien avulla, vaikka kutsun muoto viittaakin muuhun. Tämä pitää paikkansa niin kauan kuin kutsuttava funktio ei muuta parametrin arvoa. Mikäli parametrin arvoa muutetaan tehdään siitä kopio funktion käyttöön, mikä lisää muistin kulutusta. Sen sijaan kutsu y=f2(f1(x)); ei vie enempää muistia kuin kutsu y=f1(x); y=f2(y); Yksinkertaisessa lausekkeessa y=x; vapautetaan ensin muistialue, johon y osoittaa. Sen jälkeen luodaan kopio x:stä ja laitetaan y osoittamaan siihen. Kaikki sisäiset laskutoimitukset tehdään kaksinkertaisen tarkkuuden liukuluvuilla. 512 512 matriisi X vaatii siten muistia 512 512 8 tavua = 2 Mb (4 Mb jos X on kompleksinen). Normaaleissa laskutoimituksissa tilaa tarvitaan usein myös muuttujien (tilapäisille) kopioille. Muisti saattaa sirpaloitua hyvinkin nopeasti ja jonkin ajan kuluttua ohjelma joutuu käyttämään kovalevyä suurten tietomäärien tallentamiseen. Tässä tilanteessa seuraavat vinkit voivat olla avuksi. Ennen kaikkea: varaa muistia suurille tietomäärille ohjelman alkuvaiheessa, kun se vielä on mahdollista 6. Suurimmat muuttujat ensin. Käytä komentoja zeros, ones, cell tai struct. 6 MATLAB käyttää dynaamiseen muistin varaamiseen C-rutiineja malloc, calloc ja free. Varattu muisti ei välttämättä palaudu käyttöjärjestelmälle ennen kuin MATLAB lopetetaan. Huomaa myös, että unixkäyttöjärjestelmissä komento x=rand(1e6,1); y=rand(1e6,1); clear; z=rand(2.01e6,1); vaatii kaksi kertaa niin paljon muistia kuin komento z=rand(2.01e6,1); clear; x=rand(1e6,1); y=rand(1e6,1); Siis suurimmat muuttujat ensiksi!

Sivu 18 X=zeros(M,N,O); % M, N ja O isoja lukuja Käytä komentoja clear tai pack paljon muistia vaativien MATLAB-ohjelmien välillä. Clear voidaan sijoittaa myös itse ohjelmaan. Anna komento clear muuttuja tai aseta muuttuja tyhjäksi komennolla muuttuja=[]; Kierrätä muuttujia, mutta harkiten! Huomaa, että määritykset kuten harva_matriisi='merkkijono'; tekevät ohjelmasta vaikeaselkoisen. Käytä yleisluontoisia nimiä ja ilmoita muuttujan uusi käyttötarkoitus kommenttirivillä. Käytä tietotyyppiä uint8, kappale 3.1, tiedon varastointiin silloin kuin se on mahdollista. Mikäli haluttujen tulosten saaminen ei edellytä suurinta mahdollista laskentatarkkuutta, niin laskutoimitukset voi hoitaa MEX-tiedoston avulla. C-kielessä on mahdollisuus käyttää 4-, 2-, tai yksitavuisia muuttujia 7, ja jopa vain muutamista biteistä koostuvat muuttujat ovat mahdollisia. Kirjoita ohjelman uudestaan niin, että tieto käsitellään pienemmissä osissa askel askeleelta. Jos muuttujat ovat erittäin suuria voivat globaalit muuttujat olla avuksi. Oletetaan että ohjelman aluksi suoritetaan seuraava komentojono: global HUGE % määrittely load HUGE % Erittäin suuri muuttuja HUGE sisältää 600x600x80 uint8-elementtiä Seuraavaksi annetaan komento global HUGE kaikissa niissä funktioissa, joissa tarvitaan muuttujaa HUGE. HUGE sijoitetaan näin globaaliin työtilaan (global workspace), jolloin kaikki funktiot käsittelevät yhtä ja samaa muuttujaa. Tärkeintä on kuitenkin se, että MATLABia ei päästetä tekemään kopioita erittäin suurista matriiseista. Suuria datajoukkoja voi siis käyttää funktion parametreina, mutta muuttaminen kannattaa tehdä pienemmissä osissa ja askel askeleelta. Kuinka MATLAB käsittelee epäselvän funktiomäärittelyn y=yfunk(y, )? Lue lisätietoja komennolla help memory. 2.8 Profiler-toiminto ja debuggeri 2.8.1 Debuggeri Verrattuna siihen mitä Microsoft keräsi C-kehitysympäristöönsä PWB:hen (Programmers WorkBench) 90-luvun alussa, ei MATLABin debuggerin ominaisuuksissa ole juurikaan kehumista. Muutoksia muuttujien arvoissa on vaikea seurata ja vuokaavion luominen ohjelmointiprojekteja varten on mahdotonta. Mukana tuleva debuggeri, graafinen Windowsissa ja Macissa, on kuitenkin intuitiivinen ja helppokäyttöinen. Tutki sen käyttöä komennoilla help debug ja help dbstop ja selvitä sen jälkeen kuinka alla oleva funktio yfunk.m toimii: 7 1 tavu == 8 bittiä

Sivu 19 function y=yfunk(y) y=2*y; Harjoituksissa, luvussa 5 on vielä toinen yksinkertainen esimerkki, jonka avulla debuggerin käyttöä voi harjoitella. 2.8.2 Profiler-toiminto MATLABin mukana seuraa myös käytännöllinen profiler-toiminto. Sen avulla saat tietää kuinka suuri osa M-tiedoston käyttämästä suoritusajasta kuluu milläkin rivillä. Alla on kolme eri versiota samasta funktiosta. Rivinumerot ovat vasemmassa laidassa. 1 function [r,s]=profiex1; function [r,s]=profiex2; function [r,s]=profiex3; 2 % PROFIEX1. % PROFIEX2. % PROFIEX3. 3 % Älä tee näin! % oikea tapa tietyin edellytyksin % oikea tapa 4 5 t=-2:.001:2; t=-2:.001:2; t=-2:.001:2; 6 r=[]; s=[]; r=zeros(size(t)); s=zeros(size(t)); 7 i=0; 8 for (x=t) for (x=t) x=t; 9 i=i+1; 10 y=1+x^3; y=1+x^3; y=1+x.^3; % vektorimuotoon 11 r=[r x]; r(i)=x; r=x; % muutettu kutsu 12 s=[r y]; s(i)=y; s=y; 13 end end Esimerkki. Kokeile seuraavia komentoja ylläoleviin funktioihin: profile profiex1; % Määrittää mihin funktioon profiler-toimintoa käytetään. profiex1; % Suoritetaan haluttu funktio. Kaikki funktion profiex1 kutsut rekisteröidään. profile report; % raportti tekstimuodossa profile plot; % graafinen raportti profile done; % Lopetetaan profiler-toiminnon käyttö. Huomaa, että kuvaajassa on kaksi y-akselia (pareto.m, katso myös plotyy.m).

Sivu 20 3 MATLABin tietotyypit MATLAB array char numeric cell struct double uint8 sparse 3.1 Numeeriset tietotyypit ja merkkijonot MATLABin versioon 5 asti double oli ainoa tietotyyppi. Kaikki muut tietotyypit tallennettiin double-muotoon, mukaan lukien merkkijonot. Jokainen double-muuttuja vie tilaa 8 tavua (64 bittiä). uint8 on 8-bittinen kokonaisluku väliltä [0,255]. Tätä tietotyyppiä käytetään lähinnä kuvien tallentamiseen. Matemaattisia operaatioita ei ole määritelty, vaan tarvittaessa ne joudutaan toteuttamaan omien M- tai MEX-tiedostojen avulla (katso luku 6). uint8 voi olla myös kompleksinen. Laskutoimituksia varten uint8 muunnetaan ensin tyyppiin double: x=uint8( double(a) + double(b) ); % a ja b tyyppiä uint8 int8, käytössä on myös 8-bittinen kokonaisluku välillä [-128, 127]. sparse on tarkoitettu harvojen matriisien tallentamiseen. Muistinkulutus on (nollasta_eroavien_alkioiden_lukumäärä)*16 + 4 tavua. char-tietotyypillä tallennetaan merkkijonoja. Muistia kuluu 2 tavua (16 bittiä) merkkiä kohden. Käytössä ovat myös double-, uint8-, int8-, sparse- ja char-nimiset funktiot, jotka muuntavat toisia tietotyyppejä nimen mukaiseen tietotyyppiin.