Octave

GNU Octave on vapaa ohjelmisto ja kieli, joka on tarkoitettu mahdollisimman yhteensopivaksi Matlab-ohjelman kanssa. Se on tarkoitettu pääasiassa numeeriseen laskentaan. Sitä on mahdollista myös laajentaa käyttäjien tekemillä omilla C++-tiedostoilla. Octave löytyy tärkeimmille käyttöjärjestelmille, erityisesti Linux-, Windows- ja Mac OS X -alustoille.

Käynnistys, lopetus ja opastus

Octave käynnistyy (Linuxin) komentoriviltä komennolla octave.

$ octave  
GNU Octave, version 3.0.1  
Copyright (C) 2008 John W. Eaton and others.  
This is free software; see the source code for copying conditions.  
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTIBILITY or  
 FITNESS FOR A PARTICULAR PURPOSE.  For details, type `warranty'.   

Octave was configured for "i486-pc-linux-gnu".  

Additional information about Octave is available at http://www.octave.org.  

Please contribute if you find this software useful.  
For more information, visit http://www.octave.org/help-wanted.html  

Report bugs to <bug@octave.org> (but first, please read  
http://www.octave.org/bugs.html to learn how to write a helpful report).  

 For information about changes from previous versions, type `news'.   

octave:1>

Kuten niin monet muutkin komentorivipohjaiset ohjelmat, myös Octave tulostaa ensimmäiseksi tervehdyksen, joka sisältää mm. tiedon ohjelman versiosta sekä viitteitä verkosta löytyvään materiaaliin. Octaven voi käynnistää myös ilman näitä tulosteita komennolla octave -q. (Kirjain q viittaa sanaan quitet.) Lopuksi Octave antaa komentokehotteen ja jää odottamaan syötettä käyttäjältä.

Ohjelman lopettaminen onnistuu komennoilla exit ja quit sekä näppäinyhdistelmällä ctrl-d.

Opastusta Octavessa saa monien muiden ohjelmien tavoin komennolla help. Tämä komento tulostaa pitkähkön, sivutetun luettelon käytössä olevistä operaattoreista, funktioista, varatuista sanoista, komennoista yms. Luettelon näyttämisen saa katkaistua q-näppäimellä. Tarkemmat ohjeet halutusta aiheesta saa komennolla help aihe.

octave:1> help if  

*** if:  

 -- Keyword: if (COND) ... endif  
 -- Keyword: if (COND) ... else ... endif  
 -- Keyword: if (COND) ... elseif (COND) ... endif  
 -- Keyword: if (COND) ... elseif (COND) ... else ... endif  
     Begin an if block.  
          x = 1;  
          if (x == 1)  
            disp ("one");  
          elseif (x == 2)  
            disp ("two");  
          else  
            disp ("not one or two");  
          endif  


     See also: switch.  


