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:
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 käynnistyy
joko komennolla matlab
tai kaksoisklikkaamalla MATLAB-ikonia.
TKK:n UNIX-koneissa näin:
use matlab matlab& tai matlab -nodesktop tai matlab -nojvmOhjelma 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.
=
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 whoKokeile näitä ja tee omia lisäkokeiluja.
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 ) ja
i
(imaginaariyksikkö). Jos haluat nähdä enemmän :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.
>> 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.0000iVaihtoehtoisesti oltaisiin komennon
clear i
sijasta voitu
komentaa >> i=sqrt(-1);
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.
MATLAB tuntee mm. seuraavat alkeisfunktiot:
abs
,
sign
,
sqrt
,
exp
,
log
,
log10
,
sin
,
cos
,
tan
,
asin
,
acos
,
atan
,
sinh
,
cosh
,
tanh
.
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.
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.7012Tarkkaavainen lukija huomannee, että muuttujien esittelyn yhteydessä olleessa esimerkissä muodostimme itse asiassa matriisin
hilb(3)
.
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.
» 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
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.
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 = 100Jos
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ä. length
voidaan katsoa vektorin pituus.
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 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 3Komento
>> 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.
vk
) indeksoidaan samanpituisella loogisella
vektorilla, poimitaan ykkösiä vastaavat alkiot ja vain ne.
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:
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.9311Jä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(:);
Suuri joukko valmiita matriisifunktioita on käytettävissä.
» 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.