Καλωσορίσατε στην GNU/Octave!

Το wiki αυτό είναι μια εισαγωγή στην γλώσσα υψηλού επιπέδου GNU/Octave, μια ελεύθερη γλώσσα προγραμματισμού εναλλακτική της Matlab. Για πιο σοβαρή ενασχόληση με την γλώσσα είναι καλύτερο κάποιος να διαβάσει το εγχειρίδιο αναφοράς της GNU/Octave

Ιστορία

Στο δεύτερο μισό της δεκαετίας του 1970 αναπτύχθηκαν σε ForTran βιβλιοθήκες ρουτινών για την επίλυση προβλημάτων αριθμητικής ανάλυσης. Οι βιβλιοθήκες αυτές LINPACK και EISPACK περιέχονται σήμερα στην συλλογή netlib.org ενώ, τώρα πια, έχουν αντικατασταθεί από άλλες. Ένας από τους συντάκτες αυτών των βιβλιοθηκών ο Cleve Moler καθώς και οι Little and Steve Bangert, οι οποίοι μετέγραψαν τις παραπάνω βιβλιοθήκες σε C ίδρυσαν την εταιρία Mathworks το 1984 και ξεκίνησαν την ανάπτυξη και εκμετάλλευση της Matlab. H Octave πρωτοαναπτύχθηκε το 1988 στο πλαίσιο προπτυχιακού μαθήματος στο Παν. του Τέξας. Η κανονική της ανάπτυξη ξεκίνησε το 1992 ενώ το 1994 είχαμε την πρώτη έκδοση 1.0. Έκτοτε αναπτύσσεται αδιάλειπτα ως ελεύθερο λογισμικό με την άδεια GNU General Public License. Σήμερα είναι πλήρως συμβατή με την matlab ενώ εμπλουτίζεται διαρκώς με πληθώρα ελεύθερων πρόσθετων βιβλιοθηκών.

Ξεκινάμε; Εγκατάσταση

Για να χρησιμοποιήσει κάποιος την γλώσσα GNU/Octave θα πρέπει πρώτα να την εγκαταστήσει στον υπολογιστή του. Εδώ υπάρχει ένα wiki για την εγκατάσταση της octave και τις πρώτες πληροφορίες για κάθε σύστημα. Εμείς εδώ θα ξεκινήσουμε με την χρήση και τον προγραμματισμό σε octave. Εκτελείται με την εντολή octave και αφού μας ενημερώσει για την έκδοση και την άδεια χρήσης περιμένει τις εντολές μας:

  
  [chiossif@anacoda ~]$ octave
  GNU Octave, version 3.8.0
  Copyright (C) 2013 John W. Eaton and others.
  This is free software; see the source code for copying conditions.
  There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
  FITNESS FOR A PARTICULAR PURPOSE.  For details, type 'warranty'.
  
  Octave was configured for "x86_64-unknown-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/get-involved.html
  
  Read http://www.octave.org/bugs.html to learn how to submit bug reports.
  For information about changes from previous versions, type 'news'.
  
  octave:1>

Χρήση της octave ως αριθμομηχανής

Γράψτε:

  octave:1> 2+3
  ans =  5

Η απάντηση είναι 5. Σωστά; :-) Οι πράξεις που υποστηρίζονται είναι + για την πρόσθεση, - για την αφαίρεση, * για τον πολλαπλασιασμό, / για την διαίρεση και ^ για την ύψωση σε δύναμη. Μπορείτε να βάζετε παρενθέσεις και φυσικά ισχύει η προτεραιότητα των πράξεων όπως την ξέρουμε :-) Αντέχει... μην την φοβάστε. Όλα τα υπολογίζει:

  octave:2> 32411 * 32413
  ans =    1.0505e+09
  octave:3> format long
  octave:4> 32411 * 32413
  ans =  1050537743
  octave:5> format short
  octave:6> 32411 * 32413
  ans =    1.0505e+09

Όπως βλέπετε με την εντολή format ρυθμίζουμε το πλήθος των σημαντικών ψηφίων τα οποία θα εμφανίζονται ως απάντηση. Η επιλογή long καλύπτει κάθε ανάγκη και δεν επιδέχεται βελτίωση.

Περιβάλλον χρήσης