Additional help for built-in functions and operators is  
available in the on-line version of the manual.  Use the command  
 `doc  <topic>' to search the manual index.  

Help and information about Octave is also available on the WWW  
at http://www.octave.org and via the help@octave.org  
mailing list.  
octave:2>

Komentorivin editointi

Octaven komentorivi on ohjelmoitu käyttämään samaa readline-kirjastoa kuin Pari/GP ja siksi siinä toimivat myös samat Pari/GP#Komentojen_editointi editointiominaisuudet, mukaan lukien komentohistoria ja tabulaattoritäydennys.

Komennot voi halutessa päättää puolipisteellä, jolloin ne eivät aiheuta vastauksen tulostamista ruudulle. Tällöin komentoja voidaan kirjoittaa myös useampia samalle riville puolipisteellä eroteltuina. Komentoja voi erotella samalle riville myös pilkulla, jolloin pilkulla päätetyt komennot antavat tulosteen ja puolipisteellä päätetyt eivät.

Matriiseja

Octave käsittelee lukuja kaksoistarkkuuden numeerisina liukulukuina. Kokonaislukuja ei siis tarvitse erikseen muuttaa liukuluvuiksi esimerkiksi jakolaskun yhteydessä, kuten Pari/GP:ssä. Toisaalta luvut ovat siis kokoajan numeerisia liukulukuja eivätkä välttämättä esimerkiksi tarkkoja rationaalilukuja

Matlab-kloonina Octave pyrkii esittämään kaikki numeeriset arvot n x m matriiseina. Yksittäiset luvut, skalaarit ovat tulkittavissa 1 x 1 -matriiseina sekä vaaka- ja pystymatriisit yhden rivin tai sarakkeen matriiseina.

Matriiseja luodaan joko luettelemalla alkiot suoraan:

octave:2> v = [1,2,3]  
v =  

   1   2   3  

octave:3> u = [2; 3]  
u =  

   2  
   3  

octave:4> M = [1,2;3,4;5,6]  
M =  

   1   2  
   4   4  
   5   6

Vaakarivin alkiot voi erotella myös pelkällä välilyönnillä ilman pilkkua:

octave:5> a = [1 2 3 4]  
a =  

   1   2   3   4

Matriiseja voi myös muodostaa kertomalla välin, jolta luvut halutaan. Vektorin [1 2 3 4 5 6] voi siis esittää myös muodossa [1:6]:

octave:6> [1:6]  
ans =  

   1   2   3   4   5   6

Oletusaskeleena on 1 ja tämä pätee myös desimaalilukuihin:

octave:7> [1.2:6.2]  
ans =  

   1.2000   2.2000   3.2000   4.2000   5.2000   6.2000  
octave:8> [1.2:6.7]  
ans =  

   1.2000   2.2000   3.2000   4.2000   5.2000   6.2000

Askeleen pituuden voi myös määritellä. Esimerkiksi ensimmäiset parilliset luvut saadaan seuraavasti:

octave:9> [0:2:12]  
ans =  

    0    2    4    6    8   10   12

Tämä merkintätapa soveltuu myös matriisien rakentamiseen.

octave:10> [1:4; 2:2:8; 2.3:0.3:3.3]  
ans =  

   1.0000   2.0000   3.0000   4.0000  
   2.0000   4.0000   6.0000   8.0000  
   2.3000   2.6000   2.9000   3.2000

Matriiseille voi tehdä tuttuja matriisioperaatioita: matriisikertolaskun, yhteenlaskun, transponoinnin, jne. Transponoinnin lyhennysmerkintänä toimii M'.

octave:11> M*u  
ans =  

    8  
   18  
   28  

octave:12> v*M  
ans =

  22   28  
octave:13>  [3 3 4]+v  
ans =  

   4   5   7

octave:14> transpose (M)  
ans =  

   1   3   5  
   2   4   6  

octave:15> M'  
ans =  

   1   3   5  
   2   4   6

Matriisien määrittely onnistuu myös lohkomuodossa.

octave:16> [M v']  
ans =  

   1   2   1  
   3   4   2  
   5   6   3  

octave:17> [M; u']  
ans =  

   1   2  
   3   4  
   5   6  
   2   3

Matriisien kokoa voi tarkastella funktioilla size() (koko muodossa n x m) tai length (sarakkeiden määrä).

octave:18> size(M)  
ans =  

   3   2  

octave:19> length(M)  
ans =  3

Vektorien ja matriisien alkioihin voi viitata suoraan kirjoittamalla vektorin tai matriisin perään kaarisulut, joiden sisällä ilmaistaan haluttu solu. Haetaan vektorista v2=[4,2,7,5,8] kolmas alkio. Huomaa, että vektorin paikkojen indeksointi alkaa paikasta numero 1.

octave:20> v2=[4,2,7,5,8]  
v2 =  

   4   2   7   5   8  

octave:21> v2(3)  
ans =  7

Vastaavasti voidaan vektorista valita alivektori määräämällä indeksijono edellä esitetyllä merkintätavalla:

octave:22> v2(2:4)  
ans =  

   2   7   5  

octave:23> v2(2:2:4)  
ans =  

   2   5

Tässä siis rajattiin vektorista ensin yhtenäinen osa indeksistä 2 indeksiin 4 (siis 2,3 ja 4) ja sen jälkeen indeksistä 2 indeksiin 4 askelen pituudella 2 (siis indeksit 2 ja 4). Osavektori halutusta indeksistä vektorin loppuun saakka saadaan käyttämällä sanaa end lopetusindeksinä.

octave:24> v2(2:end)  
ans =  

   2   7   5   8

Matriiseista halutut rivit ja sarakkeet saa poimittua ilmoittamalla vastaavalla tavalla rivit ja sarakkeet pilkulla eroteltuina. Jos halutaan poimia kaikki rivit tai sarakkeet, ilmoitetaan tämä symbolilla :.

octave:25> M2 = [1 2 3; 4 5 6; 7 8 9; 10 11 12]  
M2 =  

    1    2    3  
    4    5    6  
    7    8    9  
   10   11   12  

octave:26> M2(2:2:4, 2)  
ans =  

    5  
   11  

octave:27> M2(2:2:4,:)  
ans =  

    4    5    6  
   10   11   12  

octave:28> M2(:,1)  
ans =  

    1  
    4  
    7  
   10

Matriisin kaikki alkiot saa lueteltua yhdeksi pystyvektoriksi sarakkeittain komennolla:

octave:29> M2(:)  
ans =  

    1  
    4  
    7  
   10  
    2  
    5  
    8  
   11  
    3  
    6  
    9  
   12

Operaatioita

Matriisien, vektorien ja skalaarien välillä voidaan suorittaa monenlaisia operaatioita.

Skalaarioperaatiot

Skalaarien ja matriisien tai vektorien väliset aritmeettiset operaatiot, tapahtuvat alkiokohtaisesti. Esimerkiksi

octave:30> A=[1 2;3 4]  
A =  

   1   2  
   3   4  
   
octave:31> A + 5  
ans =  

   6   7  
   8   9  

octave:32> A*2  
ans =  

   2   4  
   6   8  

octave:33> A/2  
ans =  

   0.50000   1.00000  
   1.50000   2.00000

Matriisioperaatiot

Matriisien ja/tai vektoreiden välillä voidaan suorittaa normaaleja matriisioperaatioita (yhteen-, vähennys- ja kertolaskut). Näiden lisäksi on olemassa kertolaskuoperaatio .*, joka tarkoittaa alkiokohtaista kertolaskua, sekä sitä vastaava alkiokohtainen jakolasku ./. Näitä operaatioita käytettäessä vektorien tai matriisien tulee olla täsmälleen saman kokoisia.

octave:34> a=[1 2 3]; b=[3 4 5];  
octave:35> a.*b  
ans =  

    3    8   15  

octave:36> B = [2 4; 6 8];  
octave:37> A .* B  
ans =  

    2    8  
   18   32

Funktioiden määrittely

Funktiot esitellään Octavessa sanalla function, jonka jälkeen tulee itse funktion määrittely. Funktiosta kerrotaan paluumuuttuja, funktion, syötemuuttujat sekä itse funktion runko. Esimerkiksi:

function y = myplus(a,b)  
y = a+b;  
endfunction

octave:99> myplus(3,7)  
ans =  10

Tässä funktion nimi on myplus() ja se saa syötteenään kaksi muuttujaa a ja b. Paluumuuttujana on yksi yksittäinen muuttuja. Funktio palauttaa sen arvon, joka funktion rungossa viimeisenä sijoitetaan paluumuuttujan arvoksi. Funktion runko päättyy sanalla endfunction.

Paluumuttujia voi olla myös useampia, jolloin ne esitellään vektorina ja kuhunkin vektorin alkioon sijoitetaan arvo erikseen. Syötemuuttujille voi antaa oletusarvoja, jolloin kyseistä syötettä ei tarvitse välttämättä antaa funktiota kutsuttaessa.

function [a, b] = plustimes(X, y=5)  
a = X+y;  
b = X*y;  
endfunction

octave:102> [a,b]=plustimes([2 5 6])  
a =  

    7   10   11  

b =  

   10   25   30

octave:103> [a,b]=plustimes([2 5 6],2)  
a =  

   4   7   8  

b =  

    4   10   12

Ohjelmointi

Octavessa on käytännössä ohjelmointikieli ja siitä löytyy normaali ohjelmointikielten kontrollirakenne.

Syöte ja tuloste

Ohjelma voi pyytää käyttäjältä syötettä funktiolla input().

octave:298> a = input("Anna luku!")  
Anna luku! 5  
a =  5

Tulostaminen taas tapahtuu funktiolla disp().

octave:299> disp(a)  
 5  
octave:300> disp("Myös tekstiä!")  
Myös tekstiä!

If-lause

Octaven if-rakenteen muoto on:

if ehto1  
  ...  
elseif ehto2  
  ...  
else  
  ...  
endif

Esimerkiksi:

octave:301> function y = vertaa(numero)  
> if numero > 0  
> disp("Positiivinen")  
> elseif numero < 0  
> disp("Negatiivinen")  
> else  
> disp("Nolla")  
> endif  
> endfunction  
octave:302> vertaa(6)  
Positiivinen  
octave:303> vertaa(-3)  
Negatiivinen  
octave:304> vertaa(0)  
Nolla

For-silmukka

Octaven for-silmukassa ideana on, että silmukkamuuttujan arvo käy läpi annetun vektorin kaikkien alkioiden arvot ja silmukan vartalo suoritetaan kullakin arvolla. Silmukan vartalo lopetetaan sanalla endfor Esimerkiksi:

octave:305> v = [1 2 3 4]  
octave:306> for i = v  
> disp(2*i)  
> endfor  
 2  
 4  
 6  
 8

Läpikäytävät arvot voidaan antaa myös jo aiemmin tutuksi tulleella lukujonojen muodostamiseen tarkoitetulla syntaksilla.

octave:307> for i = 4:2:10  
> disp(i)  
> endfor  
 4  
 6  
 8  
 10

While-silmukka

While silmukkaa suoritetaan niin kauan kuin silmukan ehto on voimassa. While-silmukan vartalo lopetetaan sanalla endwhile.

octave:308> a=1;  
octave:309> while a < 10  
> disp(a)  
> a=a+1;  
> endwhile  
 1  
 2  
 3  
 4  
 5  
 6  
 7  
 8  
 9

While-silmukkaa käytettäessä on tärkeää aina varmistaa, että silmukan ehto varmasti lakkaa olemasta jossain vaiheessa, ettei päädytää ikuiseen silmukkaan.

Do…until-silmukka

While-silmukassa silmukkaehto tarkistetaan ennen vartalon suorittamista ja siksi vartaloa ei välttämättä suoriteta kertaakaan. Joskus on oleellista, että vartalo tulisi suoritettua ainakin kerran ja vasta sen jälkeen tarkistettaisiin, pitääkö silmukkaa toistaa. Tällaisia tilanteita varten Octavessa on do...until-silmukkarakenne. Silmukka alkaa sanalla do, jonka jälkeen tulee silmukan vartalo. Silmukka päättyy sanalla until sekä ehdolla, joka kertoo, mihin asti silmukkaa toteutetaan. Silmukkaa suoritetaan kirjaimellisesti kunnes ehto toteutuu. Tämänkin silmukkatyypin kanssa tulee olla varovainen ja varmistaa, että sen suoritus lopulta päättyy.

octave:310> do  
> a=input("Anna nolla! ");  
> until a == 0  
Anna nolla! 4  
Anna nolla! 6  
Anna nolla! 2  
Anna nolla! 0  
octave:311>

Ohjelmien suorittaminen tiedostosta

Octave-komentoja ja -ohjelmia voi kirjoittaa tekstitiedostoon ja käskeä Octaven suorittaa ne. Ensin pitää siirtyä chdir()-funktiolla hakemistoon, johon tiedosto on tallennettu ja tämän jälkeen tiedosto voidaan suorittaa ihan vain kirjoittamalla tiedoston nimi:

octave:400> chdir("octave/skriptit")  
octave:401> myscript.m;  

Linux- tai Unix-alustoilla Octave-ohjelmia voidaan suorittaa myös suoraan komentoriviltä kirjoittamalla tiedoston alkuun ensimmäiseksi riviksi:

#!/usr/bin/octave -qf

Tämän lisäksi tiedostolle pitää asettaa ajo-oikeudet Linuxin komentoriviltä komennolla

chmod u+x tiedostonimi

Nyt tiedoston suoritus onnistuu komentoriviltä komennolla:

./tiedostonimi

Kuvaajien piirtäminen

Octave käyttää kuvaajien piirtämiseen gnuplot:ia, joten siksi käytettävissä olevat muotoiluparametrit ovat pitkälti siitä riippuvaisia.

Ehkä helpoin tapa piirtää kuvaaja, on muodostaa erilliset vektorit x- ja y-arvoista ja plotata ne plot()-funktiolla.

octave:199> x=[1 2 3 4 5 6 7]; y=[2 7 4.3 6 9.2 5 5.3];  
octave:200> plot(x, y)

Useamman kuvaajan saa samaan kuvaan luettelemalla vuorotellen x- ja y-vektoreita. Luodaan kaksi uutta vektoria. Ensimmäisessä (x2) ovat luvut nollasta kymmeneen 0.2:n välein ja toisessa näiden sinit.

octave:201> x2 = [0:0.2:10]; y2 = sin(x2);

Piirretään nämä samaan kuvaajaan edellisen tulostuksen kanssa.

octave:202> plot(x,y,x2,y2)

Käytettävän x-vektorin voi tuottaa myös linspace(alku, raja, määrä)-funktiolla, joka tuottaa parametrin määrä osoittaman määrän tasavälin olevia pisteitä, arvosta alku arvoon raja saakka. (alku ja raja mukaan luettuina) Jos määrä-parametria ei anneta, käytetään oletuksena lukua 100.

octave:203> x=linspace(0, 2*pi, 100); y=sin(x);

3D-kuvaajat

3D-kuvaajia piirrettäessä täytyy muistaa, että laskettavan funktion arvo z pitää laskea kaikilla x- ja y-vektorien arvojen yhdistelmillä. Tähän on käytettävissä avuksi funktio meshgrid(x,y), joka tuottaa kaksi matriisia, joiden alkioiden pareina saadaan kaikki tarvittavat pisteparit aikaiseksi. Itse kuvaaja piirretään mesh(x,y,z)-funktiolla.

octave:204> x = -2:0.1:2;  
octave:205> [xx,yy] = meshgrid(x,x);  
octave:206> z = sin(xx.^2-yy.^2);  
octave:207> mesh(x,x,z);

Muita funktioita, joilla voi piirtää 3D-kuvaajia, ovat surf(), contour() ja näiden yhdistelmä surfc().

octave:208> xx=-2:.1:2; yy=xx;  
octave:209> [x,y]=meshgrid(xx,yy);  
octave:210> size(x)  

ans =  

    41    41  

octave:211> z=exp(-x.^2-y.^2);  
octave:212> surf(x,y,z)

Komennolla grid kuvaan voi lisätä vielä ruudukon.

octave:213> grid

Siinä, missä mesh()-funktio piirtää kuvion vain viivoilla, surf() värittää myös viivojen väliset pinnat.

Kuviin voidaan lisätä otsikoita itse kuvalle sekä akseleille funktioilla title(), xlabel(), ylabel() ja zlabel().

octave:214> title('Otsikko'); xlabel('x-akseli'); ylabel('y-akseli'); zlabel('z-akseli');

3D-kuvaajan katselukulmaa voidaan muuttaa view(kulma1, kulma2)-funktiolla, jossa kulma1 kuvaa katselukulmaa xy-tasossa (azimuth) ja kulma2 katselukulman korkeutta xy-tasoon nähden (elevation). Kulmat ovat asteina ja jälkimmäinen rajoittuu välille [-90, 90].

octave:215> view(30,50)

Kuvat tiedostoiksi

Viimeisimmän näytölle piirretyn kuvan tallentaminen tiedostoon tapahtuu funktiolla print(), jolle annetaan parametreina tiedoston nimi sekä muita optioita, joihin kuuluu ainakin tallennuksessa käytettävä tiedostomuoto.

octave:216> print("3d-kuva.eps", "-depsc2")

Optiot annetaan merkkijonona, jossa “-d”:llä merkitty optio kertoo tulostuslaitteen, eli tässä tapauksessa tiedoston tyypin. Erilaisia vaihtoehtoja tiedostojen tyypeiksi ovat ainakin:

        'ps'  
        'ps2'  
        'psc'  
        'psc2'  
              Postscript (level 1 ja 2, mustavalko ja värillinen)  

        'eps'  
        'eps2'  
        'epsc'  
        'epsc2'  
              Encapsulated postscript (level 1 ja 2, mustavalko ja värillinen)  

        'ill'  
        'aifm'  
              Adobe Illustrator  

        'cdr'  
        'corel'  
              CorelDraw  

        'fig'  
              XFig  

        'dxf'  
              AutoCAD  

        'png'  
              Portable network graphics  

        'svg'  
              Scalable Vector Graphics

Lisää tiedostomuotoja ja muita optioita löytyy komennolla

octave:217> help print

Lisäpaketit

Octaveen on saatavilla lukuisia lisäpaketteja, jotka eivät ole Octaven oletusasennuksen mukana. Monet yleisimmin käytetyistä paketeista tulevat Linux-järjestelmien paketinhallinnassa omina erillisinä paketteinaan, mutta osan taas joutuu lataamaan erikseen Octaven lisäpakettivarastosta.

Lisäpaketti asennetaan seuraavasti. Ensin pakettitiedosto (esimerkiksi combinatorics-1.0.9.tar.gz) ladataan käytettävälle koneelle johonkin tiedostoon. Sitten octavessa siirrytään kyseiseen hakemistoon chdir()-funktiolla ja suoritetaan asennuskomento.

octave:204> chdir ("~/lataus/hakemisto")  
octave:205> pkg install combinatorics-1.0.9.tar.gz

Tämän jälkeen paketin tuomat funktiot, vakiot ym. ominaisuudet ovat käytettävissä. Combinatorics-paketti tuo esimerkiksi combs()-funktion, jolla voidaan tuottaa kaikki n-alkion kombinaatiot annetusta vektorista v komennolla combs(v,n).

octave:206> combs([1,2,3,4], 2)  
ans =  

   1   2  
   1   3  
   1   4  
   2   3  
   2   4  
   3   4

Asennettu paketti on automaattisesti käytettävissä uudessa istunnossa. Tarpeettoman paketin voi halutessaan ottaa pois käytöstä komennolla pkg unload paketti. Esimerkiksi:

octave:207> pkg unload combinatorics

ja ladata taas takaisin käyttöön komennolla pkg load paketti

octave:208> pkg load combinatorics

Listan käytettävissä olevista paketeista näkee komennolla:

octave:209> pkg list  
Package Name   | Version | Installation directory  
---------------+---------+-----------------------  
combinatorics *|   1.0.9 | /home/pesasa/octave/combinatorics-1.0.9

Listassa on käytössä olevat paketit merkitty *-merkillä.

Tarpeettoman paketin voi poistaa kokonaan käytöstä pkg uninstall -komennolla:

octave:210> pkg uninstall combinatorics

Kannattaa myös huomioida, että tavallisen käyttäjän asentamat lisäpaketit ovat näkyvissä vain hänellä itsellään, ei muilla saman koneen käyttäjillä.