Lyhyt MATLAB-opas

Tässä laajempi, mutta osin keskeneräinen opas, johon siellä täällä viittaamme.

Mikä on MATLAB?

MATLAB on interaktiivinen vektori- ja matriisilaskentaohjelmisto. Se on matriisikieli, joka soveltuu mitä moninaisimpiin tieteellisen ja teknisen laskennan tehtäviin.

Cleve Moler kirjoitti alkuperäisen MATLAB:in Fortran-version 1970-luvun loppupuolella pienimuotoiseksi matriisilaskennan opetusohjelmaksi. Kyseessä oli Fortranilla kirjoitettu matriisitulkki, joka käytti LINPACK- ja EISPACK- kirjastojen rutiineja laskentakoneenaan.

Alkuperäinen MATLAB oli julkisohjelma, jota levitettiin yliopistoille. Nykyversiot ovat C-kielellä kirjoitettuja, The MathWorks Inc.:n toimittamia kaupallisia tuotteita, joihin on tehty lukuisia laajennuksia alkuperäiseen MATLAB-ohjelmaan verrattuna.

Kaupalliset lisenssit ovat varsin arvokkaita, mutta mm. opiskelutarkoituksiin on saatavissa/neuvoteltavissa edullisia lisenssejä.

MATLABin hyviä puolia:

Käyttösuosituksia, avustusta, help

HUOM: Tekstissä ovat monet MATLAB-funktiot linkkejä MATLABin avustustoiminnon ohjeteksteihin ja viittaavat MathWorks'n HelpDesk-sivustoon osoitteessa http://www.mathworks.com/access/helpdesk/help/techdoc/ref/.

MATLAB-komennot on ryhmitelty tiettyihin ryhmiin; pelkkä help antaa luettelon näistä ryhmistä ja help ryhmän_nimi listaa kaikki ryhmän komennot ja luonnollisesti help komento antaa lyhyen selostuksen halutusta komennosta. Aikaisempia syötteitä voi selata ja editoida nuolinäppäinten avulla. MATLAB-komennot helpdesk ja helpbrowser käynnistävät varsin kattavan opastusjärjestelmän, jonka käyttöön kannattaa aktivoitua tämän pikku-oppaan rinnalla.

Käsillä on interaktiivisen ohjelman interaktiivinen käyttöopas. Siispä kannattaa pitää MATLAB-istunto auki ja suorittaa oppaan istuntojen komentoja. Osassa istuntoesimekkejä annetaan vain käyttäjän antamat komennot ilman tulostuksia. Tämä selkeyttää ja lyhentää tekstiä ja motivoi paremmin lukijaa omatoimiseen kokeiluun ohjelmalla. Huomaa, että oppaan sivulta voi suoraan leikata/liimata istuntojen osia MATLABiin.
Sellaiset esimerkit, joissa annetaan myös ohjelman antamat tulosteet, varustetaan syötteiden osalta MATLAB-kehotteella >>, jolloin tulosteet erottuvat riveinä, joilla kehotetta ei ole.
Esimerkki:

>> E=eye(4,4) % Annetaan muuttujalle E arvoksi 4x4-yksikkömatriisi. 

E =

     1     0     0     0
     0     1     0     0
     0     0     1     0
     0     0     0     1

MATLAB Windows-, Macintosh- ja Unix- ympäristöissä

Uusin (Tue Apr 4 14:39:18 EEST 2006) versio on 7 (7.x, missä emme spesifioi desimaalia x, koska se saattaa muuttua nopeasti.) Käytännöllisesti katsoen kaikki oppaan opit pätevät versiosta 5 alkaen, ja monet perusasiat vanhemmillekin.

Matlab käynnistyy joko komennolla matlab tai kaksoisklikkaamalla MATLAB-ikonia.
TKK:n UNIX-koneissa näin:

       use matlab
       matlab&  tai 
       matlab -nodesktop  tai
       matlab -nojvm 
Ohjelma lopetetaan komennolla » quit tai sulkemalla hiirellä Matlab-ikkuna.

