[Edellinen] [Seuraava] [Alkusivu]

MATLAB-opas

MATLAB-ohjelmointia

M-tiedostot

Kun MATLABille kirjoittaa jonkun nimen, esimerkiksi foo, MATLAB-tulkki toimii seuraavassa järjestyksessä:

  1. Tarkistaa onko foo muuttuja
  2. Tarkistaa onko foo sisäänrakennettu funktio
  3. Etsii nykyhakemistosta foo.mex tai foo.m-nimistä tiedostoa.
  4. Etsii MATLABin hakupolun osoittamista hakemistoista em. tiedostoja. Katso komento path.

MEX-tiedostot liittyvät käyttäjän tekemiin C- tai fortran-kielisiin aliohjelmiin. Käsittelemme niitä myöhemmin. M-tiedostot ovat tavallisia tekstitiedostoja, joita voivat sisältää MATLAB-komentoja tai vaihtoehtoisesti funktion määrittelyn. MATLAB-komentoja sisältävää M-tiedostoa kutsutaan komentotiedostoksi eli skriptiksi. Tiedoston sisältämät MATLAB-komennot suoritetaan annettaessa tiedoston nimi MATLABille. Esimerkiksi MATLABin mukana tulevat demot ovat tällaisia skriptejä.

Jos M-tiedoston ensimmäinen rivi alkaa sanalla function on kyseessä funktion määrittely. Funktio eroaa skriptistä siinä, että funktiolle voi antaa parametreja ja funktionmäärittelyn sisällä olevat muuttujanmäärittelyt ja suoritetut laskutoimitukset ovat lokaaleja ts. ne eivät näy varsinaisessa MATLAB-työtilassa. Suuri osa MATLABin mukana tulevista funktiosta on toteutettu M-tiedostoina ja niiden sisältö on siten vapaasti tutkittavissa (esimerkiksi MATLAB-komennon type avulla).

Esimerkki M-funktiosta:

function y = mean(x)
%MEAN   Average or mean value.   For vectors,  MEAN(X)  is the mean
%       value of the elements in vector  X.  For matrices,  MEAN(x)
%       is a row vector containing the mean value of each column.
[m,n] = size(x);
if m == 1
        m = n;
end
y = sum(x) / m;

Funktion otsikkorivin jälkeen tulevat kommenttirivit, joiden teksti tulostuu help-komennon yhteydessä.

Funktiomäärittelyn sisällä on käytettävissä hyödylliset muuttujat nargin ja nargout, input-argumenttien ja output-argumenttien lukumäärän tarkastamiseksi.

function r = rank(x,tol)
%RANK   Rank.  K = RANK(X) is the number of singular values  of   X
%       that are larger than MAX(SIZE(X)) * NORM(X) * EPS.
%       K = RANK(X,tol) is the number of singular values of  X that
%       are larger than tol .
s = svd(x);
if (nargin == 1)
        tol = max(size(x)) * s(1) * eps;
end
r = sum(s > tol);

Kontrollirakenteet

MATLAB sisältää muista ohjelmointikielistä tutut kontrollirakenteet, kuten for ja while loopit sekä if .. else lauseen.

Kontrollirakenteita käyttäessä on syytä muistaa vektoriajattelu. Monet asiat voidaan hoitaa suoraan vektorioperaatioilla ilman kontrollirakenteita.

Ei näin:

i=0;
for t=0:.01:10
   i=i+1;
   y(i) = sin(t);
end
Vaan näin:
t = 0:.01:10;
y = sin(t);
tai suoraan
y = sin(0:.01:10);

Oman funktion teko ja käyttö

Otetaan oikein yksinkertainen esimerkki. Ajatellaan, että haluttaisiin tehdä funktio f(x)=e-x2 Haluamme, että jos funktiolle annetaan syötteenä skalaari, vektori tai matriisi, niin se palauttaa samanmuotoisen tuloksen funktion e-x2 arvoja. (Näin toimivat yleensä kaikki MATLAB:n matemaattiset funktiot.)

function y=g(x)
% Funktio laskee sitä sun tätä (help tulostaa alussa olevat kommenttirivit)
y=exp(-x.^2);  % Piste tarvitaan, koska halutaan tuo mainittu vektoriominaisuus
               % Puolipiste on hyödyllinen, jotta funktion sisältä ei syöksähtäisi
               % ylimääräisiä tulostuksia

Nyt voit laskea arvoja, piirtää kuvaajan, ym. aivan kuten vaikkapa sin-funktiolle. Kokeile!

MATLAB löytää funktiotiedostot työskentelyhakemistosta sekä muuttujan matlabpath osoittamista hakemistoista. Joskus voi tulla nimikonflikteja.

Numeerinen integrointi, nollakohta, minimi

Oman funktion tekeminen on välttämätöntä mm. yllä mainituissa tehtävissä. Otetaan esimerkiksi numeerinen integrointi, johon MATLAB:ssa on funktiot quad ja quadl. Kokeile esimerkiksi

>> quad('g',0,5);              % Oletustoleranssi
>> format long
>> quad('g',0,5,0.000000001);  % Käyttäjän vaatima toleranssi

MATLAB:n quad-funktioissa on joitakin ongelmia, kuten se omituisuus, että funktiotiedoston nimi ei saa olla f.m (tämä on korjattu uusimmissa MATLAB-versioissa). Aika helposti ainakin quad:n tapauksessa tulee syyttä suotta varoituksia:

Recursion level limit reached in quad.  Singularity likely.  

Muita (MATLABin version 4) "funktiofunktioita":

>> help funfun

 Function functions - nonlinear numerical methods.

   ode23       - Solve differential equations, low order method.
   ode23p      - Solve and plot solutions.
   ode45       - Solve differential equations, high order method.
   quad        - Numerically evaluate integral, low order method.
   quad8       - Numerically evaluate integral, high order method.
   fmin        - Minimize function of one variable.
   fmins       - Minimize function of several variables.
   fzero       - Find zero of function of one variable. 
   fplot       - Plot function.

 See also The Optimization Toolbox, which has a comprehensive
 set of function functions for optimizing and minimizing functions.

Tutki helpin avulla ja testaa.

Ulkoisten ohjelmien käyttö

MATLABista käsin voidaan kutsua käyttäjän kirjoittamia C- tai fortran aliohjelmia. Nämä näkyvät MATLAB-istunnossa tavallisina MATLAB-funktioina. Näin voidaan lisätä huomattavasti käytettävissä olevien funktioiden määrää. Ulkoisia ohjelmia käytetään mex-tiedostojen avulla.

Tiedostovälitteinen datan siirto ulkoiseen ohjelmaan

Yksinkertaisin tapa käyttää ulkoista ohjelmaa perustuu parametrien ja datan välitykseen tiedostojen avulla. Olkoon meillä ohjelma myprog, joka luettuaan datan määrätyn nimisestä tiedostosta, käsittelee sitä ja lopuksi kirjoittaa tulokset toiseen tiedostoon. Välittävä MATLAB-funktio voisi olla vaikka seuraavanlainen

function y=myprog(x)
save indata.dat x -ascii
!run myprog
load outdata.dat
y=outdata;
MATLAB-funktioilla save ja load talletetaan ja luetaan ASCII-muodossa olevaa dataa. Kysymysmerkki ! komentorivin alussa luo käyttöjärjestelmän aliprosessin, jossa annettu ohjelma suoritetaan. Katso myös esimerkkinä vaikka print.m-funktion toteutusta.

Kehittyneempi tapa omien ohjelmien käyttöön on tehdä mex-tiedostoja, so. ohjelmia joihin on suoraan linkitetty oma aliohjelma ja jotka dynaamisesti ladataan muistiin ja joissa parametrit välitetään MATLABin sisäisesti.


[Edellinen] [Seuraava] [Alkusivu]