MATLABin alkeita J.Merikoski JYFL 2009 fysp120 Tämän pikaoppaan tarkoitus on auttaa nopeaan alkuun matlab-ohjelmiston käytössä. Keskitymme fyysikolle (välittömästi) hyödyllisimpiin komentoihin ja rakenteisiin. 1. MUUTTUJISTA Käynnistä matlab (matriisilaboratorio) ja kokeile seuraavia komentoja. Aloitetaan tällä kerralla antamalla matlabin komentorivillä seuraava, mahdolliset aiemmat muuttujat poistava komento: >> clear Seuraava komento määrittelee muuttujan a antaen sille samalla arvon 1. Toinen komento suorittaa merkin = oikealla puolella olevan operaation ja sijoittaa sen arvon muuttujaan a (joka voi olla reaalinen tai kompleksinen, jälkimmäisistä harjoituksissa). >> a=1 >> a=a+2 Jos en halua komentojen tulosten näkyvän ruudulla, voin käyttää puolipistettä: >> a=1; >> a=a+2; Muuttujan a arvon voin katsoa sanomalla (tai disp(a)-komennolla): >> a Voimme määritellä lisää muuttujia ja käyttää niitä luovasti, esimerkiksi: >> b=5 >> c=b+2 Monesti on käytännöllistä (erityisesti editointia ajatellen) kirjoittaa useampia komentoja samalle riville: >> a=6; b=2; c=a-b >> a=pi; b=2; c=a*b >> a=pi; b=2; c=a/b >> aaa=2.22; AAA=4.44; tulos=aaa+aaa Edellä käytimme valmiiksi määriteltyä vakiota pi. Potenssiinkorotus saadaan hatuttamalla: >> a=2; b=a^3; c=a+b*(-1)^(1/2) Tarvittaessa matlab siis siirtyy kompleksilukuihin. Katsotaanpa, millaisia muuttujia olemme luoneet: >> who >> whos Määritellyiksi tulleet muuttujat ovat siis matriiseja (eli taulukoita), yllä 1x1-matriiseja! Luodaanpa sitten suurempia, ensin rivi-ja sarakematriiseja (vektoreita), seuraavasti: >> a=[1,3] >> b=[2,6] >> c=a+b >> d=[1;3] >> whos Siis pilkku on erottimena matriisin rivien sisällä ja puolipiste rivien välillä >> h=[1,3;2,7] >> k=[1,0;0,1] >> h+k >> h-k >> h*k >> h.*k Huomaa matriisien kertominen elementeittäin (operaatio.*) viimeisessä komennossa. Matlabissa pelkkä kertomerkki (operaatio *) tarkoittaa matriisikertolaskua lineaarialgebran mielessä.
Harjoituksen vuoksi yhdistelemme aiemmin opittua: >> a=1; b=2; c=3; d=4; >> AA=[a,b;c,d] >> aa=ones(2,2) >> AA*aa >> AA.*aa Kokeile itse seuraavia matriisinmuodostuskomentoja: ones, eye, zeros, diag, rand. Niiden kuvaukset löydät esimerkiksi sanomalla: >> help eye Käytämme paljon vaakavektorin muodostavaa komentoa (parametrit vain esimerkin vuoksi): >> amini=0; amaxi=2; npist=10; a=linspace(amini,amaxi,npist); Matriisin alkioon tai osaan viittaaminen käy seuraavasti (huom: heittomerkki transponoi matriisin): >> BB=rand(3,3) >> BB(2,3) >> CC=BB(1:2,2:3)' >> BB(:,1) Lisää keskeisten matriisi- ja muiden funktioiden listoja saat näkyviin esim seuraavasti: >> help >> help elmat >> help elfun >> help general Luennolla mainostetun Kermit Sigmonin oppaan Matlab Primer (3th edition) lopussa on kätevä komentotaulukko. Kannattaa pitää tämä (tai muu vastaava opas) pdf:nä oman koneen levyllä. Tekstiarvoisetkin muuttujat eli merkkijonot eli stringit ovat käytössä ja yhdisteltävissä: >> puppua='merkkeja perakkain' >> lisaa=' ja muutama viela kuten ' >> numeromerkkikin='2' >> paljon=[puppua,lisaa,numeromerkkikin] 2. PERUSFUNKTIOITA JA YKSINKERTAISIA KUVAAJIA Tuotetaan ja tuhotaan seuraavaksi vektorit x ja y=sin(x) sekä niiden kuvaaja: >> x=linspace(0,2*pi,100); >> y=sin(x); >> plot(x,y); >> whos; >> clear x y >> clf; Seuraavassa nimetään akselit ja luodaan otsikko (vakio pi=2*asin(1) oli valmiiksi määritelty): >> x1=linspace(0,2*pi,1000); y1=cos(4*x1); >> x2=linspace(0,2*pi,1000); y2=cos(4*x2).*exp(-x2/5); >> plot(x1,y1,'b-'); hold on; plot(x2,y2,'m--'); >> xlabel('x'); ylabel('y'); title('testikuva'); >> legend('y1=cos(4*x1)','y2=y2=cos(4*x2).*exp(-x2/5)') Edellä komento hold on pitää aiemmin piirretyn käyrän (ja hold off vapauttaa sen) ja komento legend tuottaa selitteen. Luodaanpa uusi kuva (huomaa askel :4: toisessa plotissa): >> figure(2); plot(x1(1:20),y1(1:20),'gx'); hold on; plot(x2(10:4:50),y2(10:4:50),'ro'); >> xlabel('x'); ylabel('y'); title('toinen testikuva'); Kolmeulotteisia kuvia saa komennolla plot3. Perusohjeita kätevässä muodossa: >> help plot
3. KOMENTOJONOT JA OHJAUSRAKENTEET Muista ohjelmointikielistä mahdollisesti tuttuja ohjausrakenteita on käytössä. Tärkeimpiä meille ovat jatkossa for-silmukat sekä if-then-else-ehtorakenteet. Jälkimmäisten yhteydessä käytetään vertailuoperaatioita, joita ovat mm. > (suurempi), < (pienempi), == (yhtäsuuri) ja ~= (erisuuri), sekä loogisia operaatiota & (and), (tai) ja ~ (not). Kirjoita seuraava silmukkarakenne matlabin oletushakemistossa teksti-muotoiseen tiedostoon nimeltä kokeilu1.m (editorin saat käyttöön valikosta: FILE -> NEW -> M-FILE): x=0; for j=1:5, x=x+1; x Tallenna ja suorita sitten kyseinen komentojono eli skripti sanomalla matlabin komentorivillä: >> kokeilu1; Kysymällä lopussa muuttujan x arvon voimme todeta suorittaneemme viidesti komennon, jossa muuttujaan x on silmukan joka kierroksella lisätty luku 1, saaden tulokseksi arvon 5. Huomaa, että muuttuja j saa silmukassa arvot 1:stä 5:een. Esimerkiksi seuraava komentojono x=0; for j=1:5, x=x+j; summaa yhteen luvut 1:stä 5:een. Saman voit tehdä myös matlabin komentorivillä: >> x=0; for j=1:5, x=x+j; Harjoittelimme yllä silmukkarakenteen käyttöä. Huomautuksenomaisesti voimme todeta, että matlabissa toki on muitakin keinoja laskea lukuja yhteen kuten esimerkiksi funktio sum: >> xx=linspace(1,5,5); x=sum(xx); Rakenteita voi sijoittaa sisäkkäin, kuten seuraavassa (rivejä sisennetty selkeyden vuoksi): x=0; n=5; m=3; for j=1:m, x=x+i-j; Puolipisteitä ja pilkkuja ei tarvitse skripteissä aina rivien loppuun kirjoittaa, mutta se on hyvä tapa ja helpottaa vähitellen kertyvien skriptien ja niiden osien myöhempää käyttöä ja yhdistelyä. Laskemme seuraavaksi kahden matriisin tulon C=A*B käyttäen silmukkaa komentojonossa: % kokeilu2.m kahden satunnaismatriisin tulo n=2; A=rand(n,n); B=rand(n,n); C=zeros(n,n); for j=1:n, for k=1:n, C(i,j)=C(i,j)+A(i,k)*B(k,j); Merkintä A(i,j) tarkoittaa matriisin A alkiota (i,j) jne ja %-merkkien taakse voi komentojonossa kirjoittaa kommentteja, jotka eivät vaikuta komentojonon suoritukseen. Tulosta voi testatakin: >> kokeilu2; >> C >> A*B
Kokeilemme vielä yksinkertaista ehtorakennetta: Mitä tekee seuraava skripti? n=3; M=2*rand(n,n)-1; for j=1:n, if M(i,j)<0, M(i,j)=-M(i,j); Huomaa, että myös if-rakenteen sulkee end. Joskus tarvitaan useampia poikkeuksia sisältäviä testejä, kuten if x>1, s=2; elseif x>=0, s=1; else s=0; missä esiteltiin samalla vertailuoperaattori >= (suurempi tai yhtäsuuri kuin). 4. KUVIEN TULOSTAMISESTA JA TALLENTAMISESTA Kuvia voi tulostaa tiedostoon komennolla (huom: -d:n jälkeen ps=postscript ja c=color) >> print dps kuva1.ps Näin tulostettiin tällä hetkellä aktiivisessa kuvaikkunassa oleva kuva väripostscript-muodossa tiedostoon kuva1.ps oletushakemistoon. Matlab tarjoaa hyvin monenlaisia tulostusmuotoja, kuten ps, pdf, eps, jpg, tiff, png. Katso lisäohjeita sanomalla help print. Huom: Pelkkä print-komento ilman tarkenteita lähettää joissakin laiteympäristöissä kuvan suoraan oletusprintterille. Kustannussyistä suoraan paperille printtaamista kannattaa välttää ja tehdä kuva aina tiedostoon, jonka voi yllätysten välttämiseksi tarkistaa ennen paperille printtaamista. Muutenkin haluamme välttää tarpeettomia paperitulosteita. 5. DATAN TALLENTAMISESTA Kaikki määritellyt muuttujat voi tallentaa senhetkiseen oletushakemistoon komennolla >> save talletus01 Näin talletettu tiedosto on matlabin sisäistä muotoa (sen nimeksi tulee talletus01.mat) ja se on ladattavissa vaikkapa seuraavan istunnon alussa komennolla >> load talletus01 Voit tallettaa myös vain osan muistissa olevasta datasta (kts. save-komennon help). >> save osadatasta01 A B s Datan voi tallettaa myös teksti- eli ascii-muodossa, jolloin sitä voi lukea muilla ohjelmilla, esim: >> save matriisib.dat B ascii Ascii-muodossa tallennetunkin datan voi lukea matlabiin: >> load matriisib.dat Tällä tavalla luettaessa data tulee matlabissa matriisiin, jonka nimi onkin matriisib. Tämä voi tuntua aluksi hämäävältä, mutta osoittautuu hyvin hyödylliseksi esimerkiksi näin luettaessa mahdollinen matlabissa jo kenties eri tavalla määritelty matriisi B säilyy koskemattomana.
6. FUNKTIOT Tähän mennessä olemme kirjoitelleet yksinkertaisia komentojonoja m-tiedostoihin (m-file). Joskus halutaan, ettei komentojono sitä kutsuttaessa muuta muiden kuin sen sisäisten muuttujien arvoja (joilla saattaa olla samoja nimiä kuin kutsuvassa skriptissä). Tällöin otetaan käyttöön function. Funktio on skripti, jossa parametrien ja tulosten välittämisestä kutsuvan ja kutsuttavan skriptin välillä huolehditaan käyttäjän määräämällä tavalla. Esimerkiksi skriptiä % funk.m kahden n*n-satunnaismatriisin 0<A(i,j)<a ja 0<B(i,j)<b tulo function f = funk(n,a,b) A=a*rand(n,n); B=b*rand(n,n); C=zeros(n,n); for j=1:n, for k=1:n, C(i,j)=C(i,j)+A(i,k)*B(k,j); f=c; käytettäisiin komentorivillä vaikkapa komennolla H=funk(4,2,4). Palaamme funktioiden kirjoittamiseen myöhemmin esimerkkien valossa, kts. help function. 7. MUUTA MUKAVAA Matlabin komentorivillä voi aiempia komentoja selata nuolinäppäimillä. Jos kirjoitat jonkin aiemman komennon alun ja painat sitten nuolinäppäintä ylös, matlab hakee edellisen sellaisen komentosi, joka alkoi kyseisellä tavalla jne, mikä säästää elämääsi melkoisesti. Nuolinäppäinsiirtymien ohella komentoikkunassa on käytössä koko joukko komentorivien käsittelyä jouduttavia näppäinyhdistelmiä kuten Ctrl-a, Ctrl-e, Ctrl-k ja Ctrl-d, joita kannattaa kokeilla. Tekstistringejä kannattaa opetella käyttämään tehokkaasti, katso >> help strfun Kuvissa tarvittavat erikoismerkit kuten kreikkalaiset aakkoset ja indeksit onnistuvat mutkattomasti: >> xnimi='\gamma_{11} ({\mu}m)'; ynimi='\phi_{11} (kgm/s^{2})'; >> xlabel(xnimi); ylabel(ynimi); Numeeristen muuttujien arvoja voi muuttaa merkkijonoiksi (mm. komennot num2str ja int2str): >> x=0.123456; >> xstr=num2str(x); >> xstr=num2str(x,3); >> otsikko=['x=' xstr ' eikos niin']; >> title(otsikko); >> str2num(str) Ja päinvastoinkin (komento str2num jne): >> xxx=str2num(xstr)+9 Edistyneen käyttäjän vahva työväline on funktio nimeltä eval, joka suorittaa annetun merkkijonon matlabin komentona tai komentojonona. Esimerkki tästä: >> x3=linspace(0,2*pi,100) >> funk='cos'; >> mj=['y3=' funk '(x3);'] Näin olemme luoneet merkkijonon mj, jonka sisältö 'y3=cos(x3);' on matlabin komento, joka saadaan nyt eval-komennolla suoritettua ja tulos vaikka katsottuakin: >> eval(mj); >> plot(x3,y3,'o'); title(['katsotaanpa ' mj]); Komento eval soveltuu hyvin toimintojen automatisoimiseen silloin kun käsiteltävää dataa on massoittain. Yhdistettynä esimerkiksi funktion int2str kanssa voit luoda sillä vaikkapa juoksevalla indeksoinnilla varustettuja talletustiedostojen nimiä ja saat helposti käytettyä kaiken levykiintiösi. Komento Ctrl-c keskeyttää käynnissä olevan toiminnon suorittamisen - joskus pienellä viiveellä.