Μέχρι εδώ έχουμε δει να δίνει απλές απαντήσεις. Τι γίνεται όμως αν θέλουμε πιο σύνθετες πράξεις/συναρτήσεις; Υποστηρίζονται όλες οι συναρτήσεις: από τις πιο απλές όπως sin cos log ln έως και εξαιρετικά σύνθετες:

  cos        Συνημίτονο
  sin        Ημίτονο
  tan        Εφαπτομένη
  exp        Εκθετική e^x
  log        Λογάριθμος
  log10      Λογάριθμος με βάση 10
  sinh       Υπερβολικό ημίτονο
  cosh       Υπερβολικό συνημίτονο
  tanh       Υπερβολική εφαπτομένη
  acos       τόξο συνημιτόνου
  acosh      τόξο υπερβολικού συνημιτόνου
  asin       τόξο ημιτόνου
  asinh      τόξο υπερβολικού ημιτόνου
  atan       τόξο εφαπτομένης
  atan2      τόξο εφαπτομένης με δύο ορίσματα x/y
  atanh      τόξο υπερβολικής εφαπτομένης
  abs        απόλυτη τιμή
  sign       πρόσημο
  round      στρογγυλοποίηση στον πλησιέστερο ακέραιο
  floor      στρογγυλοποίηση προς τα κάτω
  ceil       στρογγυλοποίηση προς τα πάνω
  fix        στρογγυλοποίηση προς το μηδέν
  rem        υπόλοιπο ακέραιας διαίρεσης

Οι τριγωνομετρικές συναρτήσεις είναι σε ακτίνια. Υποστηρίζονται σταθερές όπως τα pi,e, i ή j κ.α. Έχουμε σταθερές και δεν θα έχουμε μεταβλητές;

  octave:7> rad2grad=200/pi;
  octave:8> atan(1)*rad2grad
  ans =  50

Όπως βλέπετε η μεταβλητή ans είναι αυτόματη απάντηση/αποτέλεσμα της τελευταίας ενέργειας. Αν χρησιμοποιήσω ; στο τέλος μιας γραμμής δεν την εμφανίζει. Ο τύπος όλων των μεταβλητών είναι πραγματικοί αριθμοί ενώ υποστηρίζονται και μιγαδικοί:

  octave:9> a=2+3i;
  octave:10> b=1-2j;
  octave:11> c=a*b
  c =  8 - 1i

Για τις συναρτήσεις σε μιγαδικούς αριθμούς δείτε περισσότερα εδώ

Πίνακες και διανύσματα

Η octave υποστηρίζει πίνακες και διανύσματα. Δείτε ένα παράδειγμα:

  octave:12> A=[1 2; 3 4];
  octave:13> B=[2 1; 4 3];
  octave:14> C=A+B
  C =
     3   3
     7   7
  octave:15> D=A*B
  D =
     10    7
     22   15
  octave:16> E=A.*B
  E =
      2    2
     12   12

Υποστηρίζονται οι πράξεις +,-,* ως πολλαπλασιασμός πινάκων, ανάλογα η ύψωση σε δύναμη ^, ο ανάστροφος ' και .* ως βαθμωτός πολλαπλασιασμός, / και ./ αντίστοιχα και \ και .\ ως αριστερή διαίρεση:

  octave:17> F=A.\B
  F =
     2.00000   0.50000
     1.33333   0.75000
  octave:18> G=A\B
  G =
     0   1
     1   0

Ο πολλαπλασιασμός πινάκων δεν είναι αντιμεταθετικός. Έτσι διαίρεση γίνεται με πολλαπλασιασμό με τον αντίστροφο είτε από δεξιά ( Α/Β == Α*Β^(-1) ) είτε από αριστερά (Α\Β == Β^(-1)*Α). Προσοχή στο .\ ;-) Αν έχω ένα σύστημα Α*Χ=Β μπορώ να πάρω αμέσως την λύση. Δείτε πως:

  octave:19> A
  A =
     1   2
     3   4
  octave:20> B=[17 ;39]
  B =
     17
     39
  octave:21> X=A\B
  X =
     5.0000
     6.0000

Τέλος υπάρχουν και οι ειδικοί πίνακες όπως οι eye, ones, zeros:

  octave:22> eye(3)
  ans =
  Diagonal Matrix
     1   0   0
     0   1   0
     0   0   1
  octave:23> ones(2,2)
  ans =
     1   1
     1   1
  octave:24> zeros(12)
  ans =
     0   0   0   0   0   0   0   0   0   0   0   0
     0   0   0   0   0   0   0   0   0   0   0   0
     0   0   0   0   0   0   0   0   0   0   0   0
     0   0   0   0   0   0   0   0   0   0   0   0
     0   0   0   0   0   0   0   0   0   0   0   0
     0   0   0   0   0   0   0   0   0   0   0   0
     0   0   0   0   0   0   0   0   0   0   0   0
     0   0   0   0   0   0   0   0   0   0   0   0
     0   0   0   0   0   0   0   0   0   0   0   0
     0   0   0   0   0   0   0   0   0   0   0   0
     0   0   0   0   0   0   0   0   0   0   0   0
     0   0   0   0   0   0   0   0   0   0   0   0
  octave:25> zeros(1,2)
  ans =
     0   0
  octave:26> zeros(3,1)
  ans =
     0
     0
     0