Yksinkertainen tekstikäyttöliittymä saadaan aloituskomennolla

     matlab -nodesktop (tai -nojvm)
Tämän käyttöliittymän etuna on lähinnä nopeampi käynnistys. Erityisesti X-ikkunointia etäkäytettäessä ssh:n kautta voi "moderni" käyttöliittymä olla joskus takkuinen.

Command window


[Sisällys]

MATLAB-työn alkuvaiheet

Työn talletus ja dokumentointi

Muutaman ensikokeilun jälkeen kannattaa selvittää työtapa, jolla kallisarvoiset omien aivojen neronleimahdukset saadaan talteen siltä varalta, että se olisi ainutkertaista. Katso tarkemmin laajemman oppaan tästä kohdasta

Sijoitus muuttujaan =

Sijoitusoperaattorina on =, siis komento x=1 antaa muuttujalle x arvon yksi. Puolipiste estää tulostuksen. Useampia käskyjä voi kirjoittaa samalle riville puolipisteellä erotettuna (ei tulostusta) tai pilkulla erotettuna (tulostus). Kokeile seuraavia:

  x=2;y=3; 
  x=2,y=3

Arvon voi poistaa komennolla clear. Pelkkä clear poistaa kaikki arvot, clear x poistaa arvon x, clear x y poistaa arvot x ja y, jne. Edellä x:n ja y:n väliin pitää laittaa välilyönti eikä esimerkiksi pilkkua.
Esimerkki:

  x=1; y=2; z=3;   % Annetaan arvot muuttujille x,y,z
  x,y,z            % Pyydetään Matlabia näyttämään arvot.
  clear x
  who              % Mitä muuttujia on määritelty?
  clear y z
  who              % Mitään ei näy, joten ei määriteltyjä muuttujia.
  x=1,y=2,z=3
  clear
  who              
  whos             % Laajempi kuin who
Kokeile näitä ja tee omia lisäkokeiluja.

Vakioluonteiset muuttujasymbolit

MATLAB:ssa ei ole varsinaisesti varattuja symboleja siinä mielessä, että olisi sellaisia muuttujannimiä, joille ei voitaisi antaa haluttua arvoa.

Käynnistyksen tai clear-komennon jälkeen vallitsevassa alkutilassa MATLAB tuntee muun muassa vakiot pi (siis pi) ja i (imaginaariyksikkö). Jos haluat nähdä enemmän pi:n desimaaleja, anna komento format long. Tämän jälkeen kaikissa tulosteissa annetaan paljon desimaaleja, kunnes komennolla format short palautetaan alkuperäinen tilanne. Sisäiseen laskentaan tämä ei vaikuta.
Muuttujilla realmax ja realmin on arvoinaan suurin ja pienin positiivinen liukuluku, jonka MATLAB pystyy esittämään.
Muuttuja eps on liukulukulaskennassa käytettävä suhteellinen tarkkuus. Nollalla jako antaa tulokseksi Inf. Määrittelemätön tulos, vaikka 0/0 on NaN (not a number).

Kaikkia yllä mainittuja ja muita vastaavia muuttujannimiä voidaan käyttää muihinkin tarkoituksiin. Tämä ei yleensä ole erityisemmin suositeltavaa. Joskus voi kuitenkin olla luontevaa esimerkiksi käyttää indeksinä symbolia i, jolloin on hyvä, että lasku ei katkea turhaan virheilmoitukseen varatun sanan käytön takia.

Esimerkki

>> format compact  % Tiivistetty tulostusasu
>> for i=1:3       % for-silmukkarakenne, josta ...
     for j=1:3     % .. lähemmin tuonnempana
       a(i,j)=1/(i+j-1);
     end
   end
>> a
a =
    1.0000    0.5000    0.3333
    0.5000    0.3333    0.2500
    0.3333    0.2500    0.2000
>> i
i =
     3
>> clear i
>> i
ans =
        0 + 1.0000i
Vaihtoehtoisesti oltaisiin komennon clear i sijasta voitu komentaa >> i=sqrt(-1);

Muuttuja ans

