... matlab/opas/03/osa4.html      Päivitetty 7.3.03

Osa 4 Funktiot, ohjelmointi

4.1 Funktioiden luokittelu

Olemme kohdanneet jo koko joukon Matlab-funktioita toiminnassa. On hyödyllistä luokitella funktioita sen mukaan, miten ne operoivat skalaari- vektori- ja matriisiargumenteille. Tällainen luokittelu on peräisin APL-kielestä ja se auttaa jäsentämään kielen periaatteita.

4.1.1 Skalaarifunktiot

Olemme nähneet, että monet funktiot toimivat niin, että skalaariargumentilla ne saavat skalaariarvon ja matriisiargumentilla ne operoivat kuhunkin matriisin alkioon. Näin toimivat mm. kaikki matemaattiset yhden argumentin alkeisfunktiot, kuten sin, cos, asin, acos, ... Kutsumme tällaista funktiota skalaarifunktioksi.

Siis jos f on skalaarifunktio, niin

                f(skalaari) == skaalaari
ja matriisille
            A=(ai,j)
pätee:
                      _                    _
                     |                      |
                     | f(a1,1) ...   f(a1,n) 
                     | f(a2,1) ...   f(a2,n) 
          f(A) ==    |         ...          |
                     |         ...          |
                     | f(am,1) ...   f(am,n) 
                     |_                    _|
Otetaanpa hieman aiempaa laajempi luettelo Matlabin skaalaarifunktioita:
    
    sin   asin    exp   abs    round
    cos   acos    log   sqrt   floor
    tan   atan    rem   sign   ceil
Omia funktioita kirjoitettaessa kannattaa kysyä itseltään, "miksi en kirjoittaisi funktiotani toimimaan skalaarifunktion tavoin?". Vasta, jos on hyvä syy tehdä jotain muuta, niin sitten tehdään.
Mieti vielä tätä ohjetta!

4.1.2 Vektorifunktiot

Olemme tavanneet joukon funktioita, jotka vektoriargumenttiin sovellettuna palauttavat skalaarituloksen. Tällaisia ovat

sum, max, min, any, all.

Kaikki nämä funktiot sovellettuna matriisiin operoivat sarakevektoreihin palauttaen kutakin sarakevektoria vastaavan luvun. Siten tuloksena on matriisin sarakkeiden lukumäärän kokoinen vektori.

Esimerkki, sum, max

>> A=reshape(1:12,4,3)
A =
     1     5     9
     2     6    10
     3     7    11
     4     8    12
>> sum(A)
ans =
    10    26    42
>> max(A)
ans =
     4     8    12
Vektorifunktioksi sanomme yleisesti sellaista funktiota f, joka toimii tähän tapaan. Toisin sanoen f on vektorifunktio, jos
  1. f(vektori) == skalaari
  2. f(A) operoi matriisin A sarakevektoreihin palauttaen sarakkeiden lukumäärän pituisen rivivektorin.
Operointi A:n rivivektoreihin saadaan luonnollisesti aikaan transponoimalla: f(A') .

Yllä lueteltujen lisäksi vektorifunktioita ovat mm.


  floor, ceil,prod,sort,mean,


Esimerkki

Miten etsitään matriisin suurin alkio? Vastaus: max(max(A)) .
Vaihtoehtoisesti voidaan A jonouttaa pitkäksi vektoriksi A(:). Suurin alkio saadaan siten myös soveltamalla max-funktiota tähän pitkään vektoriin: max(A(:)).
 >>  A=hilb(3)
A =
    1.0000    0.5000    0.3333
    0.5000    0.3333    0.2500
    0.3333    0.2500    0.2000
>>  sarakemaksimit=max(A)
sarakemaksimit =
    1.0000    0.5000    0.3333
>>  maks=max(sarakemaksimit)
maks =
     1
>>  A(:)
ans =
    1.0000
    0.5000
    0.3333
    0.5000
    0.3333
    0.2500
    0.3333
    0.2500
    0.2000
>>  max(A(:))
ans =
     1

Tehtävä: (a) Kirjoita lauseke, joka laskee matriisin A alkioiden itseisarvojen sarakesummien maksimin.
(b) Sama rivisummille.
Edellinen on matriisin ns. 1-normi, jälkimmäinen taas "ääretön-normi", näistä enemmän tuonnempana.


4.1.3 Matriisifunktiot

Tutustutaan alkajaisiksi funktioihin cumsum ja cumprod.

>> cumsum(1:10)
ans =
     1     3     6    10    15    21    28    36    45    55
>> A=[1 2 3;4 5 6]'
A =
     1     4
     2     5
     3     6
>> cumsum(A)
ans =
     1     4
     3     9
     6    15
>> cumprod(A)
ans =
     1     4
     2    20
     6   120
Nämä hyödylliset funktiot toimivat muuten vektorifunktion tavoin, mutta palauttavat vektoriargumentilla samanpituisen vektorin.

Voimme kutsua matriisifunktioksi sellaista, joka

  1. matriisiin sovellettuna palauttaa samanmuotoisen matriisin,
  2. operoi sarakkeittain tuottaen matriisin
                          _                    _
                         |                      |
              f(A) ==    | f(a.1) ...   f(a.n) 
                         |_                    _|
       
Kysymys. Mitkä muut Matlab-funktiot ovat tässä mielessä matriisfunktioita? (Onko niitä?)

4.1.4 Sekafunktiot

Kuten APL-kielessä, kaikkia muita funktioita voidaan kutsua sekafunktioiksi.

Sekafunktion (kuten kaikkien funktioiden) argumenttina on matriisi (joissakin tapauksessa kelpaa vain neliömatriisi). Tuloksena saattaa olla oikeastaan mitä vain, kuten

Esimerkkejä sekafunktioista

Kootaan vielä yhteen ja täydennetään yllä olevaa muutamalla funktiolla.

eig  inv  svd  lu  rref expm det  
size  norm  cond rank 

Esimerkkinä usean arvon palauttavan funktion käytöstä mainittakoon tässä erinomaisen hyödyllinen funktio eig .

     lam=eig(A)
antaa neliömatriisin ominaisarvot. Kutsulla
   [V,D]=eig(A)
saadaan diagonaalimatriisi D, jonka diagonaalilla ovat ominaisarvot, ja vastaavista ominaisvektorisarakkeista koostuva matriisi V.

Tehtävä: Muodosta symmetrinen 10 x 10 satunnaismariisi (käyttäen rand -funktiota), nimeltään A. Huomaa, että symmetrisen matriisin saat esim. kertomalla mielivaltaisen matriisin ja sen transpoosin keskenään. Muodosta matriisit V ja D, missä V:n sarakkeet ovat A:n ominaisvektorit ja D:n diagonaalialkiot ovat A:n ominaisarvot. Laske A*V ja V*D ja totea ne samoiksi. Muistele ominaisarvojen ja - vektoreiden määritelmää ja perustele, miksi näin on.


4.2.1

4.2.2

4.2.3

-> Sisällysluetteloon <-