Πριν φύγουμε από τους πίνακες θα πρέπει να δούμε τον ειδικό χαρακτήρα : με τον οποίο ορίζουμε εύρη τιμών. Έτσι μπορούμε, όταν θέλουμε, να επιλέξουμε μια συγκεκριμένη γραμμή ή στήλη από ένα διάνυσμα ή τμήμα ενός πίνακα. Παραδείγματα:

 octave:27> A
  A =
     1   2
     3   4
 octave:28> A(1, :)
  ans =
     1  2

για την πρώτη γραμμή και

 octave:29> A(:, 1)
  ans =
     1
     3

για την πρώτη στήλη. Τι σημαίνει όμως το εύρος τιμών; Το εύρος ορίζεται ως αρχή:βήμα:τέλος έτσι:

  octave:30> 1:3:10
  ans =
     1   4   7  10

Σε περίπτωση που το βήμα είναι 1, μπορεί να παραληφθεί:

   octave:31> 1:10
   ans =
      1   2   3   4   5   6   7   8   9  10

Μια σημαντική λέξη κλειδί που μπορεί να χρησιμοποιηθεί είναι το end. Σε περίπτωση λοιπόν που θέλουμε να επιλέξουμε μια γραμμή ή μια στήλη ενός πίνακα από την αρχή μέχρι το τέλος μπορούμε να γράψουμε:

   octave:32> Α(1:end, 1)
   ans =
      1
      3

Έστω λοιπόν πως ορίζουμε έναν πίνακα δύο διαστάσεων:

    octave:33> A = [16  2  3  13; 5  11  10  8; 9  7  6  12; 4  14 15 1]
     A =
           16           2           3          13
            5          11          10           8 
            9           7           6          12  
            4          14          15           1 

Μπορώ να εξάγω με τον χαρακτήρα : τις γραμμές ως εξής:

    octave:34> A(2:4,1:2)
    ans =
              5          11
              9           7
              4          14

Επίσης μπορώ να εξάγω τα στοιχεία της τελευταίας στήλης ως εξής:

    octave:35>  A(:,end) 
    ans =
             13
              8
             12
              1

Με το εύρος τιμών είδαμε πως μπορούμε να κόβουμε έναν πίνακα σαν σπανακόπιτα. ;-) Πως μπορούμε όμως να τον ξανασυνδέσουμε; Στο ακόλουθο παράδειγμα βλέπουμε πως σχηματίζεται ένας νέος πίνακας από άλλους:

  octave:36> A=[1 2;3 4];
  octave:37> B=[5 6;7 8];
  octave:38> C=zeros(2);
  octave:39> D=eye(2);
  octave:40> E=[ A B; C D]
  E =
     1   2   5   6
     3   4   7   8
     0   0   1   0
     0   0   0   1

Εντολές ελέγχου

Μπορούμε να ελέγχουμε την ροή εκτέλεσης εντολών στην octave; Φυσικά και μπορούμε. Αρκεί να ξέρουμε κατ’αρχήν τους λογικούς τελεστές :

Σύμβολο        Σημασία              Παράδειγμα
  ==             ίσο                 if x == y
  ~=           όχι ίσο               if x ~= y
   >        μεγαλύτερο από           if x > y
  >=     μεγαλύτερο ή ίσο από        if x >= y
  <         μικρότερο από            if x < y
  <=      μικρότερο ή ίσο από        if x <= y
  &&             ΚΑΙ                 if x == 1 & y > 2
  ||              Ή                  if x == 1 | y > 2
  ~              ΌΧΙ                    x = ~y

Εδώ θα βρείτε όλους τους τελεστές της octave και την προτεραιότητά τους.

Εντολή ελέγχου if

Η εντολή ελέγχου ροής είναι η if και η γενική μορφή της είναι η παρακάτω:

  if συνθήκη1
      ΟΜΑΔΑ Α   ...
  elseif συνθήκη2
      ΟΜΑΔΑ Β
  else
      ΟΜΑΔΑ Ω
  end

