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
tai kaksoisklikkaamalla MATLAB-ikonia.
use matlab matlabOhjelma 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 -nodesktopPitäydymme etupäässä tässä riisutussa käyttöliittymässä. Uuteen käyttöliittymään on helpointa tutustua yksinkertaisesti alkamalla käyttää sitä.
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
=
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
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.
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
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.
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.
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
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.
Alkioittaiset, eli "pisteittäiset" laskutoimitukset
(eli taulukko-operaatiot) ovat
Jakomerkit 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
Jos
lisäys puuttuu, se on oletusarvoisesti 1.
Jos halutaan n kappaletta arvoja tietylle välille,
voidaan tehdä
esimerkiksi näin:
Saman asian tekee funktio Matriisin yksittäisiin alkioihin voidaan viitata antamalla suluissa
alkion indeksit. Antamalla indeksin paikalla vektori voidaan valita
osamatriiseja. Loogisten operaattoreiden avulla voidaan myös kätevästi valita tietyt ehdot
toteuttava osa matriisista. Suuri joukko valmiita matriisifunktioita on
käytettävissä.
Matriisin jakolaskuja on kaksi kappaletta, oikealta jako ja
vasemmalta jako.
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.
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:
+
-
.*
.^
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ä.
/
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ä.
Indeksointi ja vektorit
alku:lisäys:loppu
» 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
» n=5; x=0:1/(n-1):1
x =
0 0.2500 0.5000 0.7500 1.0000
linspace
.
» linspace(0,1,5)
ans =
0 0.2500 0.5000 0.7500 1.0000
Matriisin alkio, osamatriisi
» 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
» 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
Matriisifunktioita
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
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 \
.
[Edellinen]
[Seuraava]
[Sisällys]