Εισαγωγή στο GNU Octave/MATLAB Δρ. Βασίλειος Δαλάκας Καλώς ήρθατε στο εργαστήριο Σημάτων και Συστημάτων με το λογισμικό Octave (Οκτάβα). Οι σημειώσεις αυτές έχουν βασιστεί στις σημειώσεις του εργαστηρίου MATLAB ψηφιακής επεξεργασίας σήματος του δασκάλου μου Σ. Θεοδωρίδη το οποίο δίδαξα στο παρελθόν. Σε αυτό το εργαστήριο θα χρησιμοποιήσουμε το λογισμικό Octave το οποίο διανέμεται ελεύθερα κάτω από την άδεια GNU και αποτελεί κλώνο του πολύ γνωστού λογισμικού MATLAB. Καθώς το κόστος του τελευταίου αυξάνεται το Octave αποτελεί μία πολύ καλή λύση για εκπαιδευτικούς αλλά και ερευνητικούς σκοπούς στις δύσκολες εποχές. Είμαστε σίγουροι ότι θα εκτιμήσετε την απλότητά του και τις μεγάλες του δυνατότητες. Το εμπορικό πρόγραμμα MATLAB αποτελεί σήμερα διεθνώς το πλέον διαδεδομένο εργαλείο για επεξεργασία σημάτων και όχι μόνο, χρησιμοποιούμενο από ερευνητές, εκπαιδευτές, μηχανικούς, μαθηματικούς, κ.ά. Η βασική δομή με την οποία εκτελούνται όλα είναι ο πίνακας. Στο σημερινό εργαστήριο, θα ασχοληθούμε με μια εισαγωγή δίνοντας έμφαση στις λειτουργίες που θα χρησιμοποιήσουμε κατά κόρο στη συνέχεια. Για μια σύντομη αλλά και περιεκτική εισαγωγή σας προτείνουμε να διαβάσετε τις αντίστοιχες σημειώσεις για το MATLAB από το eclass, είτε κάποιο από τα πολλά online manuals για το MATLAB καθώς αποτελεί κλώνο του και ελάχιστα πράγματα διαφέρουν σε σχέση με τον τρόπο γραφής κώδικα. Το ίδιο το Octave έχει ένα πλήρες εγχειρίδιο (700+ σελίδες) διαθέσιμο στην διεύθυνση http://www.gnu. org/software/octave/doc/interpreter/. Εδώ εμείς θα μιλήσουμε μόνο για μερικά σημαντικά του στοιχεία μέσω κάποιων απλών ασκήσεων. Οι στόχοι αυτού του εργαστηρίου είναι: 1. Να μάθετε να χρησιμοποιείτε το σύστημα help για να μαθαίνετε βασικές εντολές και το συντακτικό τους. 2. Να μάθετε να γράφετε functions και M-files. 3. Να μάθετε κάποιες σωστές τεχνικές προγραμματισμού για Octave/MATLAB. Αφού συνδεθείτε με τον λογαριασμό σας στο Linux, μπορείτε να μπείτε στο γραφικό περιβάλλον κάνοντας διπλό-κλικ πάνω στο εικονίδιο QtOctave από το menu Science. 1 Βασικές εντολές Δείτε τη δυνατότητα του Octave να παρέχει βοήθεια. Δοκιμάστε για παράδειγμα τις εντολές: 1
help help plot help colon Μπορείτε να πάρετε πληροφορίες για οποιαδήποτε εντολή, M-file, ή τελεστή πληκτρολογώντας μέσα στο παράθυρο εντολών του (command window): help command Εναλλακτικά μπορείτε να χρησιμοποιήσετε το μενού της βοήθειας. Αν και το MATLAB προσφέρει μία από τις πιο καλά λειτουργικές και κατανοητές βοήθειες από τα προγράμματα που κυκλοφορούν στην αγορά σήμερα το Octave δυστυχώς σαν δωρεάν λογισμικό δεν έχει παρά μόνο τα βασικά. Όμως, αρκετά με τη βοήθεια. Το Octave είναι πολύ καλή αριθμομηχανή. Δοκιμάστε π.χ. pi*pi-10 sin(pi/4) ans^2 % Η μεταβλητή ans κρατά το τελευταίο αποτέλεσμα Μπορείτε να αποθηκεύετε ποσότητες σε μεταβλητές, π.χ. xx=sin(pi/5); cos(pi/5) yy=sqrt(1-xx*xx) ans Χειρίζεται με μεγάλη ευκολία μιγαδικούς αριθμούς. Δοκιμάστε για παράδειγμα τα ακόλουθα: zz=3+4i conj(zz) abs(zz) angle(zz) real(zz) imag(zz) exp(sqrt(-1)*pi) exp(j*[pi/4 pi/4]) Επίσης δημιουργεί με ευκολία γραφικές παραστάσεις. Η εντολή plot παριστάνει γραφικά ένα διάνυσμα y ως προς ένα διάνυσμα x. Δοκιμάστε το ακόλουθο: x=[-3 1 0 1 3]; y=x.*x-3*x; plot(x,y) z=x+y*i; plot(z) Για να δείτε πώς λειτουργεί ο τελεστής.^, μπορείτε να συμβουλευτείτε το help ως εξής help.^. Προσέξτε τη διαφορά με τον πολλαπλασιασμό πινάκων/διανυσμάτων όπως τον ξέρουμε. 2
2 Δεικτοδότηση Πινάκων Πρέπει να κατανοήσετε καλά το συμβολισμό με την άνω-κάτω τελεία (colon). Κάντε παραδείγματα όπως: n=1:10 m=1:4:10 k=2:(1/9):4 theta=pi*[2 : (-1/9) : 0] Κατασκευή διανυσμάτων: x=[ones(1,4) [2:2:11] zeros(1,3)] x(3:7) length(x) x(2:2:length(x)) Μπορούμε να κάνουμε καταχώρηση σε τμήματα ενός πίνακα: x(3:7)=pi*(1:5) Κάντε κάτι ανάλογο για να καταχωρήσετε την τιμή 77 σε όλα τα στοιχεία του x με περιττό δείκτη, δηλ. x(1)=x(3)=x(5)= =-77. Συγκρίνετε με τη χρήση for loop. 3 Προγραμματισμός με διανυσματοποίηση Το Octave ως κλώνος του MATLAB έχει δομηθεί ώστε να ευνοεί πράξεις με διανύσματα. Η χρήση του for loop είναι πάντα μια εναλλακτική λύση που θα πρέπει όμως να αποφεύγεται όποτε είναι δυνατόν γιατί επιβραδύνει κατά πολύ τους υπολογισμούς. Ας δούμε ένα παράδειγμα. Έστω ότι θέλουμε να υπολογίσουμε στο διάνυσμα x τις τιμές του sin(kπ/4) για 0 k 7. Ο προφανής τρόπος, αυτός που μας έρχεται στο μυαλό από την εμπειρία μας σε γλώσσες όπως η C, είναι να κάνουμε το εξής: x=[]; % αρχικοποίηση σε κενό διάνυσμα for k=0:7 x(k+1)=sin(k*pi/4); % x(0) δεν ορίζεται στο Octave end Ο εναλλακτικός τρόπος που εκμεταλλεύεται την ευκολία του Octave να χειρίζεται πίνακες (και τον οποίο πρέπει να αφομοιώσετε) είναι ο ακόλουθος: x=sin([0:7]*pi/4); 3
4 Αρχεία M-files Το Octave μπορεί να εκτελέσει μια ακολουθία εντολών που είναι αποθηκευμένες σε ένα αρχείο. Τέτοια αρχεία καλούνται M-files γιατί πρέπει να έχουν μια κατάληξη με.m στο όνομά τους. Το μεγαλύτερο διάστημα της εργασίας σας, από δω και πέρα, με το Octave/MATLAB, θα δημιουργείτε και θα επεξεργάζεστε M-files. Υπάρχουν δύο τύποι από M-files: Αυτά που ονομάζουμε script files και τα function files. 4.1 Script files Ένα αρχείο script αποτελείται από μια ακολουθία εντολών. Εάν το αρχείο έχει για παράδειγμα το όνομα, rotate.m, τότε εάν γράψουμε στη γραμμή εντολών την εντολή rotate θα εκτελεστούν οι εντολές που είναι αποθηκευμένες μέσα στο αρχείο. Οι μεταβλητές που βρίσκονται μέσα σε ένα αρχείο script είναι καθολικές μεταβλητές και αν υπάρχει μια μεταβλητή με το ίδιο όνομα στο τρέχον περιβάλλον αυτή θα αλλάξει τιμή κατά την εκτέλεση του script. Τέτοια αρχεία χρησιμοποιούνται συχνά για την είσοδο δεδομένων σε ένα μεγάλο πίνακα γιατί είναι εύκολο να διορθώσουμε πιθανά λάθη κατά την εισαγωγή. Για παράδειγμα, αν κάποιος βάλει σε ένα αρχείο data.m A = [ 1 2 3 4 5 6 7 8 ]; Τότε η εντολή data θα προκαλέσει την ανάθεση τιμής του πίνακα Α που βρίσκεται μέσα στο αρχείο data.m να εκτελεστεί. Ένα M-file μπορεί να καλεί για εκτέλεση άλλα M-files, συμπεριλαμβανομένου του ίδιου του, του εαυτού, προκαλώντας αναδρομή. 4.2 Function files Τα αρχεία function παρέχουν στο MATLAB την δυνατότητα επέκτασης. Μπορείτε να δημιουργήσετε νέες συναρτήσεις οι οποίες να είναι εξειδικευμένες για το πρόβλημα που σας απασχολεί και οι οποίες θα έχουν την ίδια χρήση όπως οποιαδήποτε προκαθορισμένη συνάρτηση του MATLAB. Οι μεταβλητές σε ένα αρχείο function είναι τοπικές εκτός και αν οριστεί διαφορετικά από εσάς. Ας δούμε ένα απλό παράδειγμα ενός αρχείου function. function y = randint(m,n) % RANDINT Randomly generated integral matrix. % randint(m,n) returns an m-by-n such matrix with % entries between 0 and 9. y = floor(10*rand(m,n)); endfunction % Η γραμμή αυτή δεν χρειάζεται στο MATLAB 4
Η πρώτη γραμμή δηλώνει το όνομα της συνάρτησης και τα ορίσματα εισόδου και εξόδου. Χωρίς αυτή την γραμμή το αρχείο είναι ένα αρχείο script. Η εντολή z = randint(2,4), για παράδειγμα, προκαλεί το πέρασμα των αριθμών 2 και 4 στις μεταβλητές m and n της συνάρτησης και το αποτέλεσμα περνάει ως έξοδος στην μεταβλητή z. Καθώς οι μεταβλητές μέσα σε ένα αρχείο function είναι τοπικές όπως προαναφέραμε, τα ονόματά τους είναι ανεξάρτητα από αυτά στο περιβάλλον του Octave/MATLAB. Με το σύμβολο % δείχνουμε πως αυτό που ακολουθεί στην γραμμή είναι σχόλιο για το πρόγραμμά μας. Μάλιστα, στον editor εμφανίζονται με διαφορετικά γράμματα για να μας δείξουν τον ιδιαίτερο ρόλο τους. Όταν τώρα τα σχόλια αυτά είναι όπως στο παράδειγμα, σε ανεξάρτητες συνεχείς γραμμές, ακριβώς μετά τον ορισμό της συνάρτησης, τότε αποτελούν και το κείμενο που επεξηγεί την λειτουργία της αντίστοιχης συνάρτησης. Με χρήση της help functionname μπορείτε να δείτε τις πληροφορίες αυτές και μάλιστα τέτοιου είδους επεξηγήσεις πρέπει να περιέχονται πάντα όταν φτιάχνουμε ένα αρχείο function. Στο επανειδείν! 5