Εάν η συνθήκη1 είναι αληθής, τότε εκτελείται η ομάδα εντολών Α και το πρόγραμμα συνεχίζει μετά την end. Εάν η συνθήκη1 είναι ψευδής, η επόμενη συνθήκη (συνθήκη2 στο elseif) ελέγχεται και η ομάδα εντολών Β εκτελείται άμα είναι αληθής. Μπορεί να υπάρχουν όσες συνθήκες elseif χρειάζονται ανά περίπτωση. Η τελική ομάδα εντολών, μετά το else, εκτελείται στην περίπτωση που όλες οι συνθήκες είναι ψευδείς. Οι εντολές elseif και else είναι προαιρετικές ενώ μετά την ολοκλήρωση κάθε ομάδας εντολών η εκτέλεση συνεχίζεται μετά το end. ΠΡΟΣΟΧΉ: Είναι αδύνατη η εκτέλεση περισσοτέρων από μία ομάδων εντολών διότι αν μία συνθήκη προκύψει ΑΛΗΘΉΣ εκτελούνται οι εντολές της ομάδας της και δεν εξετάζεται άλλη μέχρι την ολοκλήρωση της εντολής.

  octave:1> a=1;
  octave:2> b=2;
  octave:3> if a>b
  > c=3
  > else
  > c=4
  > end
  c =  4

Προσέξτε τον χαρακτήρα > στο παραπάνω παράδειγμα. Τον συναντάμε όταν μία εντολή καταλαμβάνει περισσότερες από μία γραμμές και μέχρι την ολοκλήρωσή της.

Εντολή ελέγχου switch

Σε περίπτωση που σε ένα πρόγραμμα χρειάζονται πολλές if/elseif εντολές προκειμένου να επιλεγεί το αποτέλεσμα μέσα από μια ποικιλία διαφορετικών εντολών, είναι καλύτερα να χρησιμοποιηθεί η εντολή switch. Η εντολή ακολουθεί το παρακάτω πρότυπο:

switch x
  case x1,
     ....
  case x2,
     ....
  otherwise,
     ....
end

Στην εντολή switch, η τιμή του x συγκρίνεται με κάθε μια από την λίστα με τα case, και αν βρεί μια ίση με αυτή τότε εκτελεί την αντίστοιχη ομάδα εντολών. Σε περίπτωση που κανένα case δεν είναι αληθές, εκτελείται η ομάδα εντολών που βρίσκεται μέσα στο otherwise, αν αυτό υπάρχει. Ακολουθεί ένα παράδειγμα εφαρμογής της εντολής:

  octave:10> a=1;
  octave:11> switch a
  > case 0
  > disp("a is zero");
  > case 1
  > disp("a is one");
  > otherwise
  > disp("a is unknown");
  > end
  a is one

Η συνάρτηση disp εμφανίζει την τιμή ενός αριθμού ή μια παράσταση χαρακτήρων. Στο συγκεκριμένο παράδειγμα χρησιμοποιείται για να εκτυπώσει στην οθόνη μια σειρά από χαρακτήρες. Μπορεί όμως να χρησιμοποιηθεί και με μεταβλητές. πχ. disp(a) θα εκτυπώσει την τιμή του a.

Εντολές επανάληψης

Εντολή επανάληψης for

Στον προγραμματισμό είναι πολύ συνήθης η χρήση της εντολής επανάληψης for, η οποία επαναλαμβάνει μια ομάδα εντολών για προκαθορισμένες τιμές και με ένα προκαθορισμένο βήμα. Στην γλώσσα octave η χρήση του πρέπει να αποφεύγεται. Προσπαθήσετε να χρησιμοποιήσετε τις πράξεις με διανύματα, εύρη τιμών και συναρτήσεις αντί για αυτή την εντολή διότι είναι περίπου σαράντα φορές πιο αργή. Παρόλα αυτά υπάρχουν σπάνιες περιπτώσεις που η χρήση του for δεν μπορεί να αποφευχθεί. Η σύνταξη του είναι η ακόλουθη:

  for variable = vector
      statements
  end

όπου το vector (διάνυσμα) περιλαμβάνει και τον αριθμό του βήματος. Ακολουθεί ένα παράδειγμα:

  octave:12>  for n=1:5
  > nf(n) = factorial(n);
  > end
  octave:13> nf
  nf =
       1     2     6    24   120

όπου σχηματίζεται ένας νέος πίνακας με τα παραγοντικά των αριθμών 1 έως 5. Αυτό το παράδειγμα έγινε μόνο για την επίδειξη της εντολής και είναι ατυχές όπως το 99% των περιπτώσεων χρήσης της for, αφού μπορούμε να έχουμε το ίδιο αποτέλεσμα έτσι:

  octave:14> n=1:5
  n =
     1   2   3   4   5
  octave:15> nf=factorial(n)
  nf =
       1     2     6    24   120

ΠΡΟΣΟΧΗ: Πριν χρησιμοποιήσετε μία εντολή for βεβαιωθείτε ότι δεν μπορείτε να κάνετε την δουλειά σας με πιο εύκολο και σύντομο τρόπο. Στην αρχή είναι λίγο δύσκολο, ειδικά για όσους είναι προγραμματιστές σε παλαιότερες γλώσσες προγραμματισμού όπως Fortran, Pascal, Basic ή C/C++ αλλά ας μην ξεχνάμε πως δεν έχουμε λόγο να γράφουμε κώδικα στην octave αν δεν χρησιμοποιούμε την δύναμή της.

Εντολή επανάληψης while

Σε περίπτωση που δεν ξέρουμε ακριβώς πόσες επαναλήψεις μπορεί να χρειαστούμε και απλά χρειαζόμαστε μια επαναληπτική διαδικασία μέχρι να εκπληρωθεί μια συνθήκη, η octave μας παρέχει την επαναληπτική εντολή while:

  while expression
      statements
  end

Παράδειγμα:

  octave:16> x=1;
  octave:17> while 1+x>1
  > x=x/2;
  > end
  octave:18> format long
  octave:19> x
  x =  1.11022302462516e-16

Ας θυμηθούμε εδώ ότι παρότι στον Η/Υ μπορούμε να αποθηκεύουμε πολύ μικρότερους αριθμούς από το 1e-16 η ακρίβεια των υπολογισμών δεν είναι αντίστοιχη. Όπως σε κάθε αναπαράσταση αριθμού κινητής υποδιαστολής η ακρίβεια υπολογισμών είναι ανάλογη με το μέγεθος της μάντισσας (πλήθος σημαντικών ψηφίων) και πάντα πεπερασμένη.

Και μια και θυμηθήκαμε αυτό ας θυμηθούμε και το άλλο: για τον ίδιο λόγο αποφεύγουμε τον έλεγχο ισότητας πραγματικών αριθμών. Αντί για το: a==b επιλέγουμε το abs(a-b)<eps. Ποια είναι η τιμή eps;

  octave:20> eps
  ans =  2.22044604925031e-16

Μόλις ένα bit μεγαλύτερος από το x στο παραπάνω παράδειγμα ;-)

Συναρτήσεις

Ε, αν δεν έχει η octave συναρτήσεις τότε ποιος έχει; Κι είναι τόσο απλές που με ένα παράδειγμα θα γίνουν πλήρως κατανοητές. Ας ξεκινήσουμε: έχουμε την συνάρτηση fifi(x) = 2*x για x θετικό και 3*x για κάθε άλλη περίπτωση. Να πως γράφεται:

  octave:1> function y=fifi(x)
  > if x>0
  > y=2*x
  > else
  > y=3*x
  > endif
  > endfunction
  octave:2> fifi(2)
  y =  4
  ans =  4
  octave:3> fifi(-2)
  y = -6
  ans = -6

Ας τα δούμε αναλυτικά:

Οι εντολές function και endfunction ορίζουν την αρχή και το τέλος της συνάρτησης. Η συνάρτηση έχει όνομα fifi ενώ x και y είναι οι τοπικές της μεταβλητές για να δείξουμε τι θέλουμε να κάνουμε. Στο παράδειγμά μας με y είναι η μεταβλητή που επιστρέφεται η τιμή αποτέλεσμα (αν υπάρχει) ενώ με x δίνεται η τιμή ορισμού (μπορεί να είναι περισσότερες από μία). Το σώμα της συνάρτησης ακολουθεί με χρήση των παραπάνω μεταβλητών και όποιων άλλων θέλουμε και όσο πολύπλοκο θέλουμε.

Η δύναμη της octave φαίνεται αν συνεχίσουμε το παράδειγμα:

  octave:4> a=[1 -2; 3 -4];
  octave:5> b=fifi(a);
  y =
      3   -6
      9  -12
  
  octave:6> b
  b =
  
      3   -6
      9  -12

Τι να πω; Τα πάντα όλα κάνει η octave. Και ας μην ξεχνάμε το τεράστιο πλήθος συναρτήσεων (μια ιδέα πήραμε νωρίτερα) οι οποίες είναι ήδη γραμμένες ;-)

Καλά όλα αυτά αλλά θα πρέπει κάθε φορά να φτιάχνω την συνάρτηση και να την γράφω; Δεν μπορεί... κάπως θα γίνεται... Φτιάχνουμε ένα αρχείο με το όνομα fifi.m, περιεχόμενα την συνάρτησή μας όπως πριν:

  function y=fifi(x)
      if x>0
          y=2*x;
      else
          y=3*x;
      endif
  endfunction