Muuttuja ans sisältää aina edellisen komennon tuloksen. Esimerkiksi jos suoritat pi^3 (siis potenssiinkorotus) ja haluat sitten jälkeenpäin sijoittaa tuloksen johonkin muuttujaan, niin se onnistuu suorittamalla x=ans. Kokeile. Edellistä aikaisempiin tuloksiin ei tällä tavalla voi viitata.

Funktioita

MATLAB tuntee mm. seuraavat alkeisfunktiot: abs, sign, sqrt, exp, log, log10, sin, cos, tan, asin, acos, atan, sinh, cosh, tanh.

Täydellisen luettelon MATLAB:n tuntemista alkeisfunktioista saat komennolla help elfun ("elementary function"). Lisäksi on käytössä laaja joukko ns. erikoisfunktioita, kts. help specfun ("special function").

Funktioita on myös helppo määritellä itse lisää. Tästä tarkemmin ohjelmointia ja m-tiedostoja käsittelevässä osuudessa.


[Sisällys]

Matriisin määritteleminen

MATLABissa on olennaisesti vain yksi tietoalkio, m×n-alkioinen numeerinen matriisi, jolla voi olla myös kompleksialkiot. (Versiosta 5 alkaen on käytössä myös ns. solumatriisi, jonka alkiot voivat olla matriiseja, ja muitakin tietorakenteita.) Käsite "matriisi" sisältää erikoistapauksenaan "vektorin" ja "skalaarin" (joka voidaan ajatella 1 x 1 -matriisiksi).
Kun vektori ajatellaan matriisin erikoistapauksena, on eroteltava vaaka- eli rivivektori (m x 1 -matriisi) ja pysty- eli sarakevektori (1 x n -matriisi).

Matriisi voidaan määritellä usealla eri tavalla:

Helpoin tapa on kirjoittaa matriisin alkiot riveittäin käyttämällä hakasulkeita ja erottamalla rivit puolipisteellä, esimerkiksi

» a=[1 2 3;4 5 6;7 8 9]

a =

     1     2     3
     4     5     6
     7     8     9

Suurissa matriiseissa voidaan syöttö katkaista usealle riville, jolloin rivinvaihto korvaa puolipisteen.

» a=[1 2 3
4 5 6
7 8 9
]
 
a =

     1     2     3
     4     5     6
     7     8     9

Matriisin eri alkiot voidaan erottaa toisistaan välilyönnillä tai pilkulla. Voimme käyttää myös mitä tahansa MATLAB-laskutoimituksia alkioiden laskemiseksi, esimerkiksi

» x=[-1.3,4/5,4*atan(1)]

x =

   -1.3000    0.8000    3.1416

Käytössä on suuri joukko valmiita MATLAB-funktiota, jotka tuottavat matriiseja:

» b=hilb(5)
 
b =

    1.0000    0.5000    0.3333    0.2500    0.2000
    0.5000    0.3333    0.2500    0.2000    0.1667
    0.3333    0.2500    0.2000    0.1667    0.1429
    0.2500    0.2000    0.1667    0.1429    0.1250
    0.2000    0.1667    0.1429    0.1250    0.1111

» c=rand(5)
 
c =

    0.2190    0.3835    0.5297    0.4175    0.5269
    0.0470    0.5194    0.6711    0.6868    0.0920
    0.6789    0.8310    0.0077    0.5890    0.6539
    0.6793    0.0346    0.3834    0.9304    0.4160
    0.9347    0.0535    0.0668    0.8462    0.7012
Tarkkaavainen lukija huomannee, että muuttujien esittelyn yhteydessä olleessa esimerkissä muodostimme itse asiassa matriisin hilb(3).
[Sisällys]

Matriisilaskenta

Matriisien välillä toimivat suoraan perusoperaatiot + - * / ^ ' eli yhteenlasku, vähennyslasku, kertominen, jakolasku, potenssiin korottaminen, sekä transpoosi. Näissä täytyy operoitavien matriisien tietenkin olla toisilleen sopivaa tyyppiä, eli yhteenlaskussa samanmuotoiset, kertolaskussa "kertomiskelpoiset" jne.

» a=[1 2 3;4 5 6;7 8 0], b=a'
 
