Lyhyt MATLAB-opas

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. Nykyisin käytettävissä olevat versiot ovat The MathWorks Inc.:n toimittamia kaupallisia tuotteita, joihin on tehty lukuisia parannuksia alkuperäiseen MATLAB-ohjelmaan verrattuna.

MATLABin hyviä puolia:

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

Nykyisin käytössä oleva versio on 6. Suurin osa oppaan opeista pätee niin versiolle 5 kuin 6, ja monet perusasiat vanhemmillekin. Matlab käynnistyy joko komennolla matlab tai kaksoisklikkaamalla MATLAB-ikonia.
TKK:n UNIX-koneissa näin:
       use matlab
       matlab
Ohjelma lopetetaan komennolla » quit tai sulkemalla hiirellä Matlab-ikkuna.

Ohjelman käynnistyessä avautuu kutakuinkin alla olevan näköinen ikkuna, olkoon kyseessa Windows tai Unix-ympäristö. Kyseessä on versio 5 tai vanhempi.

Versiossa 6 on uusi käyttöliittymä, joka helpottaa istunnon ja Matlabin ns. m-tiedostojen tallettamista, suorittamista ja hallintaa. Toisaalta suuri määrä automaattisesti avautuvia ikkunoita voi antaa sekavan vaikutelman ja ryöstää jonkun käyttäjän mielestä liikaa ikkunatilaa muilta töiltä.

Pahin haittapuoli uuden käyttöliittymän joissakin Unix- toteutuksissa on potensiinkorotusmerkin ^ toimimattomuus, jopa niin fataalisti, että se hyydyttää koko istunnon. Siksi suosittelemme Unix-käytössä alla olevaa käynnistystapaa, ainakin on syytä tarkistaa asia ennen vakavan työskentelyn aloittamista.

Matlabin versiossa 6 saadaan vanhantyylinen käyttöliittymä aloituskomennolla

     matlab -nodesktop
Pitäydymme etupäässä tässä riisutussa käyttöliittymässä. Uuteen käyttöliittymään on helpointa tutustua yksinkertaisesti alkamalla käyttää sitä.

Command window


[Sisällys]

Yleistä

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. Myös Matlab Help Desk sisältää MATLAB-komentojen helpin

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, siis clear x, tai jos poistetaan useampia arvoja yhdellä kertaa clear x y. Edellä x:n ja y:n väliin pitää laittaa välilyönti eikä esimerkiksi pilkku. Kokeile mitä antaa

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

Vakiot

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.
Vakiot realmax ja realmin antavat suurimman ja (itseisarvoltaan) pienimmän nollasta poikkeavan liukuluvun, 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).

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

Funktioita on myös helppo määritellä itse lisää. Tästä tarkemmin tuonnempana.


[Sisällys]

Matriisin määritteleminen

MATLABissa on olennaisesti vain yksi tietoalkio, n×m-alkioinen numeerinen matriisi, jolla voi olla myös kompleksielementit. (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 kirjoitta 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 elementit voidaan erottaa toisistaan välilyönnillä tai pilkulla. Voimme käyttää myös mitä tahansa MATLAB-laskutoimituksia elementtien 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

[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
 
ans =

     4

» x*y'
 
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 matriisiksi.

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 jo varattu, 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 tällöinkin käyttää 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.

» 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

[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

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

» a<5
 
ans =

     1     1     1
     1     0     0
     0     0     0

» a.*(a<5)
 
ans =

     1     2     3
     4     0     0
     0     0     0

» x=fix(rand(100,1)*100);             % Generoidaan satunnaisvektori
» length(x(x>90))                     % Kuinka monta alkiota > 90
 
ans =

     9

» ind=find(x>90);                     % Etsitään näiden indeksit
» ind(1)                              % Ensimmäinen niistä
 
ans =

    17

» x(17)
 
ans =

    98

[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.)

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


[Edellinen] [Seuraava] [Sisällys]