και το αποθηκεύουμε στον φάκελο εργασίας μας. (Σημείωση: η στοίχιση είναι προαιρετική και εδώ έγινε γιατί έτσι με έμαθαν να κάνω οι δάσκαλοί μου καλή τους ώρα ;-) )

Τώρα ανοίγουμε τo περιβάλλον και:

  octave:1> a=[1 -2; 3 -4];
  octave:2> b=fifi(a);
  octave:3> b
  b =
      3   -6
      9  -12

Καλό, έτσι; Προσοχή λοιπόν στο όνομα της συνάρτησης και του αρχείου. Και μετά κάνουμε ότι θέλουμε :-)

Ομαδική εκτέλεση εντολών

Ομαδική εκτέλεση εντολών είδαμε με μορφή συνάρτησης σε αρχείο m. Εδώ επιπλέον θα δούμε ότι μπορούμε να αποθηκεύουμε πίνακες (γενικά κάθε μεταβλητή) σε αρχεία τύπου mat και φυσικά να εκτελούμε αρχεία συναρτήσεων / ομαδικών εντολών τύπου m. Εδώ:

  octave:1> A=[ 1 1; 2 1;3 1; 4 1];
  octave:2> B=[ 6;5;7;10];
  octave:3> save pinAB.mat A B

αποθηκεύσαμε στο αρχείο pinAB.mat τους πίνακες A και B.

Το αρχείο αυτό έχει περιεχόμενα:

  [chiossif@home-6400 ~]$ cat pinAB.mat 
  # Created by Octave 3.6.4, Sun Jan 26 13:42:21 2014 EET <chiossif@home-6400>
  # name: A
  # type: matrix
  # rows: 4
  # columns: 2
   1 1
   2 1
   3 1
   4 1
  
  
  # name: B
  # type: matrix
  # rows: 4
  # columns: 1
   6
   5
   7
   10

(Η εντολή cat είναι εντολή στο τερματικό bash του Archlinux το οποίο χρησιμοποιώ και για αυτό το wiki :-) Προφανώς είμαι εκτός octave)

και μετά μπορούμε με την load:

  octave:1> load pinAB.mat 
  octave:2> X=A\B
  X =
  
     1.4000
     3.5000
  octave:3> s=sqrt(sum((A*X-B).^2)/(rows(A)-columns(A)))
  s =  1.4491

δεν ξέρω αν το καταλάβατε αλλά μόλις λύσαμε ένα σύστημα με ΜΕΤ και υπολογίσαμε και σίγμα ;-) Αν μάλιστα φτιάξουμε ένα αρχείο MET.m με περιεχόμενα:

  load pinAB.mat
  X=A\B
  s=sqrt(sum((A*X-B).^2)/(rows(A)-columns(A)))

στον φάκελο εργασίας μαζί με το pinAB.mat που είδαμε μόλις πριν, τότε αρκεί μία εντολή:

  octave:1> MET
  X =
  
     1.4000
     3.5000
  
  s =  1.4491

για να γίνουν όλα :-)

Βιβλιοθήκη επεξεργασίας εικόνας

Ναι... υπάρχει και είναι εδώ. Εγκαταστήστε την για να μπορείτε να την χρησιμοποιήσετε. Κατ’αρχήν και πάντα παραδοσιακά κατεβάζουμε στον υπολογιστή μας την Λέννα. ( Με την ευκαιρία εδώ ολόκληρη η Λέννα για περισσότερες δοκιμές και εδώ η ιστορία της ;-) )

Ξεκινάμε...

Στην octave όλες οι εικόνες αναπαριστώνται ως πίνακες ακεραίων ή πραγματικών αριθμών δύο ή τριών διαστάσεων. Εάν η εικόνα μας είναι RGB (ή με άλλα περισσότερα του ενός κανάλια) τότε έχουμε έναν πίνακα τριών διαστάσεων: γραμμέςxστήλεςxκανάλια όπου κανάλια=3 για την περίπτωση RGB. Εάν η εικόνα μας είναι ασπρόμαυρη (bitmap δηλαδή μόνο άσπρο=1 και μαύρο=0) ή τόνων του γκρίζου (greyscale δηλαδή όλα τα γκρίζα από 0 μαύρο έως 255 άσπρο για εικόνα 8 μπιτ) τότε έχει δύο διαστάσεις: γραμμέςxστήλες. Ας ξεκινήσουμε με την Λέννα αποθηκεύοντάς την στον χώρο εργασίας μας και ας δούμε τις κυριότερες εντολές:

  octave:1> Lenna_RGB=imread('Lenna.png');
  warning: your version of GraphicsMagick limits images to 16 bits per pixel
  octave:2> Lenna_R=Lenna_RGB(:,:,1);
  octave:3> Lenna_G=Lenna_RGB(:,:,2);
  octave:4> Lenna_B=Lenna_RGB(:,:,3);
  octave:5> imshow(Lenna_RGB);
  radeon: Acquired access to Hyper-Z.