a =

     1     2     3
     4     5     6
     7     8     0

 
b =

     1     4     7
     2     5     8
     3     6     0

» x=[-1 0 2]'
 
x =

    -1
     0
     2

» c=a+b
 
c =

     2     6    10
     6    10    14
    10    14     0

» y=x-1
 
y =

    -2
    -1
     1

» x'*y  % Vaaka kertaa pysty on vektorien sisätulo
 
ans =

     4

» x*y'  % Pysty kertaa vaaka on vektorien "ulkotulo"
 
ans =

     2     1    -1
     0     0     0
    -4    -2     2

» 5*a-10

ans =

    -5     0     5
    10    15    20
    25    30   -10

Vähennyslaskussa näkyi esimerkki ns. skalaarin laajennussäännöstä. Sovellettaessa ("pisteittäistä", kts. alla) laskutoimitusta skalaarin ja matriisin välillä, laajennetaan skalaari samankokoiseksi vakiomatriisiksi.

Yhteen- ja vähennyslasku edellyttävät samanmuotoisia matriiseja, ja ne toimivat siten, että vastinalkioille tehdään ko. operaatio.
Matriisien kertolasku toimii eri tavalla. Usein on kuitenkin tarvetta kertoa matriiseja myös vastinalkioittain. Erityisesti tämä tarve on hyvin usein vektoreilla operoinnissa. Koska kertomerkki ( * ) on varattu matriisikertolaskulle, täytyy "pisteittäiselle" kertolaskulle varata oma merkkinsä:

 .* 
Sama pätee myös mm. jakolaskuun ja potenssiinkorotukseen nähden.
Usein puhumme tässä yhteydessä taulukko-operaatioista. (Yhteen- ja vähenyslasku ovat luonnostaan "taulukko-operaatioita".)

Esimerkki taulukko-operaatioista

» a=[1 2 3;4 5 6;7 8 0], b=a'
a =
     1     2     3
     4     5     6
     7     8     0
b =
     1     4     7
     2     5     8
     3     6     0

» a.*b

ans =

     1     8    21
     8    25    48
    21    48     0

» a./b

ans =

    1.0000    0.5000    0.4286
    2.0000    1.0000    0.7500
    2.3333    1.3333       NaN

Yhteenveto:

Alkioittaiset, eli "pisteittäiset" laskutoimitukset (eli taulukko-operaatiot) ovat + - .* .^ ja ./. Ensin mainitut (+, -) toimivat "luonnostaan" pisteittäin (niihin ei siten saa lisätä pistettä). Näiden argumenttien on oltava samankokoiset matriisit tai toisen on oltava skalaari. Tällöin puhutaan skalaarin laajennussäännöstä: skalaari osaa laajentua toisen argumentin kokoiseksi vakiomatriisiksi. Tämä mahdollistaa muotoa 1+A, pi.*B ym. olevat operaatiot mielivaltaisille matriiseille A,B.
Huomaa, että pi*B ja pi.*B ovat samanarvoiset, koska pi on skalaari. Edellinen noudattaa matriisikertolaskun sääntöä, jossa toisena osapuolena on skalaari, ja jälkimmäisessä on kyse skalaarin laajennussäännöstä.

Jakomerkit / ja \ liittyvät lineaarisen yhtälösysteemin ratkaisemiseen, ja niihin palataan myöhemmin.
Pisteittäinen jakolasku on tietysti selvä asia. Tässä on kuitenkin huomattava, että nyt ei pistettä voi jättää pois tapauksessa, jossa edellinen operandi on skalaari ja jälkimmäinen on skalaarista poikkeava matriisi.
Niinpä 1/v ei toimi saman periaatteen mukaan kuin yllä mainittu pi*B. Tämä on johdonmukaista, sillä eihän matriisilaskennassa ole määritelty, mitä tarkoittaa skalaarin jakaminen vektorilla tai matriisilla, toisin kuin kertolaskun tilanteessa. Siten pisteittäisessä jakolaskussa on aina oltava piste paitsi jos jälkimmäinen on skalaari. Turvallisinta lienee totuttautua tällöinkin käyttämään pistettä.

Huom! Pisteen poisjääminen on aloittelevan MATLAB-urheilijan tavallisimpia virheitä.

Kaikki yllä luetellut alkeisfunktiot toimivat edellisen kohdan tapaan alkioittain, joten niiden argumentti voi olla myös vektori tai matriisi. Kokeile joitakin näistä edellä määriteltyihin vektoreihin/matriiseihin.


[Sisällys]

Indeksointi ja vektorit

Yksinkertainen tapa määritellä vektori perustuu kaksoispiste-merkintään, joka on muotoa

alku:lisäys:loppu

Jos lisäys puuttuu, se on oletusarvoisesti 1.

>> indeksit=1:7
indeksit =
     1     2     3     4     5     6     7

» 0:.1:1
 ans =
  Columns 1 through 7 

         0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000

  Columns 8 through 11 

    0.7000    0.8000    0.9000    1.0000

Jos halutaan n kappaletta arvoja tietylle välille, voidaan tehdä esimerkiksi näin:

» n=5; x=0:1/(n-1):1
 
x =

         0    0.2500    0.5000    0.7500    1.0000

Saman asian tekee funktio linspace.

» linspace(0,1,5) 
ans =
         0    0.2500    0.5000    0.7500    1.0000
» x=linspace(-1,1); length(x)
ans =
   100
Jos linspace-komennon kolmas argumentti jätetään pois, saadaan annetun välin jako 100:aan yhtä pitkään osaan. Viimeksi esitetyt komennot havainnollistavat tätä.
Huom: Komento on syytä lopettaa puolipisteellä, jottei tarvitse katsoa (kärsien) suotta näytöllä vilisteleviä numeroita. Komennolla length voidaan katsoa vektorin pituus.
Tällainen käytäntö kannattaa pusertaa selkäytimeen, kun on vähänkin aavistelua siitä, että laskennan tulos on katsomista varten sietämättömän iso. (Toki kantapään kautta oppiminen on myös tehokas metodi.)
[Sisällys]

Matriisin alkio, osamatriisi

Matriisin yksittäisiin alkioihin voidaan viitata antamalla suluissa alkion indeksit. Antamalla indeksin paikalla vektori voidaan valita osamatriiseja.

» a=[1 2 3;4 5 6;7 8 9]
a =
     1     2     3
     4     5     6
     7     8     9
» a(2,2)
 
ans =

     5

» a(3,3)=a(1,3)+a(3,4)
???  Index exceeds matrix dimensions.

» a(3,3)=a(1,3)+a(3,1)  % Muutetaan alkio a(3,3).
 
a =

     1     2     3
     4     5     6
     7     8    10

» a(:,2)                % Toinen sarake.
 
ans =

     2
     5
     8

» a(3,:) = [5 5 5]     % Muutetaan kolmas rivivektori.
 
a =

     1     2     3
     4     5     6
     5     5     5

Tietoaineksen poimiminen loogisten ehtojen avulla

Loogisten operaattoreiden avulla voidaan myös kätevästi valita tietyt ehdot toteuttava osa vektorista tai matriisista.

Vektorin tapauksessa indeksointi suoritetaan loogisella vektorilla, joka koostuu nollista ja ykkösistä. Syntaksi on sama kuin vektorin ineksoinnissa kokonaislukuvektorilla yllä. Olkoon annettu vektori, jonka alkiot ilmaisevat isojen hallirakennusten kriittisten palkkien varmuuskertoimia. Muutamien hallisortumien jälkeen on tullut voimaan määräys, että varmuuskertoimien on oltava vähintään 3. Tehtävänä on valita vektorista kelvolliset varmuuskertoimet.
>> vk=[1 3 4 2 5 6 2 1 6 7 4 5 3 2 1 2 3] % Muodostetaan
                                          % varmuuskertoimien vektori.
vk =
  Columns 1 through 13
     1     3     4     2     5     6     2     1     6     7     4     5     3
  Columns 14 through 17
     2     1     2     3

>>   vk >= 3     % Mitkä ovat vähintään 3 ?
ans =
  Columns 1 through 13
     0     1     1     0     1     1     0     0     1     1     1     1     1
  Columns 14 through 17
     0     0     0     1
>> % Tuloksena looginen vektori, jossa 1 vastaa ehdon toteutumista.
>> vk(vk>=3) % Indeksoidaan loogisella vektorilla.
ans =
     3     4     5     6     6     7     4     5     3     3
Komento >> vk >= 3 vertaa vektorin vk jokaista alkiota oikeaan puoleen (3) ja palauttaa vk:n pituisen loogisen vektorin, jossa on 1 niillä kohdilla, joilla ehto toteutuu ja 0 muuten.
Kun vektoria (tässä vk) indeksoidaan samanpituisella loogisella vektorilla, poimitaan ykkösiä vastaavat alkiot ja vain ne.
Tämä on kätevää, kannattaa tehdä itselleen selväksi.

Toinen, vähän suurempi esimerkki: Muodostetaan yksikkövälillä (0,1) tasaisesti jakautuneista satunnaismuuttujista koostuva 100:n alkion pituinen vektori. Voidaan kysyä vaikka seuraavia:

  1. Kuinka moni on vähintään 0.2 ?
  2. Mikä on kaikkien näiden summa?
  3. Kuinka moni on välillä (0.4,0.6) ?
  4. Poimi kaikki viimeksi mainitulla välillä olevat!
v=rand(1,100);
>> sum(v>0.2)   % Lasketaan yhteen kaikki ykköset.
ans =
    82
>> length(v(v >= 0.2))  % Sama myös näin (vrt. edellä).
ans =
    82
>> sum(v(v >= 0.2))
ans =
   50.9311
Jätämme loput harjoitustehtäväksi. Huomaa, että looginen operaattori "and" on MATLAB:ssa &

Jos tietoaines on vaikkapa matriisissa A, on useissa tapauksissa kätevintä jonouttaa matriisi ensin pitkäksi vektoriksi näin: >> v=A(:);


[Sisällys]

Matriisifunktioita

Suuri joukko valmiita matriisifunktioita on käytettävissä.

Matriisijakolasku ja eräitä muita matriisifunktioita

» format compact    % Tiivis tulostus
» A=[1 -1 0;2 0 3;-5 4 1]
A =
     1    -1     0
     2     0     3
    -5     4     1
» det(A)             % Determinantti
ans =
     5
» b=[1;1;1]              
b =
     1
     1
     1
» x=A\b              % Ratkaistaan systeemi A*x=b
x =
   -2.8000
   -3.8000
    2.2000
» inv(A)             % Käänteismatriisi
ans =
   -2.4000    0.2000   -0.6000
   -3.4000    0.2000   -0.6000
    1.6000    0.2000    0.4000

» ans*b              % Sama tulos, edellinen tapa suositeltavampi
ans =
   -2.8000
   -3.8000
    2.2000

» [V,D]=eig(A)       % Ominaisarvot ja -vektorit
V =
   -0.2844   -0.4452   -0.1536
   -0.7494   -0.7590    0.5130
    0.5979    0.4751    0.8445
D =
   -1.6346         0         0
         0   -0.7049         0
         0         0    4.3395

Matriisin jakolaskuja on kaksi kappaletta, oikealta jako ja vasemmalta jako. A/B tarkoittaa matriisia AB-1 ja A\B matriisia A-1B. Vasemmalta jako \ laajenee myös tapauksiin, jolloin käänteismatriisia A-1 ei ole olemassa. Tällöin A\b on lineaarisen yhtälöryhmän Ax=b pienimmän neliösumman ratkaisu. Katso help \.

Alkuvaiheessa kannattaa opetella pelkästään takakenoviivalla operointi eli vasemmalta jako. (Tavallista jakoviivaa on luonnollista käyttää, kun toinen operandi on skalaari, tällöin on aina syytä laittaa piste mukaan, kuten edellä tähdennettiin.)

Muistisääntö: Kummassakin jakolaskussa jakaja on jakoviivan alapuolella.


[Edellinen] [Seuraava] [Sisällys]