Kirjautuminen

Haku

Tehtävät

Joulukalenteri 2009: Matlab

Kirjoittaja: Torgo (21.12.2009)

Matlab on neljännen sukupolven ohjelmointikieli, joka on vahvasti yhteydessä samannimiseen ohjelmistoon. Sen alkuperä on 1970-luvun loppupuolella, jolloin Cleve Moler kirjoitti sen New Mexicon yliopistossa oppilaitaan varten. Sen tarkoituksena oli toimia käyttöliittymänä numeerisen laskennan ohjelmistoihin LINPACKiin ja EISPACKiin, joiden käyttöön oli aiemmin tarvinnut Fortrania. 1984 Moler löi hynttyyt yhteen Jack Littlen ja Steve Bangertin kanssa. He kirjoittivat Matlabin uudestaan c-kielellä ja perustivat MathWorksin, joka edelleen vastaa Matlabin kehityksestä.

Matlabin (Matrix Laboratory) vahvuus on numeerisessa laskennassa. Nimensä mukaisesti se on monipuolinen laskemaan matriiseja, mikä onkin sen perustietotyyppi. Sen varsinainen vahvuus on kuitenkin laajennettavuudessa ja integroitavuudessa. Kieleen ja myös kehitysympäristöön on saatavilla laajennoksia, joiden avulla voidaan mm. suorittaa symboolista analyysia, digitaalisten järjestelmien graafista suunnittelua, simulointia ja analysointia yms. Siitä onkin tullut maailman johtava teknisen suunnittelun ja simuloinnin kieli niin akateemisessa, kuin teollisuuden maailmassakin.

Matlab on alunperin ollut tulkattava kieli ja nykyäänkin se on hyvin yleinen tapa esimerkiksi algoritmien prototyyppien kehittämiseen. Nykyään tarjolla on kuitenkin kääntäjä, jolla koodista voidaan luoda ajettava binääri tai vaikka dynaaminen kirjasto c++ -ohjelmaasi varten. Tarjolla on myös c-koodigeneraattori, joka muuntaa Matlab-ohjelmasi c-kieliseksi tai vaihtoehtoisesti voit liittää mEngine-kirjaston avulla Matlab-koodia osaksi c/c++ -koodia. Näin voit esimerkiksi visualisoida c-ohjelmasi toimintaa yhdistämällä sen Matlabin tehokkaisiin piirtorutiineihin.

Esimerkki: Tekstin tulostus

Seuraava komentotulkilla ajettava komento luo tekstityyppisen muutujan ja sijoittaa sen muuttujaan ans ja tulostaa muuttujan arvon.

"Hello World!";
disp(ans)

Tulostus:

Hello World!

Olisimme voineet kirjoittaa suoraan disp("Hello World!"), jolloin sijoitusta ans-muuttujaan ei olisi tapahtunut. Huomaa myös puolipiste. Sen olisi voinut jättää poiskin, mutta silloin komentulkki olisi tulostanut tekemänsä sijoitusoperaationkin. Usein näitä välisijoituksia ei ole tarpeen lukea, mutta se on monesti kätevä debuggauskeino algoritmeja tai vastaavia luodessa.

Matlab matkii myös lukuisia c-standardikirjaston funktioita sellaisenaan, joten olisimme voineet kirjoittaa ylläolevan myös tutumman printf-funktion avulla.

Esimerkki: Fibonaccin luvut

Matlabissa ei ole valmiina sisäänrakennettua Fibonaccin lukuja laskevaa funktiota, mutta MathWorksin sivuilla on tarjolla satoja Matlab-funktioita ilmaiseksi. Mukaan lukien seuraava sivuilta ladattu Fibonaccin funktio.

% Fibonacci.m by David Terr, Raytheon, 5-11-04
% Given an integers n, compute the nth Fibonacci number.

function fib = Fibonacci(n)
% Make sure input is an integer.
if ( n ~= floor(n) )
    error('Argument must be an integer.');
    return;
end

if ~isreal(n)
    error('Argument must be an integer.');
    return;
end

if size(n,1) ~= 1 || size(n,2) ~= 1
    error('Argument must be an integer.');
    return;
end

if ( n == 0 )
    fib = 0;
    return;
end

if ( n < 0 )
    fib = (-1)^(n+1) * Fibonacci(-n);
    return;
end

alpha = (1 + sqrt(5))/2;
fib = round( alpha^n / sqrt(5) );

Funktio kirjoitetaan .m-päätteiseen tiedostoon, jonka jälkeen se voidaan ajaa komentotulkissa. Seuraava komento laskee ja tulostaa 10. fibonacciluvun.

Fibonacci(10)

Esimerkki: Olio-ohjelmointia Matlabilla

Tämä esimerkki on varsin keinotekoinen. Sen tarkoituksena on vain esittää Matlabin olio-ominaisuuksia, sekä vahvuuksia matriisilaskennan ja datan visualisoinnin osalta. Ohjelma luo luokan liukuvaKeskiarvo, joka laskee ja tulostaa 4 tunnin liukuvan keskiarvon datalle.

Voimme esittää 4h liukuvan keskiarvon diskreetille datalle x seuraavasti:
y(n) = 1/4 x(n) + 1/4 x(n-1) + 1/4 x(n-2) + 1/4 x(n-3)
Menemättä tässä sen syvemmälle digitaalisten suotimien teorioihin, todetaan vain että siirtofunktion kaavasta H(z-1) = b(z-1) / a(z-1) johtamalla saamme:

a = 1;
b = [1/4 1/4 1/4 1/4];

Tästä voidaankin jatkaa eteenpäin ja muodostaa luokka kyseiselle operaatiolle:

classdef liukuvaKeskiarvo
    methods
        function laske(this)
            % Ladataan data tiedostosta matriisiin data
            load data.dat;
            % Sijoitetaan matriisin ensimmäinen vektori vektoriksi x
            x = data(:,1);
            % Asetetaan kertoimet
            a = 1;
            b = [1/4 1/4 1/4 1/4];
            % Suodatetaan data liukuvalla keskiarvolla
            y = filter(b,a,x);
            % Tehdään aikajana
            t = 1:length(x);
            % Visualisoidaan tulokset näytölle
            plot(t,x,'-.',t,y,'-'), grid on
            legend('Alkuperäinen','Liukuva keskiarvo',2)
        end
    end
end

Olettaen että meillä on tiedosto data.dat ja se sisältää oikeanmuotoista dataa, voimme käyttää luokkaa seuraavasti:

lk = liukuvaKeskiarvo;
lk.laske;

Hauska tietää

Vaikka Matlab onkin kaupallinen, voi monia sen vahvuuksia päästä käyttämään ilmaiseksiksin. Matlabille on olemassa muutamia ilmaisia klooneja: Octave, Scilab, Rlab, ja Scipy. Yksikään näistä ei matki Matlabia täydellisesti, mutta erityisesti Octave on suunniteltu Matlab-yhteensopivaksi. Siinä voidaankin käyttää suoraan useimpia Matlabin käyttäjien laajennoksia ja funktioita.

Kielestä sanottua

Dave Cogdell, Timken Research kirjoitti:

MATLAB is far and away the best development environment with just the right combination of power and ease of use for engineering and scientific applications.

Linkkejä

Tietoa sivustosta