Στην εντολή 1 διαβάσαμε με την imread την Λέννα ως ένα πίνακα τριών διστάσεων διότι είναι έγχρωμη εικόνα RGB. Στην συνέχεια αποκόψαμε κάθε κανάλι σε χωριστούς πίνακες: έναν για το κόκκινο R, έναν για το πράσινο G και έναν για το μπλε B. Στην συνέχεια με την εντολή imshow εμφανίσαμε την εικόνα της Λέννας σε παράθυρο απεικόνισης με τίτλο Figure 1. (Μερικές φορές εμφανίζονται ενημερωτικά μηνύματα για την χρήση του υλικού όπως εδώ για τα γραφικά, ή άλλες προειδοποιήσεις όπως ίσως δούμε παρακάτω.)

Για να κάνουμε χρήση της βιβλιοθήκης octave-image θα πρέπει να τη ενεργοποιήσουμε στο περιβάλλον μας με την εντολή pkg:

  octave:6> pkg load image
  warning: function /usr/share/octave/packages/specfun-1.1.0/ellipke.m shadows a core library function
  warning: function /usr/share/octave/packages/specfun-1.1.0/expint.m shadows a core library function
  warning: function /usr/share/octave/packages/specfun-1.1.0/erfcinv.m shadows a built-in function

Οι ειδοποιήσεις αυτές μας ενημερώνουν ότι στην βιβλιοθήκη που μόλις ενεργοποιήσαμε περιέχονται συναρτήσεις με ονόματα ίδια με ήδη δηλωμένες συναρτήσεις. Στην octave ισχύει η τελευταία ενεργοποιημένη συνάρτηση και έτσι «σκιάζονται» όλες οι προγενέστερα ενεργοποιημένες συνώνυμές της.

  octave:7> imhist(Lenna_G);
  octave:8> imshow(Lenna_G,[3 222]);

Με την εντολή imhist βλέπουμε το ιστόγραμμα του πράσινου καναλιού που απομονώσαμε προηγουμένως ενώ με την imshow που ακολουθεί το εμφανίζουμε με γραμμική ενίσχυση των τόνων του από το 3 έως το 222.

  octave:9> Lenna_GH=histeq(Lenna_G);
  octave:10> imshow(Lenna_G);
  octave:11> figure
  octave:12> imshow(Lenna_GH);

Με την εντολή histeq ισοδυναμοποιούμε το ιστόγραμμα της εικόνας Lenna_G στην νέα εικόνα Lenna_GH. Εμφανίζουμε την Lenna_G, με την εντολή figure δημιουργούμε ένα νέο παράθυρο απεικόνισης και εμφανίζουμε την εικόνα Lenna_GH. Έτσι μπορούμε να συγκρίνουμε τις εικόνες και με ανάλογο τρόπο και την εντολή imhist τα ιστογράμματά τους.

Φίλτρα; Απ’ αυτά κι αν έχει. Κι ας αρχίσουμε με το φίλτρο διαμέσου medfilt2:

  octave:13> Lenna_GM=medfilt2(Lenna_G,[5 5]);
  octave:14> figure(2),imshow(Lenna_GM)

όπου 5×5 είναι η διάσταση του παραθύρου εφαρμογής. Ας πάμε στην συνάρτηση fspecial η οποία επιστρέφει ένα προκαθορισμένο φίλτρο ενώ η imfilter το εφαρμόζει. Δείτε και θα καταλάβετε:

  octave:15> f=fspecial('sobel')
  octave:16> Lenna_Sobel=sqrt(imfilter2(,f).^2+imfilter2(,f').^2);
  octave:17> figure(2),imshow(histeq(Lenna_Sobel))

Φτάνει;Πειστήκατε; Όσοι δεν πειστήκατε δείτε τις περιεχόμενες συναρτήσεις της βιβλιοθήκης image της octave και θα καταλάβετε. Δεν γράφω άλλα ;-)

Άλλες βιβλιοθήκες και πρόσθετο υλικό

Πολύ καλή η βιβλιοθήκη octave image. Καμιά άλλη έχει; Άκου λέει; Πολλές και θα τις βρείτε εδώ. Φυσικά τώρα πρέπει να κάνετε και λίγο ψάξιμο και λίγο περισσότερο διάβασμα και σίγουρα πολλές δοκιμές για να καταλήξετε σε αυτές που θέλετε. Και μην ξεχνάτε: τα πάντα είναι πίνακες και μπορείτε να κάνετε από τα πιο απλά μέχρι τα πιο σύνθετα πράγματα μαζί τους.

Πριν χρειαστείτε πρόσθετο υλικό για την octave βεβαιωθείτε ότι έχετε ρίξει μια ματιά στα περιεχόμενά της.

Αλλά κι αν θέλετε παράθυρα και ομορφιές και τζιβιτζιλίκια κι απ’ αυτά έχει «το μαγαζί». Από την έκδοση 3.8.0 (31/12/2013) περιέχεται γραφικό περιβάλλον διεπαφής με τον χρήστη (gui) μέσα στην octave με την παράμετρο –force-gui. Ο λόγος που δεν είναι διαθέσιμο άμεσα και απλά, είναι διότι ελπίζουμε ότι μέχρι την έκδοση 4.0 θα είναι πλήρως έτοιμο και λειτουργικό.

Αν θέλετε να βοηθήσετε την ανάπτυξη της octave μπορείτε να επισκεφτείτε αυτήν την ιστοσελίδα http://www.gnu.org/software/octave/get-involved.html. Αν εντοπίσετε κάποιο σφάλμα ή δυσλειτουργία δείτε εδώ τι πρέπει να κάνετε. Εδώ θα βρείτε προτάσεις για ανάπτυξη νέων λειτουργιών και τέλος εδώ ο επίσημος βικιχώρος της.

Μετά από όλα αυτά μην ξεχάσετε μια επίσκεψη στις δημοσιεύσεις και γιατί όχι μια προσφορά εδώ :-)

Μέτα την παράσταση

Με όλα όσα αναφέρθηκαν παραπάνω, έχετε τη δυνατότητα να κάνετε οποιοδήποτε πρόγραμμα υπολογισμών της Σχολής μας και μάλιστα να είναι και αρκετά σταθερό και φιλικό προς τον χρήστη.

Επίσης να σημειωθεί ότι αυτό το wiki είναι ελεύθερο όπως και η GNU/Octave. Μπορεί ο καθένας να έρθει να συμπληρώσει πράγματα, να διαγράψει ή να τροποποιήσει. Ο προσανατολισμός του είναι ερασιτεχνικός, κομμένος και ραμμένος στις απαιτήσεις τις σχολής μας. Στόχος του είναι να αποτελεί ένα πρακτικό εργαλείο και όχι να σας μάθει να προγραμματίζετε σαν επαγγελματίες (αλλά καλύτερα ;-) ).

Επιπρόσθετα θα σας ενθαρρύναμε ότι πρόγραμμα γράφετε να είναι ανοιχτό και ελεύθερο προς όλους. Να μπορεί δηλαδή ο καθένας να διαβάσει τον κώδικα του και να τον τροποποιήσει ανάλογα με τις ανάγκες του. Φυσικά η καλύτερη άδεια χρήσης δεν είναι άλλη από την http://www.gnu.org/licenses/gpl-3.0.html

Μεταφράζοντας τα 4 στοιχεία τα οποία πρέπει να έχει ένα πρόγραμμα για να θεωρείται ελεύθερο (όλη την φιλοσοφία μπορείτε να την βρείτε εδώ : http://www.gnu.org/philosophy/free-sw.html) :

⇒ Πρέπει να παρέχει την ελευθερία σε τρίτους να το εκτελούν για οποιοδήποτε λόγο.

⇒ Πρέπει να παρέχει την ελευθερία σε τρίτους να μελετούν πως δουλεύει το πρόγραμμα και να το προσαρμόζουν στις δικές τους ανάγκες. Η ελεύθερη πρόσβαση στον κώδικα είναι προαπαιτούμενη

⇒ Πρέπει να παρέχει την ελευθερία σε τρίτους να διανέμουν αντίτυπα του προγράμματος για να βοηθήσουν τον πλησίον τους.

⇒ Πρέπει να παρέχει την ελευθερία σε τρίτους να βελτιώνουν το πρόγραμμα και να δημοσιεύουν τις βελτιώσεις στο ευρύ κοινό, ώστε να επωφελείται από αυτές ολόκληρη η κοινότητα. Η ελεύθερη πρόσβαση στον κώδικα είναι προαπαιτούμενη.

Τέλος ας σημειωθεί ότι ο όρος free software πρέπει να αντιλαμβάνεται ως freedom of speech και όχι ως free beer. ;)

 
octave.txt · Τελευταία τροποποίηση: 2014/05/07 14:25 από chiossif