Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο...

126
195 Π Α Ρ Α Ρ Τ Η Μ Α Για μια Εισαγωγή στο MATLAB

Transcript of Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο...

Page 1: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

195

Π Α Ρ Α Ρ Τ Η Μ Α

Για μια Εισαγωγή στο MATLAB

Page 2: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 196

1. Υπολογίζοντας στο Αλληλεπιδραστικό Περιβάλλον του MATLAB 198 1.1 Τρέχοντας το MATLAB.............................................................................. 198

1.1.1 Το MATLAB ως υπολογιστής παραστάσεων ..................................... 200 1.1.2 Οι μεταβλητές του MATLAB .............................................................. 202 1.1.3 Ενσωματωμένες Μεταβλητές και Συναρτήσεις .................................. 203 1.1.4 Συναρτήσεις και Εντολές .................................................................... 205 1.1.5 On-line Βοήθεια .................................................................................. 205

1.2 Πίνακες και Διανύσματα ............................................................................ 208 1.2.1 Δημιουργία Πινάκων........................................................................... 210 1.2.2 Συμβολισμός Δεικτών για τα Στοιχεία Πινάκων................................ 215 1.2.3 Ο συμβολισμός άνω - κάτω τελεία (:) ................................................ 218 1.2.4 Διαγραφή Στοιχείων από Διανύσματα και Πίνακες............................ 221 1.2.5 Πράξεις με Πίνακες ............................................................................ 222 1.2.6 Μετασχηματισμός της Μορφής Πινάκων........................................... 227

1.3 Πρόσθετοι Τύποι Μεταβλητών .................................................................. 230 1.3.1 Μιγαδικοί Αριθμοί .............................................................................. 231 1.3.2 Αλφαριθμητικά ή Συμβολοσειρές (Strings) ........................................ 235 1.3.3 Πολυώνυμα ......................................................................................... 237

1.4 Διαχείριση του Αλληλεπιδραστικού Περιβάλλοντος ................................. 239 2.4.1 Ο Χώρος Εργασίας του MATLAB ...................................................... 239 1.4.2 Δουλεύοντας με Δεδομένα από Εξωτερικά Αρχεία ............................ 241

1.5 Σχεδίαση Διαγραμμάτων στο MATLAB..................................................... 248 1.5.1 Γραφικές Παραστάσεις Γραμμών ....................................................... 248 1.5.2 Εμφάνιση Σχολίων σε Διαγράμματα................................................... 251 1.5.3 Εμφάνιση Πολλών Διαγραμμάτων σε ένα Παράθυρο ....................... 253 1.5.4 Γραφικές Παραστάσεις Επιφανειών ................................................... 254 1.5.5 Περιγράμματα (Contour Plots) ........................................................... 260

1.6 Περίληψη.................................................................................................... 261 2. Προγραμματίζοντας στο MATLAB 262

2.1 Script m-files .............................................................................................. 262 2.1.1 Δημιουργία m-files.............................................................................. 264 2.1.2 Παρενέργειες ενός Script .................................................................... 269 2.1.3 Προτάσεις Σχολίων ............................................................................. 270

2.2 Συναρτήσεις m-files ................................................................................... 270 2.2.1 Σύνταξη Συναρτήσεων ........................................................................ 271 2.2.2 Παράμετροι Εισόδου και Εξόδου ....................................................... 272 2.2.3 Πρωταρχικές και Δευτερεύουσες Συναρτήσεις .................................. 276

2.3 Είσοδοι και Έξοδοι..................................................................................... 278 2.3.1 Εισαγωγή Δεδομένων κατά την εκτέλεση του Προγράμματος........... 278 2.3.2 Κείμενο Έξοδος .................................................................................. 279

2.4 Έλεγχος Ροής.............................................................................................. 283 2.4.1 Σχεσιακοί Τελεστές............................................................................. 284

Page 3: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 197

2.4.2 Τελεστής Προτεραιότητας .................................................................. 285 2.4.3 if … else . . . ................................................................................. 287 2.4.4 Επιλογή case με την Δομή switch ................................................ 289 2.4.5 Βρόχοι for ......................................................................................... 290 2.4.6 Βρόχοι while .................................................................................... 293 2.4.7 Η Εντολή break ................................................................................ 294 2.4.8 Η Εντολή return.............................................................................. 296

2.5 Διανυσματικοποίηση .................................................................................. 298 2.5.1 Χρήση Πράξεων Διανυσμάτων αντί για Βρόχους .............................. 298 2.5.2 Δέσμευση Μνήμης για Διανύσματα και Πίνακες ............................... 300 2.5.3 Διανυσματικοποιημένοι Δείκτες και Λογικές Συναρτήσεις................ 301

2.6 Ειδικές Περιπτώσεις ................................................................................... 310 2.6.1 Μεταβλητός Αριθμός των παραμέτρων Εισόδου και Εξόδου ............ 310 2.6.2 Καθολικές μεταβλητές ........................................................................ 312 2.6.3 Η Συνάρτηση feval.......................................................................... 314 2.6.4 Αντικείμενα inline Συναρτήσεων.................................................... 317

2.7 Περίληψη.................................................................................................... 320

Page 4: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 198

1. Υπολογίζοντας στο Αλληλεπιδραστικό Περιβάλλον του MATLAB

Θα προσπαθήσουμε να περιγράψουμε αρχικά τα βασικά στοιχεία του MATLAB: εισαγωγή εντολών ορισμός και χρήση μεταβλητών δημιουργία δισδιάστατων και τρισδιάστατων γραφικών

Οι λειτουργίες αυτές εκτελούνται αλληλεπιδραστικά πληκτρολογώντας μια εντολή τη φορά. Η χρήση του MATLAB με αλληλεπίδραση είναι πολύ αποδοτική, επειδή πολλές σύνθετες αριθμητικές πράξεις μπορούν να εκτελεστούν με λίγες συνοπτι-κές - περιεκτικές εντολές. Όλες οι αλληλεπιδραστικές εντολές μπορούν να χρησι-μοποιηθούν και σε προγράμματα. Για τον λόγο αυτό, ότι περιγράφεται στο παρόν κεφάλαιο είναι απαραίτητο για κάθε χρήση του MATLAB.

1.1 Τρέχοντας το MATLAB Οι ιδιαιτερότητες της εγκατάστασης και εκκίνησης του MATLAB εξαρτώνται από τον τύπο υπολογιστή που χρησιμοποιείται. Πάντως από τη στιγμή που το MATLAB τρέξει, κατά την εκτέλεση χρησιμοποιείται ένα συνηθισμένο περιβάλ-λον διασύνδεσης με μπάρες επιλογών και παράθυρα μέσω των οποίων είτε εισάγο-νται δεδομένα, είτε εμφανίζονται τα αποτελέσματα υπολογισμών. Η χρήση των μενού, βασικά, γίνεται για τη διαχείριση των αρχείων, την επεξεργασία του παρα-θύρου εντολών και τον έλεγχο των αποτελεσμάτων. Το σύστημα αυτό των μενού είναι σχετικά μικρό σε σχέση με τα αντίστοιχα άλλων προγραμμάτων. Εν δυνάμει, όλοι οι αριθμητικοί υπολογισμοί στο MATLAB εκτελούνται πληκτρολογώντας εντολές και όχι μέσω της διαχείρισης των μενού. Ο καλύτερος τρόπος για να μάθει κανείς το MATLAB είναι να πειραματιστεί εισά-γοντας εντολές στο παράθυρο εντολών. Θα ήταν καλή ιδέα να τρέξετε το MATLAB και καθώς διαβάζετε να εισάγετε τις εντολές που παρατίθενται στο κεί-μενο. Όταν ξεκινάει το MATLAB, ανοίγει ένα παράθυρο που ονομάζεται παράθυρο εντολών (command window) και εμφανίζεται η ένδειξη εισαγωγής εντολής (command prompt) >> Αν έχετε την εκπαιδευτική έκδοση του προγράμματος η ένδειξη εισαγωγής εντο-λής είναι EDU>

Page 5: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 199

Η ένδειξη εισαγωγής εντολής σημαίνει ότι το MATLAB είναι έτοιμο για εισαγωγή δεδομένων. Η βασική διαδικασία είναι να πληκτρολογείτε εντολές και να πατάτε στο τέλος κάθε μιας το πλήκτρο επιστροφής ( ή <enter>). Ανάλογα με το είδος της εντολής το MATLAB είτε θα αποκριθεί με ένα μήνυμα κειμένου, είτε θα ανοί-ξει ένα νέο παράθυρο, όταν τα αποτελέσματα είναι γραφικά. Όταν εκτελεστεί η εντολή, θα εμφανιστεί ένα νέο σύμβολο ένδειξης εισαγωγής εντολής. Αυτός ο τρόπος χρήσης του MATLAB είναι αλληλεπιδραστικός (δηλ. με την εισαγωγή μιας εντολής, επιστρέφεται η απόκριση - αποτέλεσμα). Σε μερικές περιπτώσεις, η από-κριση θα είναι απλώς η εμφάνιση μιας ένδειξης εισαγωγής εντολών, δηλώνοντας ότι το MATLAB είναι έτοιμο να δεχτεί την επόμενη εντολή. Τυπογραφικές Συμβάσεις Σε όλο αυτό το κείμενο, οι εντολές θα παρουσιά-ζονται με γραμματοσειρά Courier New όπως στην

>> help hilbert Όταν το σύμβολο ένδειξης εισαγωγής εντολής προηγείται της εντολής, τότε η σύ-νταξη είναι σωστή και μπορεί να εισαχθεί απευθείας και ως έχει στο παράθυρο εντολών. Όταν σκοπός του κειμένου είναι να περιγράψει τις παραμέτρους εισόδου και εξόδου μιας συνάρτησης, δεν θα εμφανίζεται το σύμβολο ένδειξης εισαγωγής εντολής και θα χρησιμοποιούνται αντιπροσωπευτικά ονόματα για τις παραμέτρους εισόδου και εξόδου. Τα ονόματα των παραμέτρων εμφανίζονται λοξά. Για παρά-δειγμα η ones(nrows, ncols) δηλώνει ότι η συνάρτηση ones παίρνει δύο παραμέτρους: nrows και ncols. Εφόσον, η εντολή δεν περιλαμβάνει το σύμβολο ένδειξης εισαγωγής εντολής, δεν μπορεί να εισαχθεί όπως είναι γραμμένη στο πρόγραμμα. Μια έκδοση της συνάρ-τησης ones που μπορεί να εισαχθεί στη γραμμή εντολών του προγράμματος εί-ναι: >> ones(3,5) Μερικές φορές θα χρησιμοποιηθούν σχόλια για την παροχή πρόσθετης πληροφο-ρίας για την συνάρτηση. Τα σχόλια αρχίζουν με τον χαρακτήρα (%) και εκτείνο-νται μέχρι το τέλος της γραμμής, όπως >> x = sqrt(-4) % το MATLAB χρησιμοποιεί μιγαδικούς αριθμούς Κατά την εισαγωγή μιας εντολής στη γραμμή εντολών του προγράμματος, τα σχό-λια μπορούν να παραλειφθούν.

Page 6: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 200

Οι μεταβλητές (περιγράφονται στην § 1.1.2) παρουσιάζονται κι αυτές με γραμμα-τοσειρά Courier New. Αν χρησιμοποιούνται μεταβλητές σε ένα πρόγραμμα, θα δηλώνονται πρώτες, όπως: >> nr = 2 >> nc = 2 >> ones(nr, nc) Το αποτέλεσμα της εντολής εμφανίζεται αμέσως μετά από αυτήν. Η εμφάνιση των εντολών, των μεταβλητών και των αποτελεσμάτων μιμείται αυτήν της οθόνης του MATLAB, δηλαδή: >> nr = 2 nr = 2 >> nc = 3 nc = 3 >> ones(nr, nc) ans = 1 1 1 1 1 1 όπου τα επιπλέον κατακόρυφα κενά διαστήματα έχουν παραλειφθεί για οικονομία χώρου.

1.1.1 Το MATLAB ως υπολογιστής παραστάσεων Το MATLAB μπορεί να χρησιμοποιηθεί για τον υπολογισμό απλών μαθηματικών παραστάσεων. Για να κάνετε έναν υπολογισμό, απλά πληκτρολογήστε τον στο παράθυρο εντολών και πατήστε το πλήκτρο επιστροφής: >> 2 + 6 – 4 ans = 4 Η απόκριση είναι της μορφής ans = … , όπου ans είναι μια αυτο-ορισμένη με-ταβλητή χρησιμοποιούμενη όταν μια παράσταση δεν έχει ανατεθεί σε μια μετα-βλητή ορισμένη από τον χρήστη. Προκειμένου να συνεχιστεί ένας υπολογισμός, η τιμή που έχει αποθηκευθεί στην ans μπορεί να ανακληθεί:

Page 7: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 201

>> ans/2 ans = 2 Πέρα από τον απλό υπολογισμό μιας παράστασης, μπορεί κανείς να αναθέσει την τιμή της σε μια μεταβλητή, όπως >> a = 5 a = 5 >> b = 6 b = 6 >> c = b/a c = 1.2000 όπου η απόκριση ans = … έχει αντικατασταθεί από το όνομαΜεταβλητής = ..., όπως θα περίμενε κανείς. Το MATLAB έχει πολλές ενσωματωμένες (built-in) συναρτήσεις και μια σειρά από προκαθορισμένες μεταβλητές. Οι κοινές τριγωνομετρικές συναρτήσεις ανήκουν στο σύνολο αυτών των συναρτήσεων. Οι εισαγόμενες παράμετροι σε όλες τις συ-ναρτήσεις περικλείονται σε παρενθέσεις, όπως: >> sin(pi/4) ans = 0.7071 όπου χρησιμοποιήθηκε η ενσωματωμένη μεταβλητή pi για τον υπολογισμό του εισαχθέντος ορίσματος. Τα ορίσματα σε όλες τις τριγωνομετρικές συναρτήσεις είναι σε ακτίνια. Ένας απλός τρόπος για την εμφάνιση της τιμής μιας μεταβλητής, είτε ενσωματω-μένης ή ορισμένης από τον χρήστη, είναι να εισάγετε το όνομα της μεταβλητής στη γραμμή εντολών και να πληκτρολογήσετε : >> pi ans = 3.1416

Page 8: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 202

Σε μια ακολουθία εντολών, οι ενδιάμεσες τιμές μπορεί να μην είναι ενδιαφέρουσες ή η εμφάνιση/επανάληψη των τιμών στο παράθυρο εντολών μπορεί να είναι ενο-χλητική. Η εμφάνιση του αποτελέσματος μιας εντολής μπορεί να αποτραπεί προ-σθέτοντας τον χαρακτήρα (;) στο τέλος της εντολής: >> x = 5; >> y = sqrt(59); >> z = log(y) + x^0.25 z = 3.5341 Το (;) δεν είναι απαραίτητο. Απλώς σημαίνει ότι δεν είναι επιθυμητή η εμφάνιση του αποτελέσματος της εντολής. Για οικονομία χώρου, πολλές παραστάσεις μπο-ρούν να εισαχθούν σε μία γραμμή. Αυτό απαιτεί την χρήση (;) ή (,), ανάμεσα στις παραστάσεις, για τον διαχωρισμό τους. Η χρήση του (,) επιτρέπει την εισα-γωγή πολλών εντολών σε μία γραμμή χωρίς να παραλείπονται τα αποτελέσματά τους: >> a = 5; b = sin(a), c = cosh(a) b = -0.9589 c = 74.2099

1.1.2 Οι μεταβλητές του MATLAB Όπως έδειξαν τα προηγούμενα παραδείγματα, οι μεταβλητές δημιουργούνται κατά την χρήση τους. Αν μια μεταβλητή δεν υπάρχει ήδη, δημιουργείται όποτε αυτή εμφανίζεται αριστερά του συμβόλου ισότητας (=). Η τιμή που αποθηκεύεται σε μια μεταβλητή μπορεί φυσικά να αλλάξει μέσω μιας επόμενης ανάθεσης: >> t = 5; >> t = t + 2 t = 7 Οποιαδήποτε μεταβλητή εμφανίζεται δεξιά του συμβόλου ισότητας (=) πρέπει να έχει ήδη οριστεί. Η εντολή >> x = 2z ??? Undefined function or variable ’z’.

Page 9: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 203

έχει ως αποτέλεσμα την εμφάνιση σφάλματος (στο παράδειγμα αυτό), γιατί η με-ταβλητή z δεν έχει προηγουμένως οριστεί με κάποια εντολή ανάθεσης. Στο MATLAB, τα ονόματα των μεταβλητών μπορούν να είναι μέχρι 31 χαρακτή-ρες και έχει σημασία αν είναι κεφαλαία ή μικρά. Για παράδειγμα, οι x και X είναι δυο διαφορετικές μεταβλητές. Επίσης, πρέπει να αρχίζουν με αλφαβητικό χαρα-κτήρα a-z ή A-Z. Μετά τον πρώτο χαρακτήρα μπορεί να ακολουθεί οποιοσδήποτε συνδυασμός αλφαριθμητικών χαρακτήρων, συμπεριλαμβανομένης και της κάτω παύλας, ( _ ). Για παράδειγμα, οι επόμενες εντολές δείχνουν έναν γνωστό γεωμε-τρικό υπολογισμό που δεν χρειάζεται περαιτέρω επεξήγηση: >> radius = 5.2; >> area = pi radius^2; ΠΙΝΑΚΑΣ 1.1 ΕΝΣΩΜΑΤΩΜΕΝΕΣ ΜΕΤΑΒΛΗΤΕΣ ΤΟΥ MATLAB

Μεταβλητή Σημασία

ans τιμή μιας παράστασης όταν αυτή η παράσταση δεν έχει ανατεθεί σε μια μεταβλητή

eps ακρίβεια αριθμού κινητής υποδιαστολής i, j φανταστικές μονάδες, i = j = 1 pi π, 3.14159265….. realmax ο μεγαλύτερος θετικός αριθμός κινητής υποδιαστολής realmin ο μικρότερος θετικός αριθμός κινητής υποδιαστολής Inf ∞, ένας αριθμός μεγαλύτερος του realmax, το αποτέλεσμα του

1/0 NaN όχι ένας αριθμός, (π.χ. το αποτέλεσμα του 0/0)

1.1.3 Ενσωματωμένες Μεταβλητές και Συναρτήσεις Το MATLAB χρησιμοποιεί ένα περιορισμένο πλήθος ονομάτων για τις ενσωμα-τωμένες μεταβλητές. Ένα παράδειγμα είναι η μεταβλητή ans, που δημιουργείται αυτόματα όποτε μια μαθηματική παράσταση δεν έχει ανατεθεί σε κάποια μεταβλη-τή. Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές και τη σημασία τους. Αν και είναι δυνατό να οριστούν ξανά οι μεταβλητές αυτές, αυτό δεν είναι πολύ καλή ιδέα, γιατί χρησιμοποιούνται από ενσωματωμένες συναρτήσεις. Οι ε-ξαιρέσεις στον κανόνα αυτό είναι οι μεταβλητές i και j, στις οποίες αναθέτονται ακέραιες τιμές, προκειμένου να χρησιμοποιηθούν ως δείκτες πινάκων. (βλ § 1.2.2).

Page 10: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 204

Η ενσωματωμένη μεταβλητή eps ονομάζεται «έψιλον μηχανής» και περιγράφεται στο κεφάλαιο 5. Οι μεταβλητές realmax, realmin, Inf και NaN χρησιμοποι-ούνται για το χειρισμό εξαιρέσεων αριθμών κινητής υποδιαστολής. Οι τιμές realmax και realmin είναι τα μεγέθη του μεγαλύτερου και μικρότερου αριθ-μού, αντιστοίχως, που μπορεί να αποθηκευθούν με διπλή ακρίβεια (double preci-sion).1 Οι τιμές Inf και NaN εμφανίζονται όταν μια εξαίρεση αριθμού κινητής υποδιαστολής είναι αποτέλεσμα των υπολογισμών. Οι παρακάτω υπολογισμοί χει-ρίζονται με έναν προβλεπόμενο και αξιόπιστο τρόπο τις μεταβλητές Inf και NaN: >> x = 0; >> 5/x Warning: Divide by zero ans = Inf >> x/x Warning: Divide by zero ans = NaN Οι μεταβλητές eps, Inf, realmin και realmax περιγράφονται περαιτέρω στα Υπολογιστικά Μαθηματικά (βλ. και Help του MATLAB). Το MATLAB έχει πολλές ισχυρές ενσωματωμένες συναρτήσεις. Καλόν είναι, να αποφεύγει κανείς τη χρήση μεταβλητών με ονόματα ίδια με εκείνα ενσωματωμέ-νων συναρτήσεων. Αυτό δεν είναι πάντα εύκολο, καθώς υπάρχουν τόσο πολλές συναρτήσεις του MATLAB. Για παράδειγμα, κάποιος μπορεί να μην σκεφτεί ότι gamma είναι μια ενσωματωμένη συνάρτηση με τύπο

x = 1

0.x tt e dt

Μια εντολή, όπως >> gamma = 1.4 η οποία δημιουργεί μια μεταβλητή με όνομα gamma, δεν είναι μη νόμιμη, απλώς στην τρέχουσα συνεδρία του MATLAB δεν υπάρχει η δυνατότητα κλήσης της gamma συνάρτησης.

1 Η ακρίβεια των αριθμών κινητής υποδιαστολής και η σχέση της με τους realmax και realmin είναι θέματα συζήτησης των Υπολογιστικών Μαθηματικών.

Page 11: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 205

1.1.4 Συναρτήσεις και Εντολές Είναι απαραίτητο να γίνει ένας σημασιολογικός διαχωρισμός ανάμεσα στις συναρ-τήσεις και τις εντολές που εισάγονται στο παράθυρο εντολών. Μια συνάρτηση έχει εισαγόμενα ορίσματα και, συνήθως, έχει και εξαγόμενα ορίσματα. Για παράδειγ-μα, η παράσταση >> y = sin(pi/6) χρησιμοποιεί τη συνάρτηση sin με εισαγόμενο όρισμα pi/6 και αναθέτει το α-ποτέλεσμα στη μεταβλητή y. Σε αντίθεση, η εντολή help χρησιμοποιείται με ένα κενό ανάμεσα στο όνομα της εντολής και το όρισμά της, όπως για παράδειγμα >> help sin Γενικά, οι εντολές χρησιμοποιούνται για τη διαχείριση της κατάστασης της τρέ-χουσας συνεδρίας του MATLAB, ενώ οι συναρτήσεις χρησιμοποιούνται για τη δι-αχείριση των μεταβλητών του MATLAB. Ο διαχωρισμός ανάμεσα στις εντολές και τις συναρτήσεις είναι κατά κάποιο τρόπο τεχνητός, γιατί όλες οι εντολές μπορούν να χρησιμοποιηθούν σαν συναρτήσεις αν το όρισμα της εντολής αποδοθεί ως ει-σαγόμενη συμβολοσειρά (string), όπως >> help('sin') Αν και οι εντολές μπορούν να χειριστούν ως συναρτήσεις, το αντίθετο δεν συμ-βαίνει. Η παράσταση >> sin pi ans = -0.8900 –0.9705 έχει ένα μη αναμενόμενο αποτέλεσμα. Βασικά, η χρήση του MATLAB έχει να κάνει με τη χρήση συναρτήσεων. Η διαφορά στη σύνταξη μεταξύ των συναρτήσε-ων και των εντολών είναι ένα έλασσον μπέρδεμα, γιατί υπάρχει μόνον ένας μικρός αριθμός εντολών και όλες αυτές έχουν να κάνουν με μη αριθμητικές δουλειές.

1.1.5 On-line Βοήθεια Τα εγχειρίδια του MATLAB παρέχουν εκτεταμένη περιγραφή όλων των ενσωμα-τωμένων συναρτήσεων. Τα εγχειρίδια (σε HTML και PDF) μπορείτε να τα δείτε ηλεκτρονικά. Ωστόσο, σε πολλές περιπτώσεις, τα εγχειρίδια δεν είναι τόσο εύχρη-

Page 12: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 206

στα όσο η on-line βοήθεια που είναι άμεσα διαθέσιμη μέσω του παραθύρου εντο-λών του MATLAB. Η on-line βοήθεια είναι ιδιαίτερα χρήσιμη όταν χρειάζεστε πληροφορία σχετικά με τον τρόπο χρήσης μιας ενσωματωμένης συνάρτησης. Για να δείτε την on-line βοήθεια της functionName, πληκτρολογήστε help functionName ή helpwin('functionName') στη γραμμή εντολών. Η μόνη διαφορά ανάμεσα σε αυτές τις δύο εντολές είναι ο τρόπος εμφάνισης της πληροφορίας. Η “help functionName” εντολή εμφανί-ζει την πληροφορία στο ίδιο παράθυρο, το παράθυρο εντολών, ενώ η “helpwin('functionName')” ανοίγει ένα ξεχωριστό παράθυρο που ονομά-ζεται help browser. Ας υποθέσουμε, για παράδειγμα, ότι δεν μπορείτε να θυμηθείτε αν η συνάρτηση log υπολογίζει τον φυσικό λογάριθμο ή το λογάριθμο με βάση το 10. Αντί να ψά-ξετε το “log”στο εγχειρίδιο, απλώς πληκτρολογήστε >> help log και το MATLAB θα αποκριθεί με LOG Natural logarithm. LOG(X) is the natural logarithm of the elements of X. Complex results are produced if X is not positive. See also LOG2, LOG10, EXP, LOGM. Overloaded methods help sym/log.m help fints/log.m help demtseries/log.m Αυτή η περιεκτική περίληψη παρέχει την απαραίτητη πληροφορία, καθώς και α-ναφορές σε συσχετιζόμενες συναρτήσεις log2, log10, exp, logm κ.λπ.

Page 13: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 207

Η εντολή lookfor βοηθά στην εύρεση συναρτήσεων σχετικών με ένα συγκεκρι-μένο θέμα. Είναι ιδιαίτερα χρήσιμη όταν θέλετε να μάθετε αν το MATLAB έχει κάποια συνάρτηση που εκτελεί μια συγκεκριμένη λειτουργία. Πληκτρολογώντας lookfor searchString ξεκινάει μια αναζήτηση στις συναρτήσεις που είναι διαθέσιμες στο MATLAB. Αν το τμήμα searchString είναι μέρος ονόματος κάποιας συνάρτησης ή των σχολίων της, τότε η πρώτη γραμμή των σχολίων εμφανίζεται στο παράθυρο εντολών. Ας υποθέσουμε, για παράδειγμα, ότι θα θέλατε να μάθετε αν το MATLAB έχει κάποια ενσωματωμένη συνάρτηση για τον υπολογισμό της συνάρτησης υπερβολικού συ-νημίτονου. Η χρήση της lookfor για την εύρεση του “hyperbolic” ή του “cosine” θα επιστρέψει τα ονόματα των σχετικών συναρτήσεων του MATLAB. Για παράδειγμα, >> lookfor cosine ACOS Inverse cosine. ACOSH Inverse hyperbolic cosine. COS Cosine. COSH Hyperbolic cosine. TFFUNC time and frequency domain versions of a cosine modulated Gaussian pulse. RCOSFIR Design a raised cosine FIR filter. RCOSFLT Filter the input signal using a raised cosine filter. RCOSIIR Design a raised cosine IIR filter. RCOSINE Design raised cosine filter. rcosdemo.m: %Demonstration of raised cosine functions COSINT Cosine integral function. DCT2 Compute 2-D discrete cosine transform. DCTMTX Compute discrete cosine transform matrix. DCTMTX2 Discrete cosine transform matrix. IDCT2 Compute 2-D inverse discrete cosine transform. CHIRP Swept-frequency cosine generator. DCT Discrete cosine transform. FIRRCOS Raised Cosine FIR Filter design. IDCT Inverse discrete cosine transform. ACOS Symbolic inverse cosine. ACOSH Symbolic inverse hyperbolic cosine. COS Symbolic cosine function. COSH Symbolic hyperbolic cosine. COSINT Cosine integral function. DCT Discrete cosine transform. IDCT Inverse discrete cosine transform. BLKACOS This block defines an output angle that is the arccosine of the in-put. BLKCOS This block defines the output as the cosine of the input. BLKCOSASIN This block defines the cosine of an angle whose sine is u. BLKCOSATAN This block defines the cosine of an angle whose tangent is u1/u2. dctold.m: %DCT Discrete cosine transform. GENCOSWIN Returns one of the generalized cosine windows. idctold.m: %IDCT Inverse discrete cosine transform.

Page 14: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 208

Το αποτέλεσμα είναι μια λίστα συναρτήσεων (με ΚΕΦΑΛΑΙΑ) και μια μικρή πε-ριγραφή με το τι κάνει η κάθε μια. Το πλεονέκτημα της εντολής lookfor είναι ότι δεν χρειάζεται να είναι γνωστό το όνομα της συνάρτησης. Όταν βρεθεί το ό-νομα της συνάρτησης με την lookfor, τότε με την εντολή help μπορεί κανείς να δει μια πιο λεπτομερή περιγραφή της. Για παράδειγμα, συγκεκριμένη πληροφο-ρία για τη χρήση της συνάρτησης cosh μπορεί να βρεθεί με >> help cosh COSH Hyperbolic cosine. COSH(X) is the hyperbolic cosine of the elements of X. Overloaded methods help sym/cosh.m

1.2 Πίνακες και Διανύσματα Στα προηγούμενα παραδείγματα, οι μεταβλητές που χρησιμοποιήθηκαν ήταν α-ριθμοί ή βαθμωτά μεγέθη (scalars). Στην πραγματικότητα, όλες οι μεταβλητές στο MATLAB είναι arrays. ΄Ένα array είναι μια συλλογή τιμών στην οποία η αναφορά γίνεται με ένα μόνο όνομα μεταβλητής. Κάθε ένα στοιχείο του πίνακα αποθηκεύε-ται και εξάγεται (υπολογίζεται) καθορίζοντας το δείκτη του στοιχείου με βάση την αρχή του array. Από την έκδοση 5 του MATLAB και μετά μπορούν να δημιουρ-γηθούν arrays με οποιονδήποτε αριθμό δεικτών. Στις εφαρμογές αυτής της εισα-γωγής μας στο MATLAB τα arrays θα έχουν έναν ή δύο δείκτες που περιέχουν είτε αριθμητικές, ή χαρακτήρες. (Τα arrays χαρακτήρων ή strings περιγράφονται πα-ρακάτω, στην παράγραφο § 1.3.2). Ένας πίνακας (matrix) είναι δισδιάστατο array με αριθμητικές τιμές που υπακούει στους κανόνες της γραμμικής άλγεβρας, όπως αυτοί περιγράφονται σε ένα βιβλίο Γραμμικής Άλγεβρας. Εδώ θα αναφερθούμε κυρίως σε ότι αφορά τον ορισμό και τη χρήση μεταβλητών για πίνακες του MATLAB σε απλές υπολογιστικές πράξεις. Ένα βαθμωτό μέγεθος θεωρείται ως ένας πίνακας με μια γραμμή και μια στήλη. Ένα διάνυσμα (vector) είναι ένας πίνακας είτε με μία γραμμή ή με μία στήλη. Ό-ταν εισάγεται μια μαθηματική έκφραση ή παράσταση (expression) ο διερμηνέας του MATLAB την διαπερνάει (parse) και την υπολογίζει κάνοντας χρήση των κα-νόνων της γραμμικής άλγεβρας. Βαθμωτές παραστάσεις όπως >> a = 2; b = 3; >> c = a*b c =

Page 15: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 209

6 διέπονται από αυτούς τους κανόνες. Οι αγκύλες, [ ], χρησιμοποιούνται για να οροθετήσουν διανύσματα και πίνακες κατά την εισαγωγή τους στη γραμμή εντολών. Η επόμενη παράσταση δημιουργεί ένα διάνυσμα γραμμή (row vector) με τρία στοιχεία: >> v = [7 3 9] v =

7 3 9 Τα στοιχεία σε μια γραμμή διαχωρίζονται με κενά ή κόμματα. Τα ερωτηματικά χρησιμοποιούνται για το διαχωρισμό των γραμμών. Ένα παράδειγμα ενός διανύ-σματος στήλης (column vector) φαίνεται παρακάτω >> w = [2; 6; 1] w = 2 6 1 και ένα παράδειγμα ενός 3x3 πίνακα είναι >> A = [1 2 3; 4 5 6; 13 17 19] A = 1 2 3 4 5 6 13 17 19 Όταν ένας πίνακας εισάγεται απευθείας στη γραμμή εντολών, για το διαχωρισμό των γραμμών μπορεί να χρησιμοποιηθεί το πλήκτρο >> B = [11 12 13 % πληκτρολογήστε μετά την 4 5 6 % πληκτρολόγηση του 13 7 8 9] B = 11 12 13 4 5 6 7 8 9 Οι διαστάσεις του πίνακα (ή διανύσματος) δεν καθορίζονται ρητά. Το MATLAB κρατάει πληροφορία για τον αριθμό των γραμμών και των στηλών, αυτόματα.

Page 16: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 210

1.2.1 Δημιουργία Πινάκων Στο MATLAB, μεταβλητές πινάκων μπορούν να δημιουργηθούν με οποινδήποτε από τους παρακάτω τρόπους:

Απευθείας εισαγωγή (με πληκτρολόγηση) Υπολογισμός παραστάσεων πινάκων Ενσωματωμένες συναρτήσεις που επιστρέφουν πίνακες Συναρτήσεις που δημιουργούνται από το χρήστη και που επιστρέφουν πί-

νακες Εισάγοντας πίνακες δεδομένα από αρχεία σε δίσκο

Τα προηγούμενα παραδείγματα δείχνουν πως εισάγονται πίνακες απευθείας (με πληκτρολόγηση). Για την εισαγωγή διανυσμάτων είναι σημαντικό να διακρίνουμε τα διανύσματα γραμμές από τα διανύσματα στήλες. Σύμφωνα με τους κανόνες της γραμμικής άλγεβρας, δεν είναι εναλλάξιμα τα διανύσματα στήλες με τα διανύσμα-τα γραμμές και ο διερμηνευτής (interpreter) του MATLAB δεν επιτρέπει μη αποδε-κτές παραστάσεις. Ένα διάνυσμα γραμμή μπορεί να μετατραπεί σε ένα διάνυσμα στήλη, και το αντίθετο, με τον τελεστή αναστροφής (transpose operator). Στον γνωστό από την γραμμική άλγεβρα συμβολισμό, αν v είναι ένα διάνυσμα, τότε το vΤ είναι το ανάστροφό του. Για παράδειγμα,

v = [2 4 1 7] και vΤ =

2

4

1

7

Στο MATLAB ο τελεστής αναστροφής συμβολίζεται με τη μονή απόστροφο ('). Δηλ. ο ανάστροφος του πίνακα Α συμβολίζεται με Α'. Έτσι σύμφωνα με όσα προ-ηγήθηκαν, το διάνυσμα v και το ανάστροφό του δημιουργούνται στο MATLAB με >> v = [2 4 1 7] v = 2 4 1 7 >> v' ans = 2 4 1 7

Page 17: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 211

και ένας πίνακας Α με τον ανάστροφό του με >> A = [1 2 3; 4 5 6; 7 8 9] A = 1 2 3 4 5 6 7 8 9 >> A' ans = 1 4 7 2 5 8 3 6 9 Υπάρχουν πολλές ενσωματωμένες συναρτήσεις για τη δημιουργία διανυσμάτων και πινάκων. Μερικές από αυτές παρατίθενται στον Πίνακα 1.2. Η eye συνάρτη-ση δέχεται ένα ή δύο ορίσματα και δημιουργεί έναν πίνακα με 1 στην κύρια δια-γώνιο. Η μορφή της eye συνάρτησης με ένα όρισμα δημιουργεί έναν (τετραγωνι-κό) μοναδιαίο πίνακα με διαστάσεις που ορίζονται από την τιμή της εισαχθείσας παραμέτρου, όπως >> C = eye(4) C = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ΠΙΝΑΚΑΣ 1.2 ΜΕΡΙΚΕΣ ΕΝΣΩΜΑΤΩΜΕΝΕΣ ΣΥΝΑΡΤΗΣΕΙΣ ΓΙΑ ΤΗ ΔΗΜΙ-

ΟΥΡΓΙΑ ΠΙΝΑΚΩΝ.

Συνάρτηση Επιστρέφει diag πίνακα με καθορισμένα διαγώνια στοιχεία ή εξάγει τα

διαγώνια στοιχεία ενός πίνακα eye μοναδιαίο πίνακα ones πίνακα με όλα τα στοιχεία = 1 rand πίνακα με στοιχεία τυχαίους αριθμούς zeros πίνακα με όλα τα στοιχεία = 0 length το πλήθος των στοιχείων ενός διανύσματος linspace διάνυσμα γραμμή με στοιχεία που αυξάνονται γραμμικά logspace διάνυσμα στήλη με στοιχεί που αυξάνονται λογαριθμικά size τις διαστάσεις του πίνακα

Page 18: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 212

Αν στην συνάρτηση eye εισαχθούν δύο παράμετροι, η πρώτη ορίζει το πλήθος των γραμμών και η δεύτερη το πλήθος των στηλών του πίνακα που θα δημιουργη-θεί. Η διαγώνιος με i = j, όπου i είναι ο δείκτης της γραμμής ενώ j είναι ο δείκτης της στήλης, έχει στοιχεία μονάδες: >> D = eye (3,5) D = 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 Η συνάρτηση diag είτε δημιουργεί έναν πίνακα με καθορισμένες τις τιμές της διαγωνίου ή εξάγει τα στοιχεία της διαγωνίου. Για τη δημιουργία ενός διαγώνιου πίνακα με την diag συνάρτηση, το εισαγόμενο όρισμα πρέπει να είναι διάνυσμα. Το διάνυσμα μπορεί να δημιουργηθεί ρητά, όπως >> v = [1 2 3]; >> A = diag(v) A = 1 0 0 0 2 0 0 0 3 ή να εισαχθεί κατευθείαν ως όρισμα, όπως >> B = diag([1 2 1 2]) B = 1 0 0 0 0 2 0 0 0 0 1 0 0 0 0 2 Για την εξαγωγή των στοιχείων της διαγωνίου ενός πίνακα χρησιμοποιείται η ίδια συνάρτηση με τη διαφορά ότι τώρα το εισαγόμενο όρισμα είναι πίνακας και όχι διάνυσμα: >> w = diag(B) w = 1 2 1 2

Page 19: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 213

Η εξάρτηση της λειτουργίας της συνάρτησης diag από το εισαγόμενο όρισμα είναι ένα σημαντικό χαρακτηριστικό το οποίο συναντάται σε πολλές συναρτήσεις του MATLAB. Για κάποιον που μαθαίνει τώρα το MATLAB, η δυνατότητα μιας συνάρτησης να εκτελεί διαφορετικές – αν και σχετιζόμενες – εργασίες, μπορεί να προκαλεί σύγχυση. Όταν όμως εξοικειωθεί με την δυνατότητα αυτή θα είναι ένα σημαντικό πλεονέκτημα για τον ίδιο καθώς, θα πρέπει να θυμάται λιγότερες συ-ναρτήσεις. Οι συναρτήσεις ones και zeros είναι παρόμοιες: η ones δημιουργεί έναν πίνα-κα με μονάδες και η zeros έναν πίνακα με μηδενικά. Και οι δυο αυτές συναρτή-σεις δαίχονται δύο ορίσματα. Το πρώτο όρισμα είναι το πλήθος των γραμμών του πίνακα και το δεύτερο είναι το πλήθος των στηλών του: >> D = ones(3,3) D = 1 1 1 1 1 1 1 1 1 Φυσικά, ο πίνακας δεν είναι απαραίτητο να είναι τετραγωνικός. >> E = ones(2, 4) E = 1 1 1 1 1 1 1 1 Βέβαια, οι ones και zeros μπορούν να χρησιμοποιηθούν για τη δημιουργία δια-νυσμάτων γραμμών ή στηλών: >> s = ones(1, 4) s = 1 1 1 1 >> t = zeros(3, 1) t = 0 0 0 Η συνάρτηση linspace δημιουργεί διανύσματα γραμμές με στοιχεία που διαφέ-ρουν ισομετρικά. Χρησιμοποιείται με δύο μορφές linspace(αρχικήΤιμή, τελικήΤιμή)

Page 20: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 214

και linspace(αρχικήΤιμή, τελικήΤιμή, πλήθοςΣημείων) όπου οι παράμετροι αρχικήΤιμή και τελικήΤιμή είναι η αρχική και τελική τιμή της ακολουθίας των στοιχείων και η παράμετρος πλήθοςΣημείων είναι ο αριθμός των στοιχείων που είναι να δημιουργηθούν. Για παράδειγμα, μπορεί να έχουμε >> u = linspace(0.0, 0.25, 5) u = 0 0.0625 0.1250 0.1875 0.2500 Στην μορφή με τις δύο παραμέτρους, η παράμετρος πλήθος Σημείων δέχεται εξ ορισμού την τιμή 100. Στην βασική της μορφή, η συνάρτηση linspace δημιουργεί διανύσματα γραμ-μή. Για την δημιουργία διανύσματος στήλη απλώς χρησιμοποιείστε τον τελεστή αναστροφής, όπως στο παρακάτω παράδειγμα >> v = linspace(0, 9, 4)' v = 0 3 6 9 Η συνάρτηση logspace είναι παρόμοια με την linspace, απλώς δημιουργεί στοιχεία που διαφέρουν λογαριθμικά μεταξύ τους. Η εντολή >> logspace(αρχικήΤιμή, τελικήΤιμή, πλήθοςΣημείων) δημιουργεί πλήθος στοιχείων ίσο με πλήθοςΣημείων ανάμεσα στις τιμές 10αρχικήΤιμή και 10τελικήΤιμή, όπως στην παρακάτω εντολή: >> w = logspace(1, 4, 4) w = 10 100 1000 10000 Αν το τρίτο όρισμα παραληφθεί, δημιουργούνται 50 στοιχεία ανάμεσα στις τιμές 10αρχικήΤιμή και 10τελικήΤιμή.

Page 21: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 215

Παράδειγμα 1.1: Πίνακας Τιμών Τριγωνομετρικών Συναρτήσεων Οι εντολές του MATLAB που ακολουθούν, δημιουργούν διανύσματα που περιέ-χουν τιμές τριγωνομετρικών συναρτήσεων. Κατόπιν, τα διανύσματα αυτά συνδυά-ζονται για να σχηματίσουν τις στήλες ενός πίνακα έτσι ώστε οι τιμές να εμφανι-στούν σε πινακοειδή μορφή: >> x = linspace(0, 2*pi, 6); >> s = sin(x); >> c = cos(x); >> t = tan(x); >> [x' s' c' t'] ans = 0 0 1.0000 0 1.2566 0.9511 0.3090 3.0777 2.5133 0.5878 -0.8090 -0.7265 3.7699 -0.5878 -0.8090 0.7265 5.0265 -0.9511 0.3090 -3.0777 6.2832 -0.0000 1.0000 -0.0000 Η έκφραση [x' s' c' t'] δημιουργεί έναν πίνακα του οποίου οι στήλες είναι τα ανάστροφα των διανυσμάτων x, s, c και t. Τι συμβαίνει αν παραληφθούν οι τελεστές αναστροφής; Μπορείτε να δημιουργήσετε έναν πίνακα στον οποίο η πρώτη γραμμή να περιέχει τις τιμές του x και η δεύτερη μέχρι την τέταρτη να πε-ριέχουν τις τιμές των s, c, και t, αντιστοίχως;

1.2.2 Συμβολισμός Δεικτών για τα Στοιχεία Πινάκων Τα στοιχεία των πινάκων αναφέρονται χρησιμοποιώντας συμβολισμό δεικτών με τρόπο παρόμοιο με αυτόν της Fortran. Αν v είναι ένα διάνυσμα γραμμή ή στήλη, το v(k) αναφέρεται στο k-οστό στοιχείο του διανύσματος. Αν Α είναι ένας πίνα-κας, το A(m,n) αναφέρεται στο στοιχείο της m-οστής γραμμής και n-οστής στή-λης, όπως φαίνεται >> Α = ; 1 2 3; 4 5 6; 7 8 9

>> Α(3,2) ans = 8

Page 22: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 216

Κατά την εξαγωγή τιμών από πίνακα, η χρήση δεικτών πέραν των διαστάσεων του πίνακα έχει σαν αποτέλεσμα σφάλμα: >> A=[1 2 3;4 5 6;7 8 9]; >> A(1,4) ??? Index exceeds matrix dimensions. Ο συμβολισμός δεικτών μπορεί να χρησιμοποιηθεί για την ανάθεση τιμών σε στοι-χεία πίνακα: >> A=[1 2 3;4 5 6;7 8 9]; >> A(1,1)=-2 A = -2 2 3 4 5 6 7 8 9 Αντίθετα από την προσπάθεια εξαγωγής στοιχείου εκτός του διαστήματος δεικτών ενός πίνακα, μια πράξη ανάθεσης μπορεί, νόμιμα, να αναφέρεται σε δείκτες γραμ-μών και στηλών που δεν αποτελούν μέρος του πίνακα. Αν μια εντολή ανάθεσης χρησιμοποιεί έναν δείκτη μεγαλύτερο από τις τρέχουσες διαστάσεις του πίνακα το MATLAB απλώς αυξάνει το μέγεθος του πίνακα, προκειμένου να συμπεριλάβει το νέο στοιχείο(α). >> D = eye(3,5) D = 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 >> D(4,2) = -2 D = 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 -2 0 0 0 Οι πίνακες που μεγαλώνουν αυτόματα για να ανταποκριθούν σε ανάγκες είναι ένα ισχυρό χαρακτηριστικό που ελαττώνει τη μονοτονία και την πολυπλοκότητα κά-ποιων διεργασιών της γραμμικής άλγεβρας. Ωστόσο, όπως πολλά από τα εξαίρετα χαρακτηριστικά στοιχεία του MATLAB, αυτό μπορεί να οδηγεί σε ολέθρια σφάλ-ματα.

Page 23: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 217

Οι συναρτήσεις length και size χρησιμοποιούνται για να προσδιορίσουν το πλήθος των στοιχείων σε διανύσματα και πίνακες. Οι συναρτήσεις αυτές είναι ι-διαίτερα χρήσιμες όταν κάποιος δουλεύει με πίνακες μεταβλητού ή αγνώστου με-γέθους, ειδικότερα δε, όταν γράφει βρόχους. (βλ. §2.4.5 – 2.4.6). Για παράδειγμα, οι παρακάτω εντολές δημιουργούν ένα διάνυσμα και αντικαθιστούν το τελευταίο του στοιχείο με μηδέν: >> x = 0:5 x = 0 1 2 3 4 5 >> n = length(x) n = 6 >> x(n) = 0 x = 0 1 2 3 4 0 Η εντολή size επιστρέφει δύο τιμές και έχει την ακόλουθη σύνταξη: [nrows,mcols] = size(matrix) όπου nrows και mcols είναι τα πλήθη των γραμμών και των στηλών, αντιστοί-χως, στον πίνακα matrix. Σημειώστε ότι οι παράμετροι επιστροφής πρέπει να διαχωρίζονται με κόμμα και να περικλείονται σε αγκύλες. Παρατίθενται μερικά παραδείγματα που κάνουν χρήση της συνάρτησης size: >> A = eye(3,5); >> [nr, nc] = size(A) nr = 3 nc = 5 >> B = zeros(size(A)) B = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Page 24: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 218

Το δεύτερο παράδειγμα δείχνει ότι το αποτέλεσμα της συνάρτησης size μπορεί να χρησιμοποιηθεί σαν όρισμα μιας άλλης εντολής. Αυτός ο τύπος έκφρασης χρη-σιμοποιείται συχνά για την αρχικοποίηση ενός πίνακα έτσι ώστε να έχει το ίδιο σχήμα με κάποιον άλλο πίνακα. Φυσικά, σε αυτό το παράδειγμα, ο ορισμός του πίνακα Β θα μπορούσε να επιτευχθεί με την Β=zeros(nr,nc) όπου nr και nc ανατίθενται με την [nr,nc] = size(A).

1.2.3 Ο συμβολισμός άνω - κάτω τελεία (:) Το MATLAB έχει μια ισχυρή και πολύ συμπαγή σύνταξη, η οποία αναφέρεται ως συμβολισμός άνω - κάτω τελεία. Ο συμβολισμός αυτός μπορεί να χρησιμοποιηθεί είτε στη δημιουργία διανυσμάτων ή, σε συνδυασμό με τον συμβολισμό δεικτών (προηγούμενη ενότητα), στην εξαγωγή πεδίων τιμών των στοιχείων πινάκων. Αν και ο συμβολισμός άνω - κάτω τελεία είναι πολύ λακωνικός και κατά κάποιο τρό-πο «ξυπναδιάρικος» για να τον κατέχει κάποιος, μπορεί να χρησιμοποιηθεί παρέ-χοντας πολλά πλεονεκτήματα. Δύο μορφές συμβολισμού άνω - κάτω τελείας χρησιμοποιούνται για τη δημιουργία διανυσμάτων: διάνυσμα = αρχικήΤιμή:τελικήΤιμή διάνυσμα = αρχικήΤιμή:αύξηση:τελικήΤιμή Εδώ, οι τιμές αρχικήΤιμή και τελικήΤιμή είναι τα άκρα του διαστήματος, η τιμή αύξηση είναι η διαφορά ανάμεσα στα σημεία του διαστήματος και διάνυσμα είναι το αποτέλεσμα. Δείτε τα παραδείγματα: >> s = 1:5 s = 1 2 3 4 5 >> t = 0:0.1:0.5 t = 0 0.1000 0.2000 0.3000 0.4000 0.5000 Το δεύτερο παράδειγμα δείχνει ότι οι τιμές αρχικήΤιμή, αύξηση και τελικήΤιμή δεν είναι απαραίτητο να είναι ακέραιοι. Όπως με την linspace συνάρτηση, οι πα-ραστάσεις με άνω -κάτω τελεία δημιουργούν διανύσματα γραμμή, εξ ορισμού. Προκειμένου να δημιουργήσουμε ένα διάνυσμα στήλη, περικλείουμε την παρά-σταση σε παρενθέσεις και επισυνάπτουμε τον τελεστή αναστροφής: >> u = (1:5)'

Page 25: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 219

u = 1 2 3 4 5 Οι παρενθέσεις είναι απαραίτητες γιατί ο τελεστής αναστροφής έχει υψηλότερη προτεραιότητα από το σύμβολο (:).2 Για παράδειγμα, >> v = 1:5' v = 1 2 3 4 5 έχει σαν αποτέλεσμα ένα διάνυσμα γραμμή γιατί ο τελεστής αναστροφής εφαρμό-στηκε στο βαθμωτό μέγεθος 5 πριν δημιουργηθεί το διάνυσμα. Ένα σύμβολο (:) μπορεί να χρησιμοποιηθεί σαν μπαλαντέρ για να αναφερθούμε σε μια ολόκληρη γραμμή ή στήλη: >> A=[1 2 3;4 5 6;7 8 9]; >> A(:,1) ans = 1 4 7 >> A(2,:) ans = 4 5 6 Εναλλακτικά, ένα πεδίο τιμών μπορεί να επιλεγεί χρησιμοποιώντας μια παράστα-ση με (:) στη θέση ενός απλού δείκτη: >> A = [1 2 3;4 5 6;7 8 9]; >> A(2:3,1) ans = 4 7 >> A(1:2,2:3) ans = 2 βλ. § 2.4.2 για τους κανόνες προτεραιότητας τελεστών.

Page 26: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 220

2 3 5 6 Ο συμβολισμός άνω - κάτω τελεία μπορεί επίσης να χρησιμοποιηθεί σε πράξεις ανάθεσης τιμών. Οι παρακάτω εντολές δημιουργούν έναν πίνακα μονάδων και μετά αναθέτουν νέες τιμές στην πρώτη γραμμή: >> B = ones(3,4); >> B(1,:) = [2 4 6 8] B = 2 4 6 8 1 1 1 1 1 1 1 1 Η δεύτερη εντολή μπορεί να συντμηθεί περισσότερο με το σύμβολο (:) >> B = ones(3,4); >> B(1,:) = 2:2:8 B = 2 4 6 8 1 1 1 1 1 1 1 1 Σε ορισμένες περιπτώσεις μπορεί κανείς να χρειαστεί να ανακτήσει την τελευταία τιμή, την προτελευταία κ.λπ. τιμή από έναν πίνακα ή διάνυσμα. Ένας τρόπος να το κάνει αυτό είναι ο ακόλουθος: x = . . . % ορίζει το διάνυσμα x s = x(end) % το τελευταίο στοιχείο του x t = x(end-1) % το προτελευταίο στοιχείο του x, % κ.λπ. Σε αυτό το σημείο, μπορεί να χρησιμοποιηθεί η λέξη-κλειδί end αντί να ορίσουμε μια μεταβλητή να είναι ίση με το μήκος του διανύσματος. Για παράδειγμα, θα μπορούσαμε να έχουμε >> x = rand(1,5) x = 0.9501 0.2311 0.6068 0.4860 0.8913 >> x(end) ans = 0.8913

Page 27: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 221

>> x(end-1) ans = 0.4860 Η λέξη-κλειδί end έχει εφαρμογή και στους πίνακες κατά έναν προφανή τρόπο: >> A = [1 2 3;4 5 6;7 8 9]; >> B = A(2:end,1:end-1) B = 4 5 7 8

1.2.4 Διαγραφή Στοιχείων από Διανύσματα και Πίνακες Το MATLAB δίνει την δυνατότητα διαγραφής μεμονωμένων ή ομαδοποιημένων στοιχείων από διανύσματα και πίνακες αναθέτοντας στα στοιχεία αυτά τον κενό πίνακα,[ ]. Αν x είναι ένα ήδη ορισμένο διάνυσμα, η ανάθεση x = [ ] απαλείφει όλα τα στοιχεία του διανύσματος. Συγκεκριμένα στοιχεία ενός διανύσματος απα-λείφονται χρησιμοποιώντας τις κατάλληλες εντολές, όπως >> x = 1:5; % δημιουργεί ένα διάνυσμα x >> x(3) = [ ] % και διαγράφει το τρίτο στοιχείο του x = 1 2 4 5 Χρησιμοποιώντας τον κατάλληλο συμβολισμό μπορούμε να διαγράψουμε τμήμα-τα στοιχείων ενός διανύσματος: >> x = 1:5; >> x(1:3) = [] % διαγράφει τα πρώτα τρία στοιχεία x =

4 5 >> x = 1:10; >> x(1:2:9) = [ ] % διαγράφει τα περιττής τάξεως στοιχεία x = 2 4 6 8 10 >> x = 1:10; >> x(length(x)-3:length(x)) = [] % διαγράφει τα τέσσερα

% τελευταία στοιχεία

Page 28: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 222

x = 1 2 3 4 5 6 Οι προηγούμενες εντολές μπορούν να περιοριστούν χρησιμοποιώντας τη λέξη-κλειδί end: >> x = 1:10; >> x(end-3:end)=[] x = 1 2 3 4 5 6 Οι πράξεις απαλοιφής σε πίνακες πρέπει να αφορούν ολόκληρες γραμμές ή στή-λες: >> A = [1 2 3;4 5 6;7 8 9]; >> A(:,1) = [] A = 2 3 5 6 8 9 >> A = [1 2 3;4 5 6;7 8 9]; >> A(3,3) = [] ??? Indexed empty matrix assignment is not allowed. Το στοιχείο (3,3) δεν μπορεί να απαλοιφθεί γιατί οι πίνακες πρέπει να διατηρούν το ορθογώνιο σχήμα τους.

1.2.5 Πράξεις με Πίνακες Οι βασικές αριθμητικές πράξεις της πρόσθεσης, της αφαίρεσης και του πολλαπλα-σιασμού μπορούν να εφαρμοστούν άμεσα σε πίνακες μεταβλητές, υπό τον όρο ότι η συγκεκριμένη πράξη διέπεται από τους κανόνες της Γραμμικής Άλγεβρας. Για παράδειγμα, η πρόσθεση και η αφαίρεση δύο διανυσμάτων γραμμής ίσου μεγέθους είναι επιτρεπτή: >> u = [10 9 8]; % τα u και v είναι διανύσματα-γραμμές >> v = [1 2 3]; >> u + v % το άθροισμα είναι στοιχείο προς στοιχείο ans = 11 11 11

Page 29: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 223

>> u – v % η διαφορά είναι στοιχείο με στοιχείο ans = 9 7 5 Ο τελεστής * εκτελεί τον κατάλληλο πολλαπλασιασμό πίνακα με πίνακα, πίνακα με διάνυσμα, εσωτερικό και εξωτερικό γινόμενο, ανάλογα με το είδος των τελε-στέων. Δοθέντων δύο συμβατών πινάκων Α και Β, η παράσταση Α*Β του MATLAB υπολογίζει το γινόμενο των Α και Β όπως ορίζεται από τους κανόνες της Γραμμικής Άλγεβρας. Τα παρακάτω είναι παραδείγματα γινομένων πίνακα με πί-νακα και πίνακα με διάνυσμα: >> A = ones(2,3); >> B = [1 2;3 4;5 6]; >> A*B ans = 9 12 9 12 >> C = diag(1:3); D = ones(3,3); >> C*D ans = 1 1 1 2 2 2 3 3 3 >> x = [1; 0; 1;]; >> A*x ans = 2 2 >> C*x ans = 1 0 3 Το εσωτερικό γινόμενο δύο διανυσμάτων είναι αριθμός. Στην Γραμμική Άλγεβρα το εσωτερικό γινόμενο είναι αποτέλεσμα του πολλαπλασιασμού ενός διανύσματος γραμμή και ενός διανύσματος στήλης. Για παράδειγμα, το γινόμενο ενός διανύ-σματος γραμμή u, με τέσσερα στοιχεία, και ενός διανύσματος στήλη v, με τέσσε-ρα στοιχεία, δίνεται από:

Page 30: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 224

uv = = u1v1 + u2v2 + u3v3 + u4v4 4321 uuuu

4321

4

3

2

1

v

v

v

v

Αν υ και w είναι και τα δύο διανύσματα στήλη, τότε το εσωτερικό γινόμενο τους υπολογίζεται μετατρέποντας το ένα διάνυσμα γραμμή σε διάνυσμα στήλη, έστω υ. Υποθέτοντας για λόγους ευκολίας ότι έχουμε δύο διανύσματα τεσσάρων στοιχεί-ων, έχουμε

υΤw = = υ1w1 + υ2w2 + υ3w3 + υ4w4.

4

3

2

1

w

w

w

w

Οι παρακάτω πράξεις υποστηρίζονται άμεσα από τον τελεστή * του MATLAB: >> u=[10 9 8 6]; v=[1; 2; 3; 4]; >> u*v ans = 76 >> w=[1; 0; 1; -1] w = 1 0 1 -1 >> v'*w % προσέξτε τον τελεστή αναστροφής στο v ans = 0 Το εσωτερικό γινόμενο μπορεί, επίσης, να υπολογιστεί με την ενσωματωμένη συ-νάρτηση dot, η οποία δέχεται σαν ορίσματα δύο διανύσματα με τον ίδιο αριθμό στοιχείων. Σε αντίθεση με την χρήση του τελεστή *, η χρήση της συνάρτησης dot γίνεται ανεξάρτητα από το είδος των διανυσμάτων, αν είναι δηλαδή και τα δύο διανύσματα, διανύσματα γραμμή ή διανύσματα στήλη:

Page 31: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 225

>> dot(u,v) ans = 76 >> dot(v,w) ans = 0 Η συνάρτηση dot είναι κατά κάποιο τρόπο λιγότερο αποτελεσματική από τον τελεστή (*) γιατί εκτελεί κάποιους επιπλέον ελέγχους συμβατότητας και επανα-σχηματισμού. Διανυσματικοποίηση και Τελεστές Πινάκων Όλες οι ενσωματωμένες συναρ-τήσεις στο MATLAB είναι «διανυσματικοποιημένες», πράγμα που σημαίνει ότι, δοθέντος ενός διανύσματος ως εσωτερικού ορίσματος, η πράξη που σημειώνεται με το όνομα της συγκεκριμένης συνάρτησης εφαρμόζεται σε όλα τα στοιχεία του διανύσματος. Η διανυσματικοποίηση έχει ως αποτέλεσμα οι πράξεις να εκτελού-νται με μια συνοπτική σύνταξη. Ωστόσο, περισσότερο σημαντικό είναι το κέρδος από την απόδοση των υπολογισμών, όποτε χρησιμοποιούνται διανυσματικοποιη-μένες πράξεις αντί για βρόχους 3 (αλληλουχία επαναλαμβανόμενων εντολών) που διαπερνούν όλα τα στοιχεία ενός πίνακα ή διανύσματος. Θεωρείστε, για παράδειγμα, τη συνάρτηση cos: >> x = 0:pi/4:pi x = 0 0.7854 1.5708 2.3562 3.1416 >> y = cos(x) y = 1.0000 0.7071 0.0000 -0.7071 -1.0000 Κατά τον υπολογισμό της παράστασης y = cos(x), ο διερμηνευτής του MATLAB διαπιστώνει ότι το x είναι διάνυσμα. Αυτό είναι ένα ιδιαίτερα χρήσιμο χαρακτηριστικό που έχει ως αποτέλεσμα κομψές παραστάσεις του MATLAB. Πα-ρατηρήστε τι θα έπρεπε να εκτελεστεί στη Fortran προκειμένου να γίνουν οι προη-γούμενοι υπολογισμοί:

real x(5), y(5) pi = 3.14159624 dx = pi/4.0

3 Οι βρόχοι περιγράφονται στις παραγράφους § § 2.4.5 και 2.4.6.

Page 32: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 226

do 10 i = 1,5 x(i) = (i-1)*dx y(i) = cos(x(i))

10 continue Προς υποστήριξη της διανυσματικοποίησης, το MATLAB ορίζει νέα αριθμητικά σύμβολα που ονομάζονται array operators, που εκτελούν πράξεις στοιχείο με στοι-χείο σε ένα ζεύγος πινάκων (ή διανυσμάτων) με ίσο αριθμό γραμμών και στηλών. Το αποτέλεσμα μιας πράξης στοιχείο με στοιχείο ανάμεσα σε δυο πίνακες, είναι ένας άλλος πίνακας της αυτής μορφής. Στη Γραμμική Άλγεβρα δεν υπάρχει άμεσα ισοδύναμο σε κάποιες από τις πράξεις αυτές. Οι πράξεις αυτές (στοιχείο με στοι-χείο) θεωρούν τους πίνακες σαν δομές δεδομένων, όχι σαν μαθηματικές οντότητες. Τα σύμβολα των array operators είναι ο συνδυασμός μιας τελείας (.) και ενός συ-νήθους τελεστή από τους *, / και ^. Ο στοιχείο με στοιχείο πολλαπλασιασμός ε-κτελείται με τον τελεστή .* και η στοιχείο με στοιχείο διαίρεση εκτελείται με τον τελεστή ./ : >> w = [1 2 3]; x = [4 5 6]; >> y = w.*x y = 4 10 18 >> z = w./x z = 0.2500 0.4000 0.5000 Οι στοιχείο με στοιχείο πράξεις εφαρμόζονται σε πίνακες αλλά και σε διανύσματα: >> A = [1 2 3;4 5 6;7 8 9]; >> B = [9 8 7;6 5 4;3 2 1]; >> A.*B ans = 9 16 21 24 25 24 21 16 9 Παρατηρήστε ότι το αποτέλεσμα Α.*Β δεν είναι το ίδιο με το Α*Β. Ο τελεστής στοιχείο με στοιχείο εκθετοποίησης, .^, υψώνει όλα τα στοιχεία ενός πίνακα σε μια δύναμη: >> A = [1 2 3;4 5 6;7 8 9];

Page 33: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 227

>> A.^2 ans = 1 4 9 16 25 36 49 64 81 >> A.^(1/2) ans = 1.0000 1.4142 1.7321 2.0000 2.2361 2.4495 2.6458 2.8284 3.0000 Η σύνταξη των array operators απαιτεί την με προσοχή σωστή τοποθέτηση ενός μικρού τυπογραφικού συμβόλου, μιας τελείας (.), σε ένα, μάλλον, σύνθετο τύπο. Αν και το MATLAB θα εντοπίσει τα συντακτικά λάθη, είναι πιθανό, να γίνουν υ-πολογιστικά σφάλματα με νόμιμες πράξεις. Για παράδειγμα, Α.^2 και Α^2 είναι και τα δυο νόμιμα, αλλά όχι ισοδύναμα. Στην Γραμμική Άλγεβρα, η πρόσθεση και η αφαίρεση πινάκων ή διανυσμάτων είναι στοιχείο με στοιχείο πράξεις. Για τον λόγο αυτό, δεν υπάρχουν ειδικοί τελε-στές για την πρόσθεση και την αφαίρεση.

1.2.6 Μετασχηματισμός της Μορφής Πινάκων Μερικές φορές χρειάζεται αναδιοργάνωση των δεδομένων που είναι αποθηκευμέ-να σε έναν πίνακα χωρίς να μετασχηματισθούν μαθηματικά. Για παράδειγμα, για να κάνουμε έναν υπολογισμό πιο αποτελεσματικά, μπορεί να πρέπει να μετατρέ-ψουμε έναν πίνακα σε διάνυσμα. Αν η οπτική εικόνα του πίνακα είναι ένα ορθο-γώνιο, τότε η μετατροπή πίνακα σε διάνυσμα περιλαμβάνει αλλαγή του σχήματος του πίνακα από ένα κανονικό ορθογώνιο σχήμα σε ένα στενόμακρο ορθογώνιο σχήμα. Για την εκτέλεση της πράξης αυτής χρησιμοποιείται η συνάρτηση reshape. Σε άλλες περιπτώσεις, είναι πιο κατάλληλο να χρησιμοποιείται ένα τέχνασμα με το συμβολισμό της ανω – κάτω τελείας (:). Η συνάρτηση reshape έχει τρία εισερχόμενα ορίσματα: ΕξόδουΠίνακας= reshape(εισόδουΠίνακας,νέεςΓραμμές,νέεςΣτήλες) όπου εισόδουΠίνακας είναι ο πίνακας που θα επανασχηματιστεί και νέεςΓραμμές, νέεςΣτήλες είναι ο αριθμός γραμμών και στηλών, αντιστοί-χως, του εξόδουΠίνακας που δημιουργούνται από τα στοιχεία του

Page 34: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 228

εισόδουΠίνακας. Δεν επιτρέπεται μια μερικώς συμπληρωμένη τελευταία στή-λη. Οι επόμενες εντολές παρουσιάζουν την reshape συνάρτηση: >> A = [1 5 9; 2 6 10; 3 7 11; 4 8 12] A = 1 5 9 2 6 10 3 7 11 4 8 12 >> B = reshape(A,2,6) B = 1 3 5 7 9 11 2 4 6 8 10 12 >> s = reshape(A,1,12) s = 1 2 3 4 5 6 7 8 9 10 11 12 Τα στοιχεία του πίνακα Α είναι επιλεγμένα για να επισημάνουν πώς η reshape συνάρτηση αναδιοργανώνει τον εισόδουΠίνακας κατά στήλες. Επειδή ένα διάνυσμα γραμμή ή στήλη είναι πίνακας, η reshape συνάρτηση μπο-ρεί να χρησιμοποιηθεί για τη δημιουργία πινάκων ορθογώνιου σχήματος, από δια-νύσματα: >> t = 1:6; >> C = reshape(t,2,3) C = 1 3 5 2 4 6 Είναι επίσης πιθανό να αλλάξει το σχήμα ενός πίνακα επί τόπου (δηλ., χωρίς την αντιγραφή του σε άλλο πίνακα): >> D = [1 2 3; 1 2 3; 1 2 3] D = 1 2 3 1 2 3 1 2 3 >> D = reshape(D,1,9)

Page 35: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 229

D = 1 1 1 2 2 2 3 3 3 Ο τελεστής (:) μπορεί να χρησιμοποιηθεί στον επανασχηματισμό ενός πίνακα σε διάνυσμα στήλη. Η εντολή έχει την μάλλον ασυνήθιστη σύνταξη στήληΔιάνυσμα = πίνακας(:) όπου το αποτέλεσμα είναι πάντα ένα διάνυσμα γραμμή και ο πίνακας που βρί-σκεται στα δεξιά μπορεί να έχει οποιονδήποτε αριθμό γραμμών ή στηλών: >> E = [1 4; 2 5; 3 6] E = 1 4 2 5 3 6 >> v = E(:) v = 1 2 3 4 5 6 Δεν είναι και περιοριστικό το ότι η χρήση του συμβόλου (:) έχει σαν αποτέλεσμα διάνυσμα στήλη. Αν απαιτείται ένα διάνυσμα γραμμή, απλώς, προσθέστε τον τε-λεστή αναστροφής: >> E = [1 4; 2 5; 3 6]; >> w = E(:)' w = 1 2 3 4 5 6 Όπως με την reshape, η μέθοδος με την χρήση του συμβόλου (:) μπορεί να ε-φαρμοστεί άμεσα σε ένα διάνυσμα: >> y = 1:5; >> y = y(:) y = 1 2

Page 36: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 230

3 4 5 Ο επανασχηματισμός με τη χρήση του συμβόλου (:) είναι ιδιαίτερα χρήσιμος όταν το εισερχόμενο όρισμα μιας διαδικασίας πρέπει να είναι ένα διάνυσμα στήλη ή γραμμή. Ο τελεστής αναστροφής απλώς μετατρέπει ένα διάνυσμα γραμμή σε ένα διάνυσμα στήλη και αντιστρόφως. Σε αντίθεση, η πράξη με την (:), x(:), παράγει πάντα ένα διάνυσμα στήλη. Οι πράξεις επανασχηματισμού επωφελούνται των ενσωματωμένων δυνατοτήτων διανυσματικοποίησης του MATLAB. Ως αποτέλεσμα, οι πράξεις επανασχηματι-σμού είναι πολύ πιο αποδοτικές από την αλγοριθμικά ισοδύναμη διαδικασία αντι-γραφής στοιχείων, ένα κάθε φορά, σε έναν πίνακα του επιθυμητού σχήματος.

1.3 Πρόσθετοι Τύποι Μεταβλητών Για την επίλυση των περισσότερων αριθμητικών προβλημάτων, οι μεταβλητές στο MATLAB θα παίρνουν είτε αριθμητικές είτε αλφαριθμητικές (string) τιμές. Τα αλ-φαριθμητικά χρησιμοποιούνται κυρίως σε ετικέτες διαγραμμάτων ή σε ονόματα συναρτήσεων ορισμένων από τον χρήστη. Οι αριθμητικές τιμές μπορεί να είναι είτε πραγματικές ή μιγαδικές. Σ’ αυτήν την ενότητα περιγράφονται ενσωματωμένα χαρακτηριστικά του MATLAB που υποστηρίζουν τη χρήση μιγαδικών αριθμών και αλφαριθμητικών. Επίσης, περιγράφεται μια ομάδα συναρτήσεων που για τον χει-ρισμό πολυωνύμων. Στο MATLAB οι μεταβλητές που ορίζονται από τον χρήστη είναι αντικείμενα που περιλαμβάνουν αρκετά ξεχωριστά κομμάτια δεδομένων. Τμήμα του αντικειμένου περιλαμβάνει αλφαριθμητικά ή αριθμητικά δεδομένα που νοούνται ως αποθηκευ-μένα στην μεταβλητή. Ένα άλλο τμήμα κρατάει το μέγεθος του αντικειμένου (δηλ. το πλήθος των γραμμών και στηλών του πίνακα). Επιπροσθέτως, κάθε αντικείμενο περιλαμβάνει μια λίστα χαρακτηριστικών (attributes)που χρησιμοποιούνται εσω-τερικά από το MATLAB. Ένα τέτοιο χαρακτηριστικό είναι μια σημαία ή δείκτης (flag) που δείχνει αν στο αντικείμενο είναι αποθηκευμένοι φανταστικά δεδομένα (φανταστικοί αριθμοί). Οι χρήστες δεν χρειάζεται να νοιάζονται για τα συγκαλυμ-μένα χαρακτηριστικά. αποτελούν μέρος του μηχανισμού στον οποίο οφείλεται η ευκολία του να δουλεύει κανείς με τις μεταβλητές του MATLAB.

Page 37: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 231

1.3.1 Μιγαδικοί Αριθμοί Η αριθμητική των μιγαδικών είναι ολοκληρωμένη πλήρως στο MATLAB. Όλες οι μεταβλητές μπορούν να θεωρούνται ότι είναι μιγαδικές και οι τελεστές +, -, * και /, εκτελούν αυτόματα τους κατάλληλους χειρισμούς με τα πραγματικά και φαντα-στικά μέρη των βαθμωτών και διανυσματικών μεταβλητών και των μεταβλητών

πινάκων. Οι φανταστικές μονάδες i = j = 1 προαναθέτονται στις μεταβλητές i και j. Η χρήση των i και j σε πράξεις ανάθεσης επιτρέπουν την δημιουργία με-ταβλητών με μιγαδικές τιμές κατά φυσικό και προφανή τρόπο: >> x = 1 + 2*i x = 1.0000 + 2.0000i >> y = 1 – 2*i y = 1.0000 – 2.0000i >> z = x*y z = 5 Στις παραπάνω εντολές, αντί του i μπορεί να χρησιμοποιηθεί το j. Ανεξάρτητα από το ποιο σύμβολο (i ή j) χρησιμοποιήθηκε για την αναπαράσταση του φαντα-στικής μονάδας στην είσοδο, το MATLAB πάντα χρησιμοποιεί το i για την εμφά-νιση μιγαδικών τιμών: >> x = 1 + 2*j x = 1.0000 + 2.0000i ΠΙΝΑΚΑΣ 1.3 ΕΝΣΩΜΑΤΩΜΕΝΕΣ ΣΥΝΑΡΤΗΣΕΙΣ ΓΙΑ ΜΙΓΑΔΙΚΟΥΣ ΑΡΙΘ-

ΜΟΥΣ. Συνάρτηση Λειτουργία abs Υπολογίζει το μέτρο ενός αριθμού (δηλ.

abs(z) ισούται με sqrt(real(z)^2 + imag(z)^2)

angle Όρισμα ενός μιγαδικού αριθμού conj Μιγαδικός συζυγής ενός αριθμού imag Εξάγει το φανταστικό μέρος ενός μιγα-

δικού αριθμού real Εξάγει το πραγματικό μέρος ενός μιγα-

δικού αριθμού

Page 38: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 232

Στην ανάθεση μιγαδικών τιμών, σταθερά βαθμωτά πολλαπλάσια του i ή του j μπο-ρούν να δείχνονται με ή χωρίς τον τελεστή (*). Με άλλα λόγια οι >> x = 1 + 2*i και >> x = 1 + 2i είναι ισοδύναμες. Η παράληψη του * επιτρέπεται στην περίπτωση που οι φαντα-στικές μονάδες βρίσκονται στο τέλος μιας υποπαράστασης. Δηλαδή, η ανάθεση x = 1 + i2 δεν είναι επιτρεπτή. Η συντομογραφία δεν δουλεύει με τις μεταβλητές επειδή ο συμβολισμός είναι διφορούμενος: >> w = 2; >> x = 1 + wi ??? Undefined function or variable 'wi'. Σημειώστε ότι i και j είναι απλά μεταβλητές του MATLAB στις οποίες έχει προ-ανατεθεί η τιμή 1 . Αν ξαναανατεθεί οποιαδήποτε από τις δύο μεταβλητές, τότε το αποτέλεσμα των παραπάνω εντολών θα είναι διαφορετικό. Θεωρείστε τον επό-μενο υπολογισμό: >> i = 5; t = 8; u =sqrt(t-i) u = 1.7321 Η ανάθεση i = 5 αντικαθιστά οποιαδήποτε προηγούμενη τιμή που είναι αποθη-κευμένη στην μεταβλητή με όνομα i, έτσι ώστε η t-i έχει σαν αποτέλεσμα την

τιμή 3 και όχι 8 – 1 . Το ενδεχόμενο σύγχυσης αποφεύγεται εύκολα ακολου-θώντας τον ακόλουθο κανόνα:

Κατά τη χρήση μιγαδικών α-ριθμών κρατήστε είτε το i ή το

j για την τιμή της 1 . Σε άλλες γλώσσες προγραμματισμού τα σύμβολα i και j χρησιμοποιούνται συχνά σαν δείκτες πινάκων. Αυτό είναι επιτρεπτό στο MATLAB αλλά απαιτείται ο προη-γούμενος επαναπροσδιορισμός του i ή j: >> A = [1 2; 3 4]; >> i = 2;

Page 39: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 233

>> A(i,i) = 1 A = 1 2 3 1 Μιγαδικοί αριθμοί μπορούν να χρησιμοποιηθούν σε οποιονδήποτε υπολογισμό, αρκεί η ύπαρξη ενός φανταστικού μέρους να έχει νόημα. Ο Πίνακας 1.3 περιέχει τις ενσωματωμένες συναρτήσεις που είναι χρήσιμες στον χειρισμό των μιγαδικών αριθμών. Σχήμα 1.1 Συμβολισμός του Euler για μιγαδικούς αριθμούς. x πραγματικοί

φανταστικοί

iy z = ζeiθ

ζ

θ

Η συνάρτηση exp υποστηρίζει τη χρήση μιγαδικών αριθμών κατά τον συμβολι-σμό του Euler: z =ζeiθ, όπου ζ είναι το μέτρο και θ είναι η γωνία στην αναπαρά-σταση του z με πολικές συντεταγμένες. Το Σχήμα 1.3 δείχνει έναν μιγαδικό αριθμό κατά τον συμβολισμό του Euler και κατά τον συμβολισμό με καρτεσιανές συντε-ταγμένες στο μιγαδικό επίπεδο. Οι εντολές για την περιγραφή ενός μιγαδικού α-ριθμού με ζ = 5 και θ = n/3 είναι, για παράδειγμα, >> zeta = 5; theta = pi/3; z = zeta*exp(i*theta) z = 2.5000 + 4.3301i >> abs(z) ans = 5 >> angle(z)*180/pi ans = 60.0000

Page 40: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 234

Φυσικά, θα μπορούσε να εισαχθεί ο z με καρτεσιανές συντεταγμένες αντί με συμ-βολισμό του Euler. Οι συναρτήσεις real, imag, conj, abs και angle απλο-ποιούν τη μετατροπή μεταξύ αυτών των αναπαραστάσεων. Οι πράξεις του πολλαπλασιασμού και της διαίρεσης μπορούν, αυτόματα, να χειρι-στούν τους συνδυασμούς των μιγαδικών και πραγματικών μερών: >> s = 3*exp(i*pi/3); t = 3*exp(i*2*pi/3); >> s-t ans = 3.0000 >> s+t ans =

0.0000 + 5.1962i >> s*t ans = -9.0000 + 0.0000i >> s/t ans = 0.5000 – 0.8660i Οι υπολογισμοί που ακολουθούν, περιλαμβάνουν πίνακες με μιγαδικά στοιχεία: >> A = [1 2; 3 4] + i*[1 2; 3 4] A = 1.0000 + 1.0000i 2.0000 + 2.0000i 3.0000 + 3.0000i 4.0000 + 4.0000i >> B = abs(A) B = 1.4142 2.8284 4.2426 5.6569 >> C = A*A' C = 10 22 22 50 >> D = A'*A D =

Page 41: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 235

20 28 28 40

1.3.2 Αλφαριθμητικά ή Συμβολοσειρές (Strings) Τα αλφαριθμητικά είναι πίνακες με στοιχεία χαρακτήρες. Οι συνηθισμένοι κανό-νες ανάθεσης και δημιουργίας μεταβλητών εφαρμόζονται και εδώ. Ο απλούστερος τρόπος για τη δημιουργία ενός αλφαριθμητικού είναι να το χρησιμοποιήσουμε στην αριστερή πλευρά ενός συμβόλου ισότητας (=), όπου η έκφραση στα δεξιά του συμβόλου είναι αποτιμάται σε ένα αλφαριθμητικό. Σταθερά αλφαριθμητικά περικλείονται σε μονά εισαγωγικά, όπως φαίνεται παρακάτω: >> first = 'John'; >> last = 'Coltrane'; >> name = [first, ' ', last] name = John Coltrane Οι δυο πρώτες γραμμές ορίζουν δυο αλφαριθμητικές μεταβλητές. Η τρίτη γραμμή δημιουργεί μια νέα αλφαριθμητική μεταβλητή από τρία άλλα αλφαριθμητικά. Αυ-τός ο τύπος ανάθεσης είναι ο πιο ευθύς και άμεσος τρόπος για την σύνδεση αλφα-ριθμητικών. Τμήματα αλφαριθμητικών μπορούν να εξαχθούν με τη χρήση δεικτών και του συμβολισμού της άνω – κάτω τελείας: >> sentence = 'The red ball is on the table'; >> subject = sentence(9:12) subject = ball Αν και τα αλφαριθμητικά χρησιμοποιούνται συχνά σαν διανύσματα – γραμμή, τα διανύσματα – στήλη είναι επίσης επιτρεπτά: >> color = sentence(5:8)' color = r e d Επειδή ο τελεστής αναστροφής και ο χαρακτήρας αρχής ή τέλους του αλφαριθμη-τικού είναι ο ίδιος χαρακτήρας (το μονό εισαγωγικό), η δημιουργία ενός αλφαριθ-μητικού διανύσματος – στήλη με απευθείας ανάθεση απαιτεί τον εγκλεισμό του αλφαριθμητικού κυριολεκτικού σε παρενθέσεις:

Page 42: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 236

>> newColor = ('blue')' newColor = b l u e Επίσης, μπορούν να δημιουργηθούν πίνακες με αλφαριθμητικά: >> fruit = ['apples ';'oranges';'kiwis '] %παρατηρήστε τα επιπλέον κενά fruit = apples oranges kiwis Όπως συμβαίνει με τους αριθμητικούς πίνακες, όλες οι γραμμές ενός πίνακα με αλφαριθμητικά πρέπει να έχουν το ίδιο μήκος. Όταν δημιουργείται η μεταβλητή fruit, οι τιμές “apples” και “kiwis” συμπληρώνονται με κενά, έτσι ώστε να έχουν το ίδιο μήκος με την τιμή “oranges”. Η συνάρτηση str2mat επιτρέπει την εύκολη δημιουργία πινάκων με αλφαριθμητικά συμπληρώνοντας, αυτόματα, με κενά τις τιμές που εισάγονται, έτσι ώστε να έχουν όλες ίδιο μήκος. Κάθε αλφα-ριθμητικό που εισάγεται στην str2mat τοποθετείται σε ξεχωριστή γραμμή του πίνακα – αποτελέσματος. Έτσι, η προηγούμενη εντολή ανάθεσης μπορεί να αντι-κατασταθεί με >> fruit = str2mat('apples','oranges','kiwis') fruit = apples oranges kiwis Στη δημιουργία γραφικών παραστάσεων (βλ. § 1.5.2) ή τη δημιουργία εκτυπώσε-ων (βλ. § 2.3.2), είναι μερικές φορές επιθυμητό να κατασκευαστεί ένα αλφαριθμη-τικό από αριθμητικά δεδομένα. Αυτό επιτυγχάνεται με τη χρήση είτε της συνάρτη-σης num2str ή της συνάρτησης sprintf. Η συνάρτηση num2str μετατρέπει έναν αριθμό σε αλφαριθμητικό με μια απλή σύνταξη. Η συνάρτηση sprintf έχει μια πιο περίπλοκη σύνταξη που επιτρέπει τον έλεγχο της μετατροπής. Μια συνη-θισμένη χρήση της num2str αφορά το χτίσιμο ενός μεγαλύτερου πίνακα αλφα-ριθμητικών από μικρότερα συνθετικά, για παράδειγμα, >> root3 = ['The square root of 3 is ',num2str(sqrt(3))]

Page 43: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 237

root3 = The square root of 3 is 1.732 Σημειώστε ότι η num2str επιστρέφει μια αλφαριθμητική τιμή, γι’ αυτό δεν περι-κλείεται σε εισαγωγικά. Η συνάρτηση num2str έχει ένα δεύτερο, προαιρετικό, όρισμα που χρησιμοποιείται για τον καθορισμό ακρίβειας του εμφανιζόμενου απο-τελέσματος: >> root3 = ['The square root of 3 is ',num2str(sqrt(3),10)] root3 = The square root or 3 is 1.732050808 Η συνάρτηση sprintf επιτρέπει τον προσδιορισμό του πλήθους των στοιχείων που θα εμφανιστούν, όπως φαίνεται στην >> root3 = ('The square root of 3 is %9.7f', (sqrt(3))) root3 = The square root or 3 is 1.7320508 ή την χρήση της εκθετικής μορφής: >> root3 = ('The square root of 3 is %11.5e', (sqrt(3))) root3 = The square root or 3 is 1.73205e+00 Η μορφοποίηση του αλφαριθμητικού της spintf κατασκευάζεται από τα ίδια συνθετικά όπως το αλφαριθμητικό της fpintf που περιγράφεται στην § 2.3.2. (Για επιπλέον πληροφορίες, συμβουλευτείτε το εγχειρίδιο Using MATLAB.)

1.3.3 Πολυώνυμα Το MATLAB παρέχει μερικές ενσωματωμένες συναρτήσεις που εφαρμόζονται στα πολυώνυμα. Ένα πολυώνυμο στο MATLAB είναι απλά ένα διάνυσμα πραγματικών ή μιγαδικών συντελεστών, και σαν τέτοιο, δεν αποτελεί ξεχωριστό τύπο δεδομέ-νων. Συναρτήσεις για υπολογισμούς πολυωνύμων χειρίζονται αυτά τα διανύσματα των συντελεστών. Οι συνηθισμένοι αριθμητικοί τελεστές (+, -, *) και οι στοιχείο με στοιχείο τελεστές (.*, ./, .^) μπορούν να εφαρμοστούν σε διανύσματα πολυωνυ-μικών συντελεστών, αλλά τα αποτελέσματα προκύπτουν μέσω των κανόνων της γραμμικής άλγεβρας και των κανόνων προτεραιότητας των τελεστών του MATLAB.

Page 44: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 238

Ένα πολυώνυμο βαθμού n αναπαριστάται με το διάνυσμα των συντελεστών όταν το πολυώνυμο είναι γραμμένο με φθίνουσες δυνάμεις του x:

Pn(x) = c1xn + c2x

n-1 + . . . + cnx + cn+1. (1.1) Για παράδειγμα το πολυώνυμο x3-2x+12, καθορίζεται από το διάνυσμα [1 0 -2 12]. Δοθέντος ενός πολυωνύμου καθορισμένου από τους συντελεστές του, η συ-νάρτηση polyval υπολογίζει το πολυώνυμο για μια τιμή του x. Έτσι, για τον υπολογισμό του x3-2x+12, για x = -1.5, πληκτρολογήστε >> c = [1 0 -2 12]; >> polyval(c,1.5) ans = 12.3750 ΠΙΝΑΚΑΣ 1.4 ΕΝΣΩΜΑΤΩΜΕΝΕΣ ΣΥΝΑΡΤΗΣΕΙΣ ΓΙΑ ΤΟΝ ΧΕΙΡΙΣΜΟ ΠΟΛΥ-ΩΝΥΜΩΝ. ΑΝ ΔΕΝ ΟΡΙΖΕΤΑΙ ΔΙΑΦΟΡΕΤΙΚΑ, ΤΟ ΠΟΛΥΩΝΥΜΟ ΠΟΥ ΕΙΣΑΓΕ-ΤΑΙ Ή ΕΙΝΑΙ ΑΠΟΤΕΛΕΣΜΑ ΤΩΝ ΣΥΝΑΡΤΗΣΕΩΝ ΑΥΤΩΝ ΕΙΝΑΙ ΕΝΑ ΔΙΑΝΥ-ΣΜΑ ΤΩΝ ΣΥΝΤΕΛΕΣΤΩΝ ΠΟΥ ΟΡΙΖΟΥΝ ΕΝΑ ΠΟΛΥΩΝΥΜΟ ΣΕ ΦΘΙΝΟΥΣΕΣ ΔΥΝΑΜΕΙΣ ΤΗΣ ΑΝΕΞΑΡΤΗΤΗΣ ΜΕΤΑΒΛΗΤΗΣ. Συνάρτηση Περιγραφή conv Υπολογίζει το πολυώνυμο που προκύπτει από το γινόμενο δύο

πολυωνύμων. deconv Υπολογίζει το πολυώνυμο που προκύπτει από τη διαίρεση δύο πο-

λυωνύμων. poly Δημιουργεί ένα πολυώνυμο με καθορισμένες ρίζες. polyder Υπολογίζει το πολυώνυμο το πολυώνυμο που προκύπτει από την

παραγώγιση ενός πολυωνύμου. polyval Βρίσκει την τιμή ενός πολυωνύμου Pn(x) σε συγκεκριμένο x polyvalm Βρίσκει μια πολυωνυμική παράσταση για έναν τετραγωνικό πίνακα

Α. Δυνάμεις του Α βρίσκονται ως γινόμενα πίνακα με πίνακα. polyfit Υπολογίζει τους συντελεστές του πολυωνύμου y = Pn(x), βαθμού n,

που παρεμβάλλεται με τη μέθοδο των ελαχίστων τετραγώνων σε ένα σύνολο δεδομένων (x, y).

residue Υπολογίζει την ανάπτυξη σε μερικά κλάσματα του λόγου δυύ πο-λυωνύμων, ή, δοθέντων των διανυσμάτων που περιλαμβάνουν τα υπόλοιπα τους πόλους και τους ευθείς συντελεστές, υπολογίζει τον αντίστοιχο λόγο των πολυωνύμων.

roots Επιστρέφει τις n ρίζες ενός πολυωνύμου βαθμού n.

Page 45: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 239

Οι δυο προηγούμενες εντολές μπορούν να συνδυαστούν [δηλ. polyval([1 0 –2 12], 1.5)]. Αν το εισαγόμενο x είναι ένα διάνυσμα και όχι βαθμωτό, η συ-νάρτηση polyval επιστρέφει ένα διάνυσμα που περιέχει τις τιμές των πολυωνύ-μων που εκτιμώνται σε κάθε xi : >> c = [1 0 -2 12]; >> x = 1:5; >> polyval(c,x) ans = 11 16 33 68 127 Ο Πίνακας 1.4 περιέχει τις ενσωματωμένες συναρτήσεις για τον χειρισμό πολυω-νύμων στο MATLAB (έκδοση 5 και μεταγενέστερες).

1.4 Διαχείριση του Αλληλεπιδραστικού Περιβάλλοντος Κατά την διάρκεια μιας συνεδρίας του MATLAB μπορεί να είναι επιθυμητή η α-ποθήκευση κάποιων ή όλων των μεταβλητών στον δίσκο για μεταγενέστερη χρή-ση, είτε το φόρτωμα ενός σωσμένου από τα πριν συνόλου μεταβλητών, είτε το σβήσιμο κάποιων ή όλων των μεταβλητών από τη μνήμη. Αυτές οι ενέργειες έχουν να κάνουν με τον χειρισμό των μεταβλητών στον χώρο εργασίας (workspace) του MATLAB.

1.4.1 Ο Χώρος Εργασίας του MATLAB Όταν ορίζεται μια μεταβλητή μέσω μιας εντολής του χρήστη, ο διαχειριστής μνή-μης του MATLAB δεσμεύει ένα μέρος της μνήμης τυχαίας προσπέλασης του υπο-λογιστή (RAM) για τα δεδομένα καθώς και για τα άλλα στοιχεία που χρειάζονται για την πλήρη περιγραφή του αντικειμένου μεταβλητή. Από τη στιγμή που οριστεί μια μεταβλητή, αυτή γίνεται μέρος του χώρου εργασίας του MATLAB. Ο χώρος εργασίας μπορεί να θεωρηθεί ως μια λίστα όλων των μεταβλητών που ορίζονται σε οποιαδήποτε στιγμή σε μια συνεδρία του MATLAB. Για να δείτε πως δουλεύει αυτό, ξεκινείστε το MATLAB και πληκτρολογήστε τις ακόλουθες εντολές: >> clear >> a =5; b =2; c = 1; >> d(1) = sqrt(b^2 – 4*a*c); d(2) = -d(1); >> who Your variables are: a b c d

Page 46: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 240

Η εντολή who επιστρέφει μια λίστα των μεταβλητών που έχουν οριστεί στο χώρο εργασίας καθώς και τη μνήμη που χρησιμοποιείται από αυτές τις μεταβλητές. Η εντολή whos (‘‘who’’ + ‘‘size’’) παρέχει πιο λεπτομερή πληροφορία: >> whos

Name Size Bytes Class a 1x1 8 double array b 1x1 8 double array c 1x1 8 double array d 1x2 32 double array (complex)

Grand total is 5 elements using 56 bytes Αυτός ο πίνακας δίνει τις διαστάσεις του πίνακα για κάθε μεταβλητή (“1x1” για βαθμωτές μεταβλητές), τον αριθμό των bytes που δεσμεύονται από όλον τον πίνα-κα μεταβλητή και την ‘‘κλάση’’ της μεταβλητής. Η κλάση ορίζει τον τρόπο με τον οποίο η πληροφορία, που περιέχεται στη μεταβλητή, είναι αποθηκευμένη στη μνήμη και πώς προσπελαύνεται, όπως επίσης τους τύπους πράξεων που είναι επι-τρεπτοί για τη μεταβλητή. Οι ενσωματωμένοι τύποι κλάσης είναι double, sparse, struct, cell και char. Το MATLAB επιτρέπει επίσης τη δημιουργία κλάσεων ορισμένων από τον χρήστη. Για την υλοποίηση βασικών αριθμητικών μεθόδων, χρειάζεται μόνο να χρησιμοποιήσουμε μεταβλητές κλάσης double, οι οποίες χρησιμοποιούνται για την αποθήκευση αριθμητικών τιμών. Η κλάση char θα χρησιμοποιείται περιστασιακά για τον χειρισμό αλφαριθμητικών χαρακτήρων, με κύριες εφαρμογές τη δημιουργία μορφοποιημένου αποτελέσματος ή την τοπο-θέτηση ετικετών σε διαγράμματα. Συμβουλευτείτε το εγχειρίδιο Using MATLAB για πληροφορίες σε σχέση με άλλες κλάσεις μεταβλητών. Καθώς ορίζονται περισσότερες μεταβλητές, αυτές προστίθενται στο χώρο εργασί-ας. Ο χώρος εργασίας μεγαλώνει μέχρι να χρησιμοποιηθεί μια εντολή clear ή μέχρι το τέλος της συνεδρίας του MATLAB. Η ιχνηλάτηση των μεταβλητών στον χώρο εργασίας είναι πολύ σημαντική όταν κάποιος δουλεύει με script files τα ο-ποία περιγράφονται στην § 2.1. Όταν χρησιμοποιούνται μεγάλοι πίνακες σε μια αλληλεπιδραστική συνεδρία, μπορεί να είναι ωφέλιμο να κάνουμε clear κάποιες μη χρησιμοποιούμενες μεταβλητές, προκειμένου να ελευθερώσουμε μνήμη στο χώρο εργασίας. Σ’ αυτήν την περίπτωση, μπορεί να χρησιμοποιηθεί η εντολή whos για να καθοριστούν οι μεταβλητές που δεσμεύουν την περισσότερη μνήμη. Κατόπιν, οι μεταβλητές αυτές μπορούν να διαγραφούν επιλεκτικά με την εντολή clear, με την προϋπόθεση φυσικά ότι δεν χρειάζονται πλέον. Για παράδειγμα,

Page 47: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 241

για να διαγράψετε τις a και d μεταβλητές από το προηγούμενο παράδειγμα συνε-δρίας, πληκτρολογήστε >> clear a d

1.4.2 Δουλεύοντας με Δεδομένα από Εξωτερικά Αρχεία Τα αποτελέσματα μιας συνεδρίας του MATLAB μπορούν να αποθηκευθούν στον δίσκο και να επαναφορτωθούν σε μια άλλη συνεδρία του ή να εξαχθούν για χρήση από άλλα προγράμματα. Δεδομένα που είναι αποτέλεσμα πειραματικών μετρήσε-ων ή έχουν αποθηκευθεί από άλλα προγράμματα μπορούν να εισαχθούν στο MATLAB για περαιτέρω ανάλυση. Οι απλούστερες και λιγότερο ευέλικτες εντολές εισαγωγής και εξαγωγής δεδομένων είναι οι load και save, αντιστοίχως. Το πλεονέκτημα της χρήσης των save και load είναι ότι τα δεδομένα μπορούν να εξαχθούν και να εισαχθούν με ένα μόνο βήμα και ο χρήστης δεν χρειάζεται να α-σχοληθεί με λεπτομέρειες εισόδου και εξόδου (I/O). Πιο ισχυρές συναρτήσεις, και όχι δύσκολες στην χρήση, απαιτούν από τον χρήστη να εκτελέσει κάποια επιπλέον βήματα και να καθορίσει ακριβώς τον τρόπο με τον οποίο τα δεδομένα μετατρέπο-νται στο ή από το αρχείο. Οι εντολές save και load. Η εντολή save εγγράφει σ’ ένα αρχείο μεταβλητές που έχουν οριστεί στην ενεργή συνεδρία του MATLAB. Απλές μορφές της save ως ακολούθως: save fileName save fileName variable1 variable2 … save fileName variable1 variable2 … -ascii Σε κάθε μία περίπτωση, πρέπει να ορίζεται το όνομα του αρχείου προορισμού. Αν δεν δίνεται κάποια λίστα μεταβλητών, τότε όλες οι μεταβλητές που έχουν οριστεί στον χώρο εργασίας εγγράφονται στο αρχείο. Το αποτέλεσμα των δυο πρώτων εντολών είναι η δημιουργία ενός δυαδικού αρχείου (binary file) με κατάληξη “.mat”. Το αρχείο τύπου mat περιέχει τα ονόματα και το μέγεθος των μεταβλη-τών, καθώς επίσης και τα δεδομένα που είναι αποθηκευμένα στα στοιχεία του πί-νακα. Για παράδειγμα, οι εντολές >>clear >> x = 0:5; y = 5*x; >> save xyfile

Page 48: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 242

δημιουργούν το αρχείο xyfile.mat που περιέχει τις μεταβλητές x και y 4. Η εντολή save έχει έναν ισοδύναμο ‘‘τύπο συνάρτησης’’, save('fileName', 'var1', 'var2', . . .) όπου filename είναι το όνομα του mat αρχείου που είναι να δημιουργηθεί και var1, var2, … είναι τα ονόματα των μεταβλητών που είναι να αποθηκευθούν στο αρχείο. Χρησιμοποιώντας την συνάρτηση save, θα δημιουργήσουμε το αρ-χείο xyfile.mat: >> x = 0:5; y = 5*x; >> save ('xyfile.mat','x', 'y') Παρατηρείστε ότι οι εισαγόμενες παράμετροι είναι οι ‘x’ και ‘y’ (δηλ. τα ονόματα των μεταβλητών). Η ‘‘- ascii’’ μορφή της εντολής save δημιουργεί ένα απλό αρχείο κειμένου που μπορεί να ανοιχθεί με έναν επεξεργαστή κειμένου. Για παράδειγμα, >> x = 0:5; y = 5*x; >> XY = [x' y']; >> save xyvals.txtn XY –ascii δημιουργούν ένα απλό αρχείο κειμένου που θα περιέχει 0.0000000e+00 0.0000000e+00 1.0000000e+00 5.0000000e+00 2.0000000e+00 1.0000000e+01 3.0000000e+00 1.5000000e+01 4.0000000e+00 2.0000000e+01 5.0000000e+00 2.5000000e+01 Στο προηγούμενο παράδειγμα, ο XY πίνακας είναι αναγκαίο να δημιουργηθεί ρη-τά γιατί ο διερμηνέας (interpreter) του MATLAB δεν μπορεί να περάσει τον χαρα-κτήρα ' και τις αγκύλες [] στην εντολή save. Η ascii μορφή της εντολής save απλώς γράφει τις τιμές των στοιχείων του πίνακα στο αρχείο. Αντίθετα, κα-τά τη χρήση του δυαδικού αρχείου τύπου mat στο αρχείο γράφονται τα ονόματα των μεταβλητών, το μέγεθός τους και επιπλέον πληροφορία του χώρου εργασίας. Γενικά, προτείνεται η χρήση της μη-ascii μορφής της εντολής save που δημι-ουργεί αρχεία τύπου mat, ιδιαίτερα στην περίπτωση που οι μεταβλητές θα χρησι-

4 Αν δεν είχε χρησιμοποιηθεί η εντολή clear, όλες οι επιπλέον μεταβλητές που είχαν οριστεί στο χώρο εργασίας θα σώζονταν στο αρχείο xyfile.mat.

Page 49: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 243

μοποιηθούν από το MATLAB αργότερα. Η χρήση της ascii μορφής της εντολής προτείνεται όταν τα δεδομένα πρόκειται να διαβαστούν από ένα άλλο πρόγραμμα, όπως ένα φύλλο εργασίας ή ένας επεξεργαστής κειμένου. Η εντολή load συνοδεύει την save για διάβασμα των δεδομένων στο MATLAB. Υπάρχουν δύο μορφές της εντολής load: load fileName load fileName matrixVariable Η δράση της εντολής load εξαρτάται από τα περιεχόμενα του αρχείου που είναι να διαβαστεί. Η πρώτη μορφή, στην οποία ορίζεται μόνο το όνομα του αρχείου, χρησιμοποιείται για να φορτωθεί ένα δυαδικό mat αρχείο. Αν το fileName είναι ένα δυαδικό mat αρχείο, τότε οι μεταβλητές που είναι αποθηκευμένες σ’ αυτό επαναδημιουργούνται στον τρέχοντα χώρο εργασίας. Η δεύτερη μορφή μπορεί να χρησιμοποιηθεί όταν το αρχείο περιέχει μόνο στήλες με αριθμούς που αντιπροσω-πεύουν έναν πίνακα. Αν το fileName είναι το ascii αρχείο που περιέχει στήλες με αριθμούς, τότε δημιουργείται ένας matrixVariable και όλα τα αποθηκευ-μένα δεδομένα στο αρχείο διαβάζονται στις στήλες του matrixVariable. Η σύνταξη της συνάρτησης load είναι D = load('fileName') όπου fileName είναι είτε ένα mat αρχείο είτε ένα απλό αρχείο κειμένου που πε-ριέχει στήλες δεδομένων. Αν το fileName είναι ένα απλό αρχείο κειμένου, μπο-ρεί να έχει μια επέκταση όπως .dat ή .txt. Αν το fileName είναι ένα mat αρχείο, η μεταβλητή D που δημιουργήθηκε από την D = load('fileName') είναι στο MATLAB μια δομή δεδομένων. Αν το fileName είναι ένα απλό αρχείο κειμένου, η μεταβλητή D θα είναι ένας πίνακας που θα περιέχει όλα τα δεδομένα του fileName. Η παράμετρος fileName μπορεί επίσης να είναι ο καθορισμός ενός μονοπατιού, όπως: >> D = load('C:/myData/somefile.dat') % DOS/Windows file system ή >> D = load('~/myData/someFile.dat') % UNIX file system Παράδειγμα 1.2: Φόρτωμα Πινάκων από mat Αρχεία Θεωρείστε την ακόλουθη συνεδρία στο MATLAB: >> clear

Page 50: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 244

>> x = linspace(0,2*pi); y = cos(x); z = sin(x); >> save trigvar Το αποτέλεσμα είναι η δημιουργία του αρχείου trigvar.mat στον τρέχοντα κατάλογο εργασίας. Πληκτρολογήστε pwd στη γραμμή εντολών για να δείτε τον τρέχοντα κατάλογο εργασίας και πληκτρολογήστε dir ή ls στη γραμμή εντολών για να δείτε τη λίστα με τα ονόματα των αρχείων στον τρέχοντα κατάλογο εργασί-ας. Το αρχείο trigvar.mat περιέχει τα δεδομένα στις μεταβλητές x, y και z, κα-θώς και την αλληλοσυσχέτισή τους με αυτές. Σε κάποια μεταγενέστερη στιγμή στην ίδια συνεδρία του MATLAB ή ίσως αφού κλείσουμε και επανεκκινήσουμε το MATLAB, οι επόμενες εντολές φορτώνουν τις μεταβλητές από το trigvar.mat: >> clear % καθαρίζει το χώρο εργασίας από όλες τις % μεταβλητές (όχι αναγκαίο) >> whos % τώρα ο χώρος είναι άδειος >> load trigvar.mat % διαβάζει τα περιεχόμενα του αρχείου στο χώρο εργασίας >> whos Name Size Bytes Class x 1x100 800 double array y 1x100 800 double array z 1x100 800 double array Αν και οι y και z ορίστηκαν χρησιμοποιώντας μια μαθηματική έκφραση του x, τα δεδομένα του αρχείου trigvar.mat δεν αντικατοπτρίζουν αυτό το γεγονός. Βέβαια, οι μαθηματικές σχέσεις ανάμεσα σε μεταβλητές δεν αποθηκεύονται ποτέ στο χώρο εργασίας. Οι μεταβλητές x, y και z θα μπορούσαν επίσης να εισαγχθούν μέσω της συνάρτη-σης load: >> load('trigvar') Το Μονοπάτι Αναζήτησης (Search Path) Όταν εισάγετε εντολές όπως >> x = 2; >> y = someFunction(x);

Page 51: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 245

το MATLAB ψάχνει μέσω ενός σχετικά μικρού αριθμού προκαθορισμένων κατα-λόγων στον υπολογιστή σας για το m-file

5 της συνάρτησης με όνομα someFunction. Η λίστα των προκαθορισμένων καταλόγων στους οποίους το MATLAB ψάχνει να βρει m-files και δεδομένα, ονομάζeται το μονοπάτι αναζήτη-σης ή, πιο απλά, το μονοπάτι. Αν ένα m-file (π.χ.: someFunction) δεν υπάρχει στο μονοπάτι αναζήτησης, το MATLAB δεν μπορεί να το βρει, γι’αυτό βγάζει ένα μήνυμα λάθους: ??? Undefined function or variable 'someFunction'. Παρόμοια, η προσπάθεια να φορτώσουμε δεδομένα από ένα αρχείο που δεν βρί-σκεται στον μονοπάτι αναζήτησης, έχει σαν αποτέλεσμα ένα λάθος >> load theFile ??? Error using ==> load theFile.mat: File not found Αν και το μονοπάτι αναζήτησης είναι προκαθορισμένο, μπορεί να επανακαθορι-στεί. Συνήθως, το μονοπάτι αναζήτησης επεκτείνεται έτσι ώστε το MATLAB να ψάχνει σε επιπλέον καταλόγους. Η διαμόρφωση του μονοπατιού αναζήτησης σας επιτρέπει την οργάνωση των προσωπικών σας αρχείων του MATLAB σε ξεχωρι-στούς καταλόγους, σύμφωνα με ένα project ή εφαρμογή. Συναρτήσεις Εισόδου/Εξόδου Χαμηλού Επιπέδου Οι load και save μπο-ρούν να θεωρηθούν συναρτήσεις εισόδου/εξόδου υψηλού επιπέδου. Ο χρήστης χρησιμοποιεί μια μόνο εντολή η οποία αυτόματα διαχειρίζεται τις λεπτομέρειες που είναι απαραίτητες για την μεταφορά δεδομένων από και προς το δίσκο. Το κόστος αυτής της απλούστευσης είναι η έλλειψη ελέγχου των λεπτομερειών αυ-τών. Για παράδειγμα, η εντολή load μπορεί να εισάγει δεδομένα αποθηκευμένα σε μορφή mat ή αριθμητικά δεδομένα οργανωμένα σε στήλες. Ωστόσο, αυτό δεν είναι χρήσιμο όταν τα δεδομένα είναι αποθηκευμένα σε ένα απλό αρχείο κειμένου οργανωμένο σε στήλες με επικεφαλίδες στηλών6. Για να γράψετε και να διαβάσετε δεδομένα με μεγαλύτερο έλεγχο πάνω στη μορφή αρχείου, το MATLAB παρέχει

5 Οι συναρτήσεις m-files περιγράφονται με αρκετή λεπτομέρεια στο Κεφάλαιο 2. Προς το παρόν, αυτό που χρειάζεται να γνωρίζετε είναι ότι τα m-files χρησιμοποιούνται για να πε-ριγράψουν υποπρογράμματα τα οποία λειτουργούν ως ενσωματωμένες συναρτήσεις στο MATLAB. Στην πραγματικότητα, οι περισσότερες από τις ενσωματωμένες συναρτήσεις του MATLAB είναι m-files. 6 Φυσικά, κάποιος μπορεί να ανοίξει ένα αρχείο δεδομένων με τον επεξεργαστή κειμένου και να διαγράψει τις επικεφαλίδες των στηλών, αλλά κάτι τέτοιο έρχεται σε αντίθεση με το λόγο χρήσης επικεφαλίδων σε πρώτη θέση.

Page 52: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 246

πολλές συναρτήσεις Ι/Ο χαμηλού επιπέδου. Εδώ, παρουσιάζουμε μια περιορισμέ-νη εισαγωγή στις συναρτήσεις αυτές, με στόχο να δείξουμε πως να διαβάζετε δε-δομένα από ένα αρχείο κειμένου με επικεφαλίδες στηλών. Όταν δουλεύει με αυτές τις συναρτήσεις Ι/Ο χαμηλού επιπέδου, ο χρήστης πρέπει να γνωρίζει τις ιδιαιτε-ρότητες του λειτουργικού συστήματος. Ανατρέξτε στο Using MATLAB για περισ-σότερες πληροφορίες. Η συνάρτηση fopen καθορίζει μια σύνδεση ανάμεσα σε ένα αρχείο και έναν ανα-γνωριστή αρχείων (file identifier). Ο γενικός τύπος της fopen είναι: fid = fopen(fileName, permission) όπου fileName είναι το όνομα του αρχείου που πρόκειται να ανοιχθεί (ή να δη-μιουργηθεί), permission είναι ένα αλφαριθμητικό που υποδεικνύει τα είδη των λειτουργιών των αρχείων που θα επιτρέπονται και fid είναι ο αναγνωριστής αρ-χείων. Τα πιο συνηθισμένα δικαιώματα σε αρχεία περιγράφονται στον Πίνακα 1.5. Ο fid που επιστρέφεται από την fopen είναι μια αριθμητική τιμή, η οποία θα είναι ένας θετικός ακέραιος, αν το αρχείο ανοίχτηκε, επιτυχώς, ή –1 σε περίπτωση σφάλματος. Η τιμή του fid, κατόπιν, χρησιμοποιείται σε λειτουργίες Ι/Ο ενός άλλου αρχείου. Μετά τη χρήση ενός αρχείου για είσοδο και έξοδο, είναι καλή ιδέα να τερματίσουμε τη σύνδεση προς το αρχείο με την fclose, προκειμένου να α-ποφύγουμε τυχαία καταστροφή του αρχείου. Η συνηθισμένη χρήση της fopen είναι: >> fp = fopen('myfile.dat', 'rt') % ανοίγει το αρχείο κειμένου myfile.dat για είσοδο >> … % διαβάζει δεδομένα από το αρχείο >> fclose(fp) % κλείνει το αρχείο ΠΙΝΑΚΑΣ 1.5 ΔΙΚΑΙΩΜΑΤΑ ΑΡΧΕΙΩΝ ΠΟΥ ΧΡΗΣΙΜΟΠΟΙΟΥΝΤΑΙ ΣΥΝΗΘΩΣ ΜΕ ΤΗ ΣΥΝΑΡΤΗΣΗ fopen. ΠΛΗΚΤΡΟΛΟΓΗΣΤΕ “help fopen” ΓΙΑ ΠΕΡΙΣΣΟΤΕΡΕΣ ΠΛΗΡΟΦΟΡΙΕΣ

ΔΙΚΑΙΩΜΑ ΛΕΙΤΟΥΡΓΙΕΣ ΑΡΧΕΙΩΝ 'r' Ανοίγει ένα αρχείο για διάβασμα 'w' Ανοίγει για γράψιμο. Δημιουργεί το αρχείο αν δεν υπάρχει. Γρά-

φει πάνω από ένα υπάρχον αρχείο. 'a' Ανοίγει για προσθήκη. Δημιουργεί το αρχείο αν δεν υπάρχει ήδη.

Αν υπάρχει, προσθέτει δεδομένα στο τέλος του αρχείου. Σημείωση: Οι υπολογιστές που τρέχουν Windows ή VMS χρειάζονται τα δικαιώ-ματα ’rt’ και ’wt’ για να διαβάσουν και να γράψουν σε απλά αρχεία κειμένου.

Page 53: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 247

Όταν ένα αρχείο ανοιχτεί με την fopen, τα περιεχόμενά του μπορούν να διαβα-στούν με τις συναρτήσεις fgetl και fscanf. Η συνάρτηση fgetl διαβάζει μια γραμμή κειμένου από ένα απλό αρχείο κειμένου. Η σύνταξή της είναι line = fgetl(fid) όπου line είναι μια αλφαριθμητική μεταβλητή που περιέχει τη γραμμή κειμένου. Διαφορετικά λειτουργικά συστήματα χρησιμοποιούν διαφορετικούς κανόνες δια-χωρισμού των γραμμών κειμένου σε ένα απλό αρχείο κειμένου. Το τέλος της γραμμής δείχνεται από μια ειδική ακολουθία χαρακτήρων. Ο χαρακτήρας (ες) τέ-λους – γραμμής δεν περιλαμβάνεται (νονται) στο αλφαριθμητικό line που ε-πιστρρέφεται από την fgetl. Αν είναι απαραίτητη η ακολουθία του τέλους – γραμμής (δεν χρησιμοποιείται στις περισσότερες περιπτώσεις), τότε πρέπει να χρησιμοποιηθεί η συνάρτηση fgets (βλ. Using MATLAB). Η συνάρτηση fscanf διαβάζει δεδομένα από ένα αρχείο σε μια μόνο μεταβλητή του MATLAB. Οι προγραμματιστές σε C πρέπει να γνωρίζουν τις σημαντικές δια-φορές στη σύνταξη ανάμεσα στην συνάρτηση fscanf του MATLAB και την ομώνυμη στην C. Η γενική μορφή της συνάρτησης fscanf είναι x = fscanf(fid, format) x = fscanf(fid, format, size) όπου fid είναι ο αναγνωριστής αρχείων που επιστρέφεται από την fopen και format είναι ένα αλφαριθμητικό που δείχνει πως θα ερμηνευθούν τα δεδομένα, κατά τη μετατροπή τους στην επιστρεφόμενη μεταβλητή x (Αλφαριθμητικά μορ-φοποίησης μετατροπών παρουσιάζονται στον Πίνακα 2.2). Για το διάβασμα αριθ-μητικών τιμών είναι απαραίτητο το αλφαριθμητικό μορφοποίησης %f. Η προαιρετική παράμετρος size της fscanf, χρησιμοποιείται για να δείξει την έκταση (μέγεθος) των δεδομένων που θα διαβαστούν από το αρχείο. Αν η size είναι ένας αριθμός n, τότε η συνάρτηση fscanf προσπαθεί να διαβάσει n τιμές από το αρχείο, με τη χρήση της πιστοποιημένης μορφοποίησης της format. Αν η size είναι ένα διάνυσμα – γραμμή δύο στοιχείων, έστω [m n], τότε η μεταβλητή που επιστρέφεται από την fscanf, είναι ένας πίνακας με m γραμμές και n στή-λες. Η χρήση της αντίστοιχης συνάρτησης fprintf για εγγραφή δεδομένων σε ένα απλό αρχείο κειμένου περιγράφεται στην §2.3.2

Page 54: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 248

1.5 Σχεδίαση Διαγραμμάτων στο MATLAB Το MATLAB μπορεί να σχεδιάσει διαγράμματα με αριθμητικά δεδομένα που είναι αποθηκευμένα σε διανύσματα ή πίνακες. Τα δεδομένα μπορούν να προκύ-ψουν από τον υπολογισμό μιας αναλυτικής συνάρτησης ή να διαβαστούν από ένα αρχείο. Βασικές συναρτήσεις σχεδίασης γραμμών χρησιμοποιούνται για τη δημι-ουργία μιας καμπύλης με εξίσωση y = f(x) ή περισσοτέρων, με εξισώσεις y1 = f(x1), y2 = f(x2) κ.λ.π. σε ένα μόνο διάγραμμα. Διδιάστατα δεδομένα της μορφής z = f(x,y) αναπαριστώνται σε μια γραφική παράσταση επιφάνειας. Τρισδιάστατα αντικείμενα (δηλ. φυσικά αντικείμενα, όπως καρέκλες, τραπέζια, εξαρτήματα και άνθρωποι) μπορεί να παρουσιάζονται σαν φωτοσκιασμένες γραφικές παραστάσεις επιφανειών. Κάθε ένα από τα διαγράμματα αυτά, μπορούν να αποκτήσουν κίνηση (animation) με την εμφάνιση μιας ακολουθίας εικόνων σε ταχύτατη αλληλουχία. Σε αυτήν την ενότητα παρουσιάζονται παραδείγματα δημιουργίας βασικών γραμ-μών, σχημάτων και τρισδιάστατων γραφικών. Οι αναγνώστες που ενδιαφέρονται για πιο σύνθετα γραφικά, θα πρέπει να ανατρέξουν στο εγχειρίδιο Using MATLAB Graphics.

1.5.1 Γραφικές Παραστάσεις Γραμμών Οι γραφικές παραστάσεις χρησιμοποιούνται για την παρουσίαση της μεταβολής μιας μεταβλητής – της εξαρτημένης μεταβλητής – σαν συνάρτηση μιας άλλης με-ταβλητής – της ανεξάρτητης μεταβλητής. Υποθέτουμε ότι τα διανύσματα x και y περιέχουν δεδομένα, αποτελέσματα υπολογισμών μιας συνάρτησης με τύπο, y = f(x). Για να δημιουργήσετε μια γραφική παράσταση της y προς x, πληκτρολογήστε τις εντολές >> x = . . . % δημιουργεί δεδομένα x, y >> y = . . . >> plot(x,y) Εξ ορισμού, η συνάρτηση plot συνδέει τα δεδομένα με μια μη διακεκομμένη γραμμή. Ενώ για να εμφανίσετε τα σημεία με κυκλάκια, χρησιμοποιήστε plot(x, y,'o') Το Σχήμα 1.2 περιλαμβάνει δυο απλά παραδείγματα γραφικών παραστάσεων γραμμών. Επίσης, είναι διαθέσιμοι και άλλοι τύποι γραμμών και τύπων συμβόλων. Η γενική μορφή της συνάρτησης plot για ένα ζεύγος δεδομένων είναι

Page 55: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 249

plot(xdata, ydata, symbol) όπου symbol είναι ένα αλφαριθμητικό κατασκευασμένο από τους χαρακτήρες του Πίνακα 1.6. Και οι δύο τύποι χρώματος και συμβόλου (ή γραμμής) μπορούν να συνδυαστούν έτσι ώστε, για παράδειγμα, η plot(x, y, 'yo') να εμφανίζει κίτρινα κυκλάκια στα σημεία των δεδομένων, plot(x, y, 'r--') >> x = [0 1 2 3 4 5]; >> x = [0 1 2 3 4 5]; >> y = [5 3 6 8 7 4]; >> y = [5 3 6 8 7 4]; >> plot (x, y) >> plot (x, y, ’o’)

0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 53

3.5

4

4.5

5

5.5

6

6.5

7

7.5

8

0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 53

3.5

4

4.5

5

5.5

6

6.5

7

7.5

8

Σχήμα 1.2 Γραφικές παραστάσεις έχοντας τα δεδομένα συνδεδεμένα με μη διακε-κομμένη γραμμή (αριστερά) και με σύμβολα (δεξιά).

Page 56: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 250

ΠΙΝΑΚΑΣ 1.6 ΠΡΟΣΔΙΟΡΙΣΤΕΣ ΧΡΩΜΑΤΩΝ, ΣΥΜΒΟΛΩΝ ΚΑΙ ΤΥΠΩΝ ΓΡΑΜΜΩΝ ΠΟΥ ΧΡΗΣΙΜΟΠΟΙΟΥΝΤΑΙ ΜΕ ΤΗ ΣΥΝΑΡΤΗΣΗ plot ΣΤΟ MATLAB.

Χρώμα Σύμβολο Γραμμή y κίτρινο . σημείο - γεμάτη m πορφύρα o κύκλος : με τελείες c κυανό x x-σημάδι -. παύλες - τελείες r κόκκινο + συν -- παύλες g πράσινο * αστεράκι b μπλε s τετράγωνο w άσπρο d διαμάντι k μαύρο v κάτω τρίγωνο - άνω τρίγωνο < αριστερά τρίγωνο > δεξιά τρίγωνο p πεντάγραμμο h εξάγραμμο

συνδέει τα σημεία με μια κόκκινη διακεκομμένη γραμμή, και plot(x, y, 'k+ --') σχεδιάζει μεμονωμένα σημεία με μαύρα θετικά πρόσημα και συνδέει τα σημεία αυτά με μια μαύρη διακεκομμένη γραμμή. Η ίδια συνάρτηση μπορεί να χρησιμοποιηθεί για την εμφάνιση πολλαπλών καμπυ-λών στο ίδιο διάγραμμα. Για παράδειγμα, για να σχεδιάσετε τρεις καμπύλες ορι-σμένες από τα ζεύγη διανυσμάτων (x1, y1), (x2, y2) και (x3, y3) χρησιμοποιήστε την plot(x1, y1, x2, y2, x3, y3) Για τον έλεγχο των συμβόλων που χρησιμοποιούνται σε κάθε καμπύλη, ορίστε τον τύπο του συμβόλου με ένα αλφαριθμητικό όρισμα, όπως φαίνεται plot(x1, y1, s1, x2, y2, s2, x3, y3, s3) όπου s1, s2, s3 είναι αλφαριθμητικά κατασκευασμένα από τους χαρακτήρες του Πίνακα 1.6 Διαγράμματα (Log-log) και (semilog) δημιουργούνται με τις loglog, semilogx και semilogy συναρτήσεις που δέχονται τα ίδια ορίσματα με τη συνάρτηση plot.

Page 57: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 251

x = linspace(0,3); x = linspace(0,3); y = 10*exp(-2*x); y = 10*exp(-2*x); plot(x, y) semilogy(x,y) grid on grid on

0 0.5 1 1.5 2 2.5 30

1

2

3

4

5

6

7

8

9

10

0 0.5 1 1.5 2 2.5 310

-2

10-1

100

101

Σχήμα 1.3 Το διάγραμμα μιας εκθετικά φθίνουσας συνάρτησης σε γραμμικούς και

ημι-λογαριθμικούς άξονες. Για να τονίσουμε τη διαφορά ανάμεσα στη γραμμική και τη λογαριθμική κλίμακα στον άξονα των y, μπορούμε να εμφανίσουμε το πλέγμα με τη συνάρτηση grid που περιγράφεται στην επόμενη παράγραφο.

1.5.2 Εμφάνιση Σχολίων σε Διαγράμματα Οι ετικέτες των αξόνων, οι λεζάντες και άλλα σχόλια εμπλουτίζουν την πληροφο-ρία που δίνεται από ένα διάγραμμα. Τα στοιχεία εμφανίζονται στα διαγράμματα με τη χρήση των συναρτήσεων που φαίνονται στον Πίνακα 1.7

Page 58: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 252

ΠΙΝΑΚΑΣ 1.7 ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΑΓΩΓΗΣ ΣΧΟΛΙΩΝ Συνάρτηση Λειτουργία axis Καθορίζει τη μέγιστη και ελάχιστη τιμή πάνω στους x και y άξονες. grid Σχεδιάζει γραμμές συντεταγμένων που συνδέουν τα βασικά σημεία

των αξόνων gtext Προσθήκη κειμένου σε σημείο του χώρoυ που ορίζεται με το ποντί-

κι. legend Δείχνει τη συσχέτιση γραμμών και συμβόλων όταν υπάρχουν πε-

ρισσότερες από μια καμπύλες σε ένα διάγραμμα. text Προσθήκη κειμένου σε καθορισμένο σημείο (x,y). title Προσθήκη τίτλου πάνω από το διάγραμμα. xlabel Εμφανίζει ετικέτα κειμένου στον άξονα x. ylabel Εμφανίζει ετικέτα κειμένου στον άξονα y. Οι συναρτήσεις xlabel, ylabel και title προσθέτουν κείμενο στους άξονες x και y και στο πάνω μέρος του διαγράμματος, αντίστοιχα. Οι συναρτήσεις αυτές παίρνουν σαν όρισμα ένα απλό αλφαριθμητικό κειμένου. Η τοποθέτηση την ετικε-τών γίνεται αυτόματα. Η συνάρτηση legend τοποθετεί μια λεζάντα στο διάγραμμα για να δείχνει τη χρήση διαφορετικών συμβόλων για τη σχεδίαση κάθε καμπύλης. Η σύνταξη της legend είναι legend(label1, label2, label3, …) legend(label1, label2, label3, …, position) όπου label1, label2, label3, …, είναι αλφαριθμητικά που συσχετίζονται με τα σύμβολα και τους τύπους γραμμών που χρησιμοποιούνται σε προηγούμενες κλήσεις της συνάρτησης plot (ή κάποιας ισοδύναμης). Η προαιρετική παράμε-τρος position καθορίζει το σημείο στο διάγραμμα όπου εμφανίζεται η λεζάντα. Εξ ορισμού, το MATLAB προσπαθεί να τοποθετήσει την λεζάντα έτσι ώστε να μην εμπλέκεται στις γραμμές και τα σύμβολα των δεδομένων που αντιπροσωπεύ-ουν. Για παράδειγμα, ας υποθέσουμε ότι έχουμε να σχεδιάσουμε ένα διάγραμμα από μερικά αναλυτικά ή πειραματικά δεδομένα, περιγράφοντας τη θέση x, την ταχύτη-τα υ και την επιτάχυνση α ενός αντικειμένου, τιμές οι οποίες μεταβάλλονται χρο-νικά. Οι επόμενες εντολές δημιουργούν το διάγραμμα δεδομένων και τη σχετική λεζάντα. >> t = … % ορίζει χρονικά δεδομένα

Page 59: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 253

>> x = … % θέση >> v = … % ταχύτητα >> a = … % επιτάχυνση >> plot(t,x, '-',t,v, '*',t,a,'o') >> xlabel('time (seconds) ') >> legend('θέση','ταχύτητα','επιτάχυνση') Η σειρά των ετικετών στη συνάρτηση legend πρέπει να είναι συνεπής με τη σει-ρά των δεδομένων στη συνάρτηση plot.

1.5.3 Εμφάνιση Πολλών Διαγραμμάτων σε ένα Παράθυρο (Υποδι-αγράμματα)

Μερικές φορές είναι επιθυμητό να εμφανίσουμε περισσότερα του ενός διαγράμμα-τα σε μία εικόνα παράθυρο. Αυτό γίνεται με τη χρήση της συνάρτησης subplot, η οποία καλείται πάντα με τρία ορίσματα, όπως subplot(nrows, ncols, thisPlot) όπου nrows και ncols ορίζουν έναν οπτικό πίνακα διαγραμμάτων που είναι δια-τεταγμένα στο παράθυρο και η thisPlot καθορίζει τον αριθμό των διαγραμμά-των που επί του παρόντος είναι σχεδιασμένα. Η thisPlot είναι ένας ακέραιος που μετράει τις γραμμές και μετά τις στήλες. Για ένα παράθυρο στο οποίο έχουν ήδη τοποθετηθεί τα διαγράμματα, τα ορίσματα nrows και ncols δεν αλλάζουν. Πριν τη σχεδίαση κάθε διαγράμματος στον πίνακα χρησιμοποιείται η subplot με την κατάλληλη τιμή της thisPlot. Το Σχήμα 1.4 δείχνει τέσσερα διαγράμματα που δημιουργούνται με τις ακόλουθες εντολές: >> x = linspace(0,2*pi); >> subplot(2,2,1); >> plot(x,sin(x)); axis([0 2*pi -1.5 1.5]); title('sin(x)'); >> subplot(2,2,2); >>plot(x,sin(2*x));axis([0 2*pi -1.5 1.5]);title('sin(2x)'); >> subplot(2,2,3); >>plot(x,sin(3*x));axis([0 2*pi -1.5 1.5]);title('sin(3x)'); >> subplot(2,2,4); >>plot(x,sin(4*x));axis([0 2*pi -1.5 1.5]);title('sin(4x)');

Page 60: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 254

0 2 4 6-1.5

-1

-0.5

0

0.5

1

1.5sin(x)

0 2 4 6-1.5

-1

-0.5

0

0.5

1

1.5sin(2x)

0 2 4 6-1.5

-1

-0.5

0

0.5

1

1.5sin(3x)

0 2 4 6-1.5

-1

-0.5

0

0.5

1

1.5sin(4x)

Σχήμα 1.4 Τέσσερα διαγράμματα σε ένα παράθυρο

1.5.4 Γραφικές Παραστάσεις Επιφανειών Μια αριθμητική συνάρτηση με δύο ανεξάρτητες μεταβλητές, z = f(x,y), ορίζει μια επιφάνεια στον τρισδιάστατο χώρο. Γραφικά, η επιφάνεια αυτή μπορεί να αναπα-ρασταθεί με πολλούς τρόπους. Οι συναρτήσεις mesh, meshc, surf, surfc και surfl δημιουργούν γραφικές παραστάσεις μιας επιφάνειας με διαφορετικούς τρόπους εμφάνισης. Οι συναρτήσεις mesh και meshc σκιαγραφούν την επιφά-νεια σαν πλέγμα καλωδίων. Οι συναρτήσεις surf, surfc και surfl σκιαγρα-φούν την επιφάνεια σαν μια συλλογή μικρών επιπέδων, χρωματισμέναων με βάση διαφορετικό φωτισμό και σκιές. Οι συναρτήσεις meshc και surfc συνδυάζουν τη φωτοσκίαση της αντίστοιχης επιφάνειας με το περίγραμμα ενός σταθερού επι-πέδου z κάτω από την επιφάνεια. Στις πιο συνηθισμένες μορφές τους, οι συναρτή-σεις mesh και surf παίρνουν τις ίδιες παραμέτρους. Λεπτομερώς θα περιγραφεί μόνο η συνάρτηση surf.

Page 61: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 255

Πριν προσπαθήσετε να χρησιμοποιήσετε τις συναρτήσεις σχεδίασης διαγραμμά-των επιφάνειας είναι χρήσιμο να δείτε τα εξαιρετικά demo που υπάρχουν ενσωμα-τωμένα, πληκτρολογώντας τις συναρτήσεις: >> graf2d2 >> graf3d Η γνωστή ρήση ότι μια εικόνα ισοδυναμεί με χίλιες λέξεις βρίσκει εφαρμογή στα τρισδιάστατα γραφικά και τα demos διαγραμμάτων που παρέχονται από την Mathworks. Η συνάρτηση surf καλείται με τους εξής τρόπους surf(zdata) surf(xvec,yvec,zdata) surf(xmat,ymat,zdata) Η συνάρτηση z = f(x,y) αποθηκεύεται στον πίνακα Ζdata και ορίζεται σ’ ένα πλέγμα καθορισμένο είτε από τα διανύσματα xvec και yvec, ή από τους πίνακες xmat και ymat. Αν το πλέγμα ορίζεται με τα διανύσματα xvec και yvec, η συ-νάρτηση (επιφάνεια) z = f(x,y) αντιστοιχεί στην zdata(i,j) = f(xvec(i),yvec(j)) η οποία ορίζει ότι το πλέγμα θα είναι ορθογώνιο. Αυθαίρετα πλέγματα μπορούν να καθοριστούν με συντεταγμένες τους πίνακες xmat και ymat, όπου σε αυτή την πε-ρίπτωση, η συνάρτηση (επιφάνεια) αντιστοιχεί στην zdata(i,j) = f(xmat(i,j),ymat(i,j)) Όταν δεν καθορίζεται πλέγμα (δηλ. όταν χρησιμοποιείται η surf(zdata)), υ-ποθέτουμε ότι ορίζεται από xgrid =1:m και ygrid =1:n, όπου [m,n] =size(zdata). Οι συναρτήσεις surf και mesh χρησιμοποιούνται για τη σχεδίαση διαγραμμάτων δεδομένων από εξωτερικά αρχεία ή συναρτήσεις που υπολογίζονται στο MATLAB. Για τον υπολογισμό αριθμητικών συναρτήσεων, η συνάρτηση meshgrid είναι ο εύκολος τρόπος δημιουργίας δεδομένων (x, y) που χρησιμοποιούνται για τον υπο-λογισμό της z = f(x,y). Η εντολή [X,Y] = meshgrid(xg,yg)

Page 62: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 256

δημιουργεί τους πίνακες X και Υ διαστάσεων mxn

X = Y =

n

n

n

xgxgxg

xgxgxg

xgxgxg

...

::::

...

...

21

21

21

nnn ygygyg

ygygyg

ygygyg

...

::::

...

...

222

111

όπου xg και xy είναι διανύσματα που ορίζουν συντεταγμένες γραμμές κάθετες στους άξονες x και y, αντιστοίχως. Η χρήση των συναρτήσεων meshgrid και surf για τη δημιουργία διαγραμμάτων επιφάνειας φαίνεται στα ακόλουθα παρα-δείγματα. Παράδειγμα 1.3: Διάγραμμα Επιφάνειας μιας Αριθμητικής Συνάρτησης Θεωρείστε τη 2ου βαθμού συνάρτηση

z = 2 – x2 – y2 (1.2) με πεδία ορισμού . Η δημιουργία του διαγράμματος επιφά-νειας της z = f(x,y) προϋποθέτει, (1) ορισμό των συντεταγμένων (x, y), (2) υπολο-γισμό της z στα σημεία αυτά και (3) σχεδίαση της επιφάνειας με τη χρήση της κα-τάλληλης συνάρτησης mesh ή surf. Οι ακόλουθες εντολέ δημιουργούν το διά-γραμμα επιφάνειας που φαίνεται στο Σχήμα 1.5:

5 x 5, 5 y 5

>> xg = linspace(-5,5,20); %x διάνυσμα πλέγματος (χρησιμοποιείται επίσης για το y) >> [X,Y]=meshgrid(xg,xg); % πίνακες πλέγματος σε τετράγωνο >> Z = 2-X.^2-Y^2; % διανυσματοποιημένος υπολογισμός του Z = f(X,Y) >> surf(X,Y,Z) % δημιουργεί το διάγραμμα επιφάνειας >> xlabel('x'); ylabel('y'); % προσθέτει ετικέτες στους άξονες

Page 63: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα

257

Σχήμα 1.5 Διάγραμμα επιφάνειας της

z = 2-x2-y2 στην περιοχή

5 x 5, 5 y 5 .

Παράδειγμα 1.4: Παρουσίαση Τύπων Διαγραμμάτων Επιφάνειας Οι ακόλουθες εντολές παρουσιάζουν τέσσερις διαφορετικούς τύπους διαγραμμά-των επιφάνειας για την ίδια συνάρτηση z = 2 – x2 – y2: >> x = linspace(-5,5,20); %x διάνυσμα πλέγματος (χρησιμοποιείται επίσης για το y) >> [X,Y] = meshgrid(x,x); % πίνακες πλέγματος στο τετράγωνο >> Z = 2-X.^2-Y^2; % διανυσματικοποιημένος υπολογισμός του Z = f(X,Y) >> subplot(2,2,1); mesh(x,x,Z); title('mesh plot'); >> subplot(2,2,2); surf(x,x,Z); title('surf plot'); >> subplot(2,2,3); surfc(x,x,Z); title('surfc plot'); >> subplot(2,2,4); surfl(x,x,Z); title('surfl plot'); Το αποτέλεσμα φαίνεται στο Σχήμα 1.6. Πιο επεξηγηματικά παραδείγματα περιέ-χονται στις ενσωματωμένες συναρτήσεις παρουσίασης graf2d2 και graf3d.

Page 64: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 258

Σχήμα 1.6 Τέσσερις τύποι διαγραμμάτων επιφάνειας με πεδία ορισμού

-5 55,5 yx Οπτικές Γωνίες και Παλέτες Χρωμάτων Η οπτική γωνία του διαγράμματος επιφάνειας μπορεί να αλλάξει με τη χρήση της συνάρτησης view. view(azimuth, elevation) όπου azimuth και elevation είναι γωνίες μετρημένες μεταξύ της νοητής γραμμής του παρατηρητή και της αρχής του συστήματος συντεταγμένων (x,y,z), στο οποίο η επιφάνεια είναι φωτοσκιασμένη. Το αζιμούθιο α υπολογίζεται στο επίπεδο (x,y) ανάμεσα στην προβολή της νοητής γραμμής του παρατηρητή και τον άξονα των x. Η ανύψωση y υπολογίζεται στο επίπεδο που περιέχει το διάνυσμα της γραμμής θέασης και τον άξονα των z. Η συνάρτηση view αλλάζει την οπτική γωνία της σχεδιασμένης επιφάνειας, χωρίς, όμως, να διαφοροποιεί τα δεδομένα που την ορίζουν.

Page 65: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 259

Η εξ ορισμού (προκαθορισμένη) οπτική γωνία θέασης είναι ίση με >> view(-37.5,15) Αφού δημιουργήσετε το διάγραμμα επιφάνειας του Παραδείγματος 1.4, πειραμα-τιστείτε με τις ακόλουθες εντολές: >> view(-10,15) >> view(30,15) >> view(30,0) >> view(30,45) >> view(30,60) >> view(30,90) Επιπροσθέτως, στην αλλαγή οπτικής γωνίας, η εμφάνιση της επιφάνειας μπορεί να διαφοροποιηθεί αλλάζοντας την ανάλυση του πλέγματος, αλλάζοντας παλέτα χρωμάτων ή την σκίαση. Για μια αριθμητική συνάρτηση, όπως αυτή της εξίσωσης (1.2), ο αριθμός των γραμμών του πλέγματος x και y, μπορεί να αυξηθεί αυθαίρετα στη διάρκεια του χρόνου, φωτοσκιάζοντας την εικόνα. Αυξάνοντας την ανάλυση, η επιφάνεια θα φαίνεται πιο λεία, καθώς οι επίπεδες όψεις που προσεγγίζουν την επιφάνεια, μικραίνουν. Η παλέτα χρωμάτων είναι πίνακας που συσχετίζει μια τιμή χρώματος με κάθε στοιχείο του πίνακα Z που περνάει στη συνάρτηση surf. Το MATLAB έχει προ-καθορισμένες παλέτες χρωμάτων που ονομάζονται 'bone', 'cool', 'gray’, 'hot' και 'jet'. Για παράδειγμα, η συνάρτηση >> colormap('hot') καθορίζει την παλέτα χρωμάτων έτσι ώστε αριθμητικές τιμές σε ένα διάγραμμα επιφάνειας αναπαριστώνται με μια χρωματική εναλλαγή από σκούρο κόκκινο, προς ανοιχτό κόκκινο, προς κίτρινο και μετά άσπρο (βλ. Using MATLAB Graphics, ή πληκτρολογήστε “help graph3D” για περισσότερες λεπτομέρειες). Όπως συμβαίνει με τη συνάρτηση view που αλλάζει την οπτική γωνία, η εναλλα-γή της παλέτας χρωμάτων αλλάζει την εμφάνιση της επιφάνειας, χωρίς να επηρεά-ζονται τα δεδομένα που ορίζουν την επιφάνειας. Η σκίαση της επιφάνειας μπορεί να αλλάξει με κάθε μια από τις ακόλουθες εντο-λές: >> shading('flat') >> shading('faceted') >> shading('interp')

Page 66: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 260

Η εξ ορισμού σκίαση είναι η 'flat' που έχει σαν αποτέλεσμα την ανάθεση ο-μοιόμορφου χρώματος σε κάθε μια από τις μικρές επίπεδες επιφάνειες που φωτο-σκιάζουν τη συνάρτηση z = f(x,y). Ο τύπος σκίασης 'faceted’ σχεδιάζει μια γραμμή γύρω από κάθε επίπεδο που προσεγγίζουν την επιφάνεια. Αυτό έχει σαν αποτέλεσμα τον τονισμό των επιπέδων που αποτελούν μέρη της φωτοσκίασης. Ο τύπος σκίασης 'interp' φωτοσκιάζει κάθε μικρό επίπεδο με μια συνεχή διακύ-μανση χρωμάτων. Αυτό κάνει την επιφάνεια να φαίνεται πιο λεία, χωρίς να αυξά-νονται τα επίπεδα που την αποτελούν. Το demo graf3d επιτρέπει τον πειραματισμό με τη φωτοσκίαση επιφανειών, τον ορισμό παλετών χρωμάτων και τους τύπους σκίασης.

1.5.5 Περιγράμματα (Contour Plots) Τα διαγράμματα αυτά δείχνουν τα «επίπεδα γραμμών» της συνάρτησης z = f(x,y) (π.χ., οι καμπύλες για τις οποίες z = σταθερά). Ένα συνηθισμένο περίγραμμα είναι μια δισδιάστατη προβολή του επιπέδου γραμμών στο επίπεδο (x,y). Ενώ τα δια-γράμματα επιφάνειας δίνουν μια δημιουργική και παραστατική εμφάνιση των δε-δομένων της συνάρτησης z = f(x,y), τα περιγράμματα περισσότερη πληροφορία. Οι τοπογραφικοί χάρτες είναι ένας συνηθισμένος τύπος περιγράμματος, που περιέ-χει πολλά δεδομένα, ακριβής πληροφορίας, που χρησιμοποιείται στην πλοήγηση στην ξηρά. Οι γραμμές του περιγράμματος σε έναν τοπογραφικό χάρτη είναι γραμμές με σταθερή ανύψωση πάνω από το επίπεδο της θάλασσας. Ένας έμπειρος στο διάβασμα χαρτών μπορεί να κοιτάξει έναν τοπογραφικό χάρτη και να δει τις ανυψώσεις επιφάνειας που δείχνουν οι γραμμές του περιγράμματος. Η συνάρτηση contour έχει πολλούς τύπους: >> contour(Zdata) >> contour(Zdata,ncont) >> contour(Zdata,cvals) >> contour(Xgrid,Ygrid,Zdata) >> contour(Xgrid,Ygrid,Zdata,ncont) >> contour(Xgrid,Ygrid,Zdata,cvals) Η συνάρτηση z = f(x,y) αποθηκεύεται στον πίνακα Zdata και ορίζεται στο πλέγμα Xgrid και Ygrid. Όπως και στη συνάρτηση surf, το πλέγμα μπορεί να ορίζεται από διανύσματα ή πίνακες. Η ncont ορίζει το πλήθος των γραμμών του περιγράμματος. Εναλλακτικά, η cvals περιέχει ακριβείς τιμές της z, στις οποίες οι γραμμές πρέπει

Page 67: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 261

να σχεδιασθούν, ορίζει ένα διάνυσμα (Πρόσθετες μορφές της contour περιγρά-φονται στην on-line βοήθεια και στο MATLAB Language Reference Manual). Παράδειγμα 1.5: Περίγραμμα μιας Αριθμητικής Συνάρτησης Ένα περίγραμμα της επιφάνειας που ορίζεται από την Εξίσωση (2.2), περιέχει την ίδια πληροφορία με το διάγραμμα επιφάνειας στο Σχήμα 1.5. Οι ακόλουθες δηλώ-σεις δημιουργούν το περίγραμμα που φαίνεται στο Σχήμα 1.7. >> xg=linspace(-5,5,20); % διάνυσμα πλέγματος >> [X,Y]=meshgrid(xg,xg); % δημιουργεί πίνακες με τιμές Χ και Υ >> Z=2-X.^2-Y.^2; % εκτίμηση του διανύσματος Z=f(X,Y) >> contour(X,Y,Z); >> axis('square')

Σχήμα 1.7 Το περίγραμμα της

z = 2-x2-y2 με πεδία ορισμού,

5 x 5, 5 y 5

1.6 Περίληψη Αυτό το κεφάλαιο παρουσίασε τις βασικές λειτουργίες των υπολογισμών με αλλη-λεπίδραση του MATLAB. Οι περισσότερες συναρτήσεις του MATLAB μαθαίνο-νται καλύτερα με τον πειραματισμό. Για περισσότερες πληροφορίες σχετικά με την περαιτέρω χρήση των συναρτήσεων του MATLAB, δείτε το εγχειρίδιο Using MATLAB, το εγχειρίδιο MATLAB Language Reference Manual και άλλα σχετικά βιβλία, όπως αυτά που αναφέρονται στο τέλος του παραρτήματος. Όλες οι συναρτήσεις που συζητήθηκαν στο κεφάλαιο αυτό, μπορούν να κληθούν από προγράμματα χρηστών στο MATLAB, τα οποία αποτελούν το θέμα του επό-μενου κεφαλαίου.

Page 68: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 262

2. Προγραμματίζοντας στο MATLAB Το κεφάλαιο αυτό καλύπτει τη δομή και τη σύνταξη προγραμμάτων στο MATLAB. Παρουσιάζονται νέες συναρτήσεις, και παρέχονται αρκετά παραδείγματα. Το υλι-κό που περιλαμβάνεται στο κεφάλαιο αυτό, προϋποθέτει ότι ήδη υπάρχει εξοικεί-ωση με τις βασικές συναρτήσεις του MATLAB και με τα παράθυρα εντολών, που περιγράφηκαν στο προηγούμενο κεφάλαιο. Υπάρχουν πολλές ομοιότητες ανάμεσα στο MATLAB και άλλες γλώσσες υψηλού επιπέδου. Η σύνταξη είναι παρόμοια με αυτή στη Fortran και με κάποιες ιδέες δα-νεισμένες από την C. Το MATLAB έχει βρόχους (loops) και εκτέλεση υπό συνθή-κη. Τα υποπρογράμματα λειτουργούν όπως οι υπορουτίνες στην Fortran και συ-ναρτήσεις της C ως προς το ότι τα δεδομένα περνάν μεταξύ των υποπρογραμμά-των μέσω παραμέτρων εισόδου και εξόδου. Μεταβλητές που δεν είναι παράμετροι εισόδου και εξόδου, είναι τοπικές για το υποπρόγραμμα. Ένα υποπρόγραμμα μπο-ρεί να καλέσει άλλα υποπρογράμματα. Πολλά σημαντικά χαρακτηριστικά του MATLAB το διαφοροποιούν από άλλες γλώσσες υψηλού επιπέδου. Τα προγράμματα του MATLAB είναι ολοκληρωμένα σε ένα αλληλεπιδραστικό περιβάλλον. Τα προγράμματα του MATLAB είναι διερ-μηνευμένα (interpreted) και όχι μεταγλωττισμένα (compiled). Όλες οι μεταβλητές στο MATLAB είναι καλά μελετημένες δομές δεδομένων που παρουσιάζονται στον χρήστη ως πίνακες. Το MATLAB αυτόματα διαχειρίζεται τον δυναμικό επιμερισμό της μνήμης για τους πίνακες, πράγμα το οποίο παρέχει ευκολία και ευελιξία στην ανάπτυξη αλγορίθμων. Το MATLAB παρέχει υψηλά βελτιστοποιημένες ενσωμα-τωμένες ρουτίνες για τον πολλαπλασιασμό, την πρόσθεση και την αφαίρεση πινά-κων, καθώς και την επίλυση γραμμικών προβλημάτων και τον υπολογισμό ιδιοτι-μών.

2.1 Script m-files Υπάρχουν δύο διαφορετικοί τύποι προγραμμάτων στο MATLAB: τα scripts και τα functions. Θα ξεκινήσουμε με τα scripts και θα συνεχίσουμε με τα functions. Τα scripts είναι απλώς ακολουθίες αλληλεπιδρόντων εντολών αποθηκευμένες σε ένα αρχείο. Η πληκτρολόγηση του ονόματος του script στο σημείο εισαγωγής εντολών (command prompt), έχει το ίδιο αποτέλεσμα με την πληκτρολόγηση του περιεχο-μένου του script file στο ίδιο σημείο. Τα script m-files δεν έχουν παραμέτρους ει-σόδου και εξόδου, για το λόγο αυτό είναι πιο χρήσιμα για ενέργειες που δεν αλλά-ζουν ποτέ.

Page 69: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 263

Παράδειγμα 2.1: Ένα Script για τον Ορισμό Φυσικών Σταθερών Κάθε τομέας των θετικών επιστημών έχει μια ομάδα φυσικών σταθερών και παρα-γόντων μετατροπής που χρησιμοποιούνται στην σχεδίαση υπολογισμών. Αν αυτές οι σταθερές είναι ορισμένες σε ένα script m-file, μπορούν κληθούν γρήγορα κατά τους υπολογισμούς στο MATLAB. Το myConsts script στη Λίστα 2.1 είναι παρά-δειγμα ενός τέτοιου script. Ίσως να θέλετε να το τροποποιήσετε προκειμένου να ανταποκρίνεται στον δικό σας τομέα. Τρέξτε το myConsts script πληκτρολογώντας το όνομά του στη γραμμή εντολών: >> myCon Τίποτα δεν φαίνεται να συμβαίνει! Οι εντολές στο myConsts script εκτελούνται χωρίς να φαίνεται κάτι στο παράθυρο εντολών. Ωστόσο, όταν το myConsts εκτε-λείται, όλες οι μεταβλητές που ορίζονται στο script προστίθενται στο χώρο εργα-σίας. (βλ. §2.1.2) Μετά την εκτέλεση του myConsts είναι εύκολο, για παράδειγμα, να υπολογισθούν τα γαλόνια σε 25 λίτρα: >> 25*galPerLiter ans = 6.6043 % myCon Ορίζει χρήσιμες σταθερές στο χώρο εργασίας % Αυτό πρέπει να είναι ένα script και όχι % function m-file, προκειμένου να προσθέτει % μεταβλητές ορισμένες εδώ στο χώρο εργασίας % - - - βασικές σταθερές >> Avagadro = 6.024e23; % αριθμός μορίων σε ένα γραμμομόριο >> cLight = 2.998e8; % ταχύτητα του φωτός; m/s >> gravity=9.807; % επιτάχυνση της βαρύτητας; m/s^2 >> hPlank=6.625e-34; % σταθερά του Plank; J*s/molecule >> kBoltzmann=1.380e-23;% σταθερά του Boltzmann; J/K/molecule >> Rgas=8315; % διεθνής σταθερά αερίου; J/kmol/K % - - - μετατροπές μονάδων >> galPerMeter3=264.17; % αριθμός γαλονιών σε κυβικά μέτρα >> galPerLiter=galPerMeter3/1000; % αριθμός λίτρων σε μέτρα >> inchPerMeter=1/25.4e-2; % αριθμός ιντσών σε μέτρα >> inchPerGal=231; % αριθμός κυβικών ιντσών σε γαλόνια >> lbPerkg=2.2046; % αριθμός λιβρών ανά χιλιοστόγραμμο >> psiPerPascal=14.696/101325; % αριθμός PSI ανά Pascal

Λίστα 2.1 Ένα script του MATLAB για τον ορισμό ορισμένων φυσικών σταθερών.

Page 70: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 264

Μπορεί να είναι δύσκολο να θυμάται κανείς τα ονόματα των μεταβλητών που ορί-στηκαν στο myConsts. Ένας εύκολος τρόπος για την ανάκληση των μεταβλητών είναι να δείτε το περιεχόμενο του script στο παράθυρο εντολών, με την εντολή type: >> type myConsts

2.1.1 Δημιουργία m-files Τα scripts και τα functions του MATLAB πρέπει να αποθηκευθούν σε απλά αρχεία κειμένου με επέκταση “.m”. Τα αρχεία αυτά ονομάζονται m-files. Ένα απλό αρ-χείο κειμένου περιλαμβάνει μόνο τους αλφαριθμητικούς χαρακτήρες που υπάρ-χουν στο πληκτρολόγιο. Δεν επιτρέπεται κανένας από τους ειδικούς χαρακτήρες μορφοποίησης που περιλαμβάνονται, προκαθορισμένα, σε αρχεία που δημιουρ-γούνται από επεξεργαστές κειμένου (word processor). Οι περισσότεροι επεξεργα-στές κειμένου παρέχουν τη δυνατότητα να σώσετε το αρχείο σαν απλό αρχείο (plain text). (βλ. την “Save As…” επιλογή στο menu “File”.) Ένας επεξεργαστής κειμένου είναι καταστροφικός για την δημιουργία m-αρχείων, ωστόσο, και είναι συνήθως πιο βολικό να χρησιμοποιείται ένας απλός συντάκτης κειμένου (text edi-tor) ή ένας συντάκτης προγραμματιστή (programmer’s editor). Σε συστήματα Unix ή Linux, χρησιμοποιούνται ως επί το πλείστον οι συντάκτες emacs ή vi για τη δη-μιουργία m-files. Η έκδοση του MATLAB 5 (και μετά) των Windows περιλαμβάνει έναν συντάκτη κειμένου που χρησιμοποιεί χρώμα για τον τονισμό των δομών της γλώσσας και των σχολίων. Η χρήση χρώματος στην σύνταξη παρέχει ένα σημαντικό πλεονέ-κτημα στην επεξεργασία και τη διόρθωση λαθών. Για το άνοιγμα ενός αρχείου με τον ενσωματωμένο συντάκτη, επιλέξτε “Open…” από το menu “ File”. Για τη δη-μιουργία ενός νέου m-file, επιλέξτε “New…” από το menu “File”. Συμβουλευτείτε το Using MATLAB για πληροφορίες σχετικά με τη δημιουργία και την επεξεργα-σία m-files. Παράδειγμα 2.2: Ένα Script για την Παραγγελία Φαγητού Υποθέστε ότι ως συνήθως, δουλεύετε στον υπολογιστή σας αργά το βράδυ και μερικές φορές χρειάζεστε ένα σύντομο γεύμα. Επίσης, υποθέστε ότι είστε αρκετά τυχεροί ώστε να έχετε πολλά μαγαζιά με παράδοση κατ’ οίκον στη γειτονιά σας. Το πρόβλημα είναι ότι δεν μπορείτε να θυμηθείτε τα τηλέφωνά τους. Το script αρχείο takeout στη Λίστα 2.2 είναι μια λύση στο πρόβλημά σας. Το script ορί-ζει μια σειρά από αλφαριθμητικές μεταβλητές που περιλαμβάνουν τους αριθμούς τηλεφώνων των (φανταστικών) εστιατορίων με παράδοση κατ’ οίκον. Από τη

Page 71: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 265

στιγμή που το script οριστεί, μπορείτε απλώς να πληκτρολογείτε takeout στο MATLAB, αντί να ψάχνετε τους αριθμούς στον τηλεφωνικό κατάλογο. Ωστόσο, πριν χρησιμοποιήσετε το script, θα χρειαστεί να δημιουργήσετε το αρχείο takeout.m και να το αποθηκεύσετε στο μονοπάτι του MATLAB (βλ. §1.4.2) >> %takeout Script για την εμφάνιση των αριθμών τηλεφώνων

%εστιατορίων >> saitis_chicken='221-834'; >> pizza_express='235-761'; >> roma_deli='239-477'; >> big_burger='229-408'; >> burrito_barn='281-844'; >> esperia_palace='210-790'; Λίστα 2.2 Ένα script του MATLAB για την εμφάνιση των τηλεφώνων εστιατορίων

με παράδοση κατ’ οίκον Για να δημιουργήσετε το αρχείο αυτό, επιλέξτε “New” από το menu “File” του MATLAB και πληκτρολογήστε το περιεχόμενο της Λίστας 3.2 στο παράθυρο7. Η πρώτη γραμμή ξεκινάει με τον χαρακτήρα %. Αυτό δηλώνει ότι αναφέρεται σε σχόλιο και αγνοείται από το MATLAB. Οι προτάσεις σχολίων περιγράφονται στην §2.1.3. Όταν εισάγετε τα τηλέφωνα, να είστε σίγουροι ότι τα περιλαμβάνετε σε μονά εισαγωγικά. Σώστε το αρχείο με το όνομα takeout.m στον κατάλογο ερ-γασίας σας. Από την στιγμή που το takeout.m είναι στο μονοπάτι του MATLAB πληκτρο-λογήστε takeout στη γραμμή εντολών. Το αποτέλεσμα θα πρέπει να είναι >> takeout saitis_chicken= 221-834 pizza_express= 235-761 roma_deli= 239-477 big_burger= 229-408 burrito_barn= 281-844 esperia_palace= 210-790 7 Ενδεχομένως να θέλετε να αντικαταστήσετε με τα ονόματα και τα τηλέφωνα των δικών σας προτιμήσεων.

Page 72: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 266

Παράδειγμα 2.3: Ένα Script για Σχεδίαση Συναρτήσεων Αν και είναι εύκολο να δημιουργήσετε διαγράμματα στο MATLAB, μερικές φορές χρειάζεται κάτι ακόμα για να προκύψει το διάγραμμα ακριβώς όπως το θέλετε. Το παράδειγμα αυτό δείχνει πώς ένα script file (ή function m-file) μπορεί να βοηθήσει στην ανάπτυξη ενός ποιοτικού διαγράμματος. Πρώτα, οι εντολές που χρησιμοποι-ούνται για τη δημιουργία ενός απλού διαγράμματος αποθηκεύονται σε ένα script m-fileο. Κατόπιν, μέσω διαδοχικών βελτιώσεων στο script file, ρυθμίζονται κά-ποιες λεπτομέρειες στο διάγραμμα. Κάθε φορά που οι εντολές στο script file δια-φοροποιούνται, το script ξανατρέχει και το διάγραμμα δημιουργείται ξανά. Το βασικό θέμα είναι ότι ένα script (ή ένα function) m-file μπορεί να χρησιμοποι-ηθεί για την βελτίωση των υπολογισμών μέσω δοκιμής και λάθους. Επειδή οι ε-ντολές του MATLAB είναι αποθηκευμένες σε ένα αρχείο, είναι εύκολο να ξεκινή-σουμε τους υπολογισμούς από την αρχή. Για τις ανάγκες της παρουσίασης, το διά-γραμμα είναι από γνωστές τριγωνομετρικές ποσότητες. Η ίδια διαδικασία είναι εφαρμόσιμη σε περισσότερο πολύπλοκες συναρτήσεις ή σε πειραματικά δεδομένα που είναι αποθηκευμένα σε ένα αρχείο κειμένου. Υποθέστε ότι θέλουμε να κάνουμε την γραφικά παράσταση των sinθ, cosθ και sinθcosθ για 20 . Προκειμένου να παραμείνουμε στη στρατηγική μας «θεώρησέ το απλό και βελτίωσέ το», ανοίξτε ένα απλό αρχείο κειμένου8 και πλη-κτρολογήστε τις ακόλουθες εντολές: t = linspace(0,2*pi); y1 = sin(t); y2 = cos(t); y3 = y1.*y2; plot(t,y1,’-‘,t,y2,’.’,t,y3,’—‘); Σώστε το αρχείο ως “trigplot.m”, και από την γραμμή εντολών του MATLAB πληκτρολογήστε: >> trigplot Αν υποθέσουμε ότι το script trigplot δεν περιέχει τυπογραφικά λάθη, τότε το αποτέλεσμα είναι αυτό στο πάνω μέρος του Σχήματος 2.2. Παρατηρώντας το διά-γραμμα, βλέπουμε ότι δεν υπάρχουν ετικέτες και ότι η καμπύλη cosθ δεν φαίνεται πολύ καλά με τις τελείες. Για να το διορθώσουμε, αλλάζουμε την εντολή plot

8 Σε Windows επιλέξτε νέο m-αρχείο από το μενού. Σε Unix ή Linux ανοίξτε ένα απλό αρχείο κειμένου με έναν επεξεργαστή αρχείου.

Page 73: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 267

και προσθέτουμε σχόλια. (Κρατάμε τις εντολές ορισμού των μεταβλητών, αντικα-θιστούμε την εντολή plot και προσθέτουμε ετικέτες και λεζάντες). plot(t,y1,'-',t,y2,':',t,y3,'--'); axis([0 2*pi -1.5 1.5]) legend('sin(t)','cos(t)','sin(t)*cos(t)');

Σχήμα 2.1 Τα διαγράμματα που δημιουργήθηκαν αρχικά και τελικά κατά την α-νάπτυξη του trigplot.m scipt. Τώρα εισάγουμε τις ακόλουθες εντολές στο παράθυρο εντολών: >> close all; trigplot Η εντολή close all κλείνει όλα τα ανοιχτά παράθυρα σχημάτων έτσι ώστε το MATLAB να ανοίξει ένα καινούριο παράθυρο όταν εισαχθεί η εντολή plot. Αυτό

Page 74: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 268

εγγυάται ότι οποιαδήποτε εντολή εκτελείται στο παράθυρο σχημάτων θα εκτελε-στεί χωρίς να επηρεάζεται από προηγούμενες εκτελέσεις του script. Τελικά χρησιμοποιούμε TEX συμβολισμό για να εμφανίσουμε το “θ” αντί για t, αλλάζουμε το φόντο των ετικετών αξόνων σε Times και προσθέτουμε τίτλο, πάλι σε φόντο Times, με legend('sin(\theta)','cos(\theta)','sin(\theta)*cos(\theta') xlabel('\theta(radians)','FontName','Times','FontSize',14) title('Plot of simple trigonometric functions', 'FontName', 'Times', 'FontSize', 12) title('Plot of simple trigonometric functions', 'FontName', 'Times','FontSize', 12) Μετά δημιουργούμε το διάγραμμα μια φορά ακόμη με >> close all; trigplot Το αποτέλεσμα θα πρέπει να είναι το διάγραμμα στο κάτω μέρος του Σχήματος 2.1. Η τελική έκδοση του trigplot script φαίνεται στη Λίστα 2.3. % trigplot Script to plot sin(x), cos(x), and sin(x)cos(x) x = linspace(0,2*pi); y1 = sin(t); y2 = cos(t); y3 = y1.*y2; plot(t,y1,'-',t,y2,':',t,y3,'--'); axis([0 2*pi -1.5 1.5]) legend('sin(\theta)','cos(\theta)','sin(\theta)*cos(\theta)'); xlabel('\theta (radians)','FontName','Times','FontSize',14) title('Plot of simple trigonometric functions',... 'FontName','Times','FontSize',12)

Λίστα 2.3 Script για τη γραφική παράσταση δεδομένων δημιουργημένο με την

σύνταξη του script file που δημιουργήθηκε στο Παράδειγμα 2.3. Η σημαντική ιδέα στο παράδειγμα αυτό είναι ότι ένα script (ή ένα function) m-file μπορεί να χρησιμοποιηθεί έτσι ώστε να αναπτυχθεί σταδιακά μια λύση. Δεν είναι απαραίτητο για κάποιον να έχει κατανοήσει πλήρως το θέμα πριν ξεκινήσει να γράφει και να εκτελεί το m-file.

Page 75: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 269

2.1.2 Παρενέργειες ενός Script Όλες οι μεταβλητές που χρησιμοποιούνται σε ένα script προστίθενται στον χώρο εργασίας (βλ. §1.4.1). Μεταβλητές που υπάρχουν στον χώρο εργασίας θα αντικα-τασταθούν από οποιαδήποτε μεταβλητή με το ίδιο όνομα που είναι ορισμένη στο script. Αυτό αναφέρεται ως παρενέργεια9 (side effect) εκτέλεσης του script. Το trigplot script του προηγούμενου παραδείγματος θα χρησιμοποιηθεί προ-κειμένου να παρουσιάσουμε την παρενέργεια εκτέλεσης ενός script. Με το αρχείο trigplot.m να είναι στο μονοπάτι του MATLAB, πληκτρολογήστε τις ακόλου-θες εντολές, στη γραμμή εντολών: >> clear >> who (δεν εμφανίζονται ονόματα μεταβλητών) >> trigplot (δημιουργεί τις x,y1,y2, και y3 στον χώρο εργασίας) >> who Your variables are: t y1 y2 y3 Η εντολή clear σβήνει όλες τις μεταβλητές από το χώρο εργασίας του MATLAB. Η πρώτη εντολή who δείχνει ότι, αμέσως μετά την εντολή clear, δεν υπάρχουν μεταβλητές στο χώρο εργασίας. Όταν εκτελείται το trigplot script το επιθυμη-τό διάγραμμα σχεδιάζεται και οι μεταβλητές t, y1, y2 και y3, προστίθενται στο χώρο εργασίας, όπως φαίνεται από την δεύτερη εντολή who. Υποθέστε ότι η trigplot χρησιμοποιείται σαν μέρος μιας σειράς υπολογισμών. Αν κάποια από τις μεταβλητές t, y1, y2 και y3 ήταν ήδη ορισμένη, η εκτέλεση του script αντικαθιστά το περιεχόμενο των μεταβλητών του χώρου εργασίας με τα δεδομένα που δημιουργούνται από το trigplot. Ίσως η αντικατάσταση αυτή να είναι επιθυμητή, όπως θα ήταν αν οι υπολογισμοί αφορούσαν τις νέες τιμές των t, y1, y2 και y3. Η προσθήκη μεταβλητών στο χώρο εργασίας είναι ο λόγος δημι-ουργίας του myConsts script στο Παράδειγμα 2.1. Από την άλλη μεριά, η εκτέ-

9 Κάθε ενέργεια, πέρα από την μετατροπή της εισόδου μιας συνάρτησης στην έξοδό της, είναι παρενέργεια. Μιλώντας πρακτικά, μια παρενέργεια συμβαίνει όταν μια μονάδα του προγράμματος αλλάζει μια μεταβλητή που δεν δημιουργείται αρχικά από τη μονάδα αυτή και μετά καταστρέφεται από αυτή. Ένα συνηθισμένο παράδειγμα είναι όταν ένα υποπρό-γραμμα αλλάζει μια καθολική μεταβλητή. Η αποδοχή κάποιων παρενεργειών μπορεί να παρέχει στον προγραμματιστή πολύ περισσότερη ευελιξία. Από την άλλη μεριά, απρόσε-χτες παραβλέψεις για παρενέργειες, σίγουρα θα προκαλέσουν λάθη, συχνά τέτοια που είναι δύσκολο να ανιχνευθούν και να περιοριστούν.

Page 76: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 270

λεση του trigplot δεν δίνει καμία προειδοποίηση ότι οι μεταβλητές t, y1, y2 και y3, έχουν αντικατασταθεί. Είναι πιθανό, η διαδοχική ανάλυση που αφορά τις μεταβλητές αυτές, να έχει σαν αποτέλεσμα σφάλματα, γιατί τα δεδομένα που είναι αποθηκευμένα στις μεταβλητές αυτές έχουν αλλάξει από το script. Επειδή τα scripts έχουν παρενέργειες, είναι προτιμότερο να χρησιμοποιούνται τα function m-files όταν πρόκειται για αριθμητική ανάλυση. Τα function m-files είναι τόσο εύκολο να δημιουργηθούν, όσο και τα scripts και είναι πιο ασφαλή και ακό-μη περισσότερο ευέλικτα.

2.1.3 Προτάσεις Σχολίων Τα script files, που περιγράφηκαν στα προηγούμενα παραδείγματα, περιέχουν προτάσεις σχολίων για την επεξήγηση του κώδικα. Οι προτάσεις των σχολίων α-κολουθούν τον χαρακτήρα % και εκτείνονται μέχρι το τέλος της γραμμής. Μικρά σχόλια μπορεί να εμφανίζονται στην ίδια γραμμή με εκτελέσιμο κώδικα. Σχόλια που εκτείνονται σε περισσότερες από μια γραμμές, πρέπει να περιλαμβάνουν τον χαρακτήρα %, στην αρχή κάθε μιας γραμμής. Ο χαρακτήρας σχολίων μπορεί να χρησιμοποιηθεί ώστε να ενεργοποιεί ή απενερ-γοποιεί τις εντολές ενός προγράμματος. Αυτό είναι εύχρηστο κατά την διόρθωση ή για την αποθήκευση ενός εναλλακτικού βήματος, που θα χρησιμοποιηθεί αργό-τερα. Για την απενεργοποίηση μιας εντολής προγράμματος, απλώς προσθέστε τον χαρακτήρα % στην αρχή της γραμμής του script ή του function m-file.

2.2 Συναρτήσεις m-files Τα function m-files είναι υποπρογράμματα του MATLAB, παρόμοια με τις υπο-ρουτίνες στην Fortran και τις συναρτήσεις στην C. Οι ορισμένες από το χρήστη συναρτήσεις στο MATLAB λειτουργούν όπως οι ενσωματωμένες συναρτήσεις. Στην πραγματικότητα, οι περισσότερες συναρτήσεις του MATLAB είναι function m-files.10 Οι συναρτήσεις είναι μονάδες ή τμήματα (modules) κώδικα που επικοι-νωνούν με το παράθυρο εντολών και άλλες συναρτήσεις μέσω μιας προκαθορι-σμένης λίστας παραμέτρων εισόδου και εξόδου. Οι καθολικές μεταβλητές (global variables) μπορούν επίσης να χρησιμοποιηθούν για την ανταλλαγή δεδομένων α-νάμεσα σε διαφορετικά modules, όπως περιγράφεται στην §1.6.2. Όλες οι άλλες μεταβλητές που ορίζονται στην συνάρτηση είναι τοπικές για την συνάρτηση αυτή.

10 Ρίξτε μια ματιά μέσα στον κατάλογο toolbox του κατάλογου matlab, όπου είναι αποθηκευμένο το πρόγραμμα MATLAB.

Page 77: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 271

Μια τοπική μεταβλητή (local variable) μπορεί να χρησιμοποιηθεί μόνο μέσα στην συνάρτηση στην οποία ορίζεται. Οι συναρτήσεις επιτρέπουν την ανάπτυξη ενιαίων ή τμηματικών (modular), επα-ναχρησιμοποιήσιμων και δομημένων λύσεων σε προγραμματιστικές ενέργειες. Οι ρουτίνες μπορούν να γίνουν ευέλικτες με παραμέτρους εισόδου και εξόδου. Η ορ-γάνωση του κώδικα σε ενιαίες μονάδες (modules) βοηθά στη διαχείριση της απο-σφαλμάτωσης (debugging) και στη συντήρηση μεγάλων προγραμματιστικών έρ-γων. Για παράδειγμα, τα function m-files συστήνονται αντί για τα scripts όταν πρόκειται γιά αριθμητικές εργασίες.

2.2.1 Σύνταξη Συναρτήσεων Η πρώτη γραμμή ενός function m-file έχει τη μορφή function [outputParameterList] = functionName(inputParameterList) όπου inputParameterList και outputParameterList είναι λίστες με-ταβλητών χωρισμένες με κόμμα, που χρησιμοποιούνται για να περάσουν δεδομένα μέσα και έξω από την συνάρτηση. Αντίθετα απ’ ότι με υποπρογράμματα στις πε-ρισσότερες από τις άλλες γλώσσες προγραμματισμού, οι συναρτήσεις στο MATLAB έχουν δύο λίστες παραμέτρων, μία για είσοδο και μία για έξοδο. Η σύ-νταξη αυτή ενισχύει την ιδέα ότι το MATLAB ενεργεί σ’ ένα σύνολο δεδομένων – την είσοδο – και επιστρέφει ένα άλλο ξεχωριστό σύνολο δεδομένων – την έξοδο. Η πρώτη λέξη στην πρώτη γραμμή του ορισμού της συνάρτησης πρέπει πάντα να είναι “function”. Ακολούθως οι (προαιρετικές) παράμετροι εξόδου πρέπει να περικλείονται σε αγκύλες [ ]. Αν η συνάρτηση δεν έχει λίστα παραμέτρων εξόδου, οι αγκύλες και το σύμβολο του ίσον ‘‘=’’, παραλείπονται. Αν υπάρχει μόνο μια μεταβλητή στη λίστα παραμέτρων εξόδου, τότε οι αγκύλες είναι προαιρετικές. Παραδείγματα αυτών των διαφορετικών μορφών ορισμού συναρτήσεων δίνονται στην §2.2.2. Το “functionName” είναι ένα αλφαριθμητικό χαρακτήρων που χρησιμοποιείται για να καλούμε την συνάρτηση. Το όνομα της συνάρτησης πρέπει να είναι το ίδιο με αυτό του αρχείου (εκτός από την επέκταση “.m”) στο οποίο είναι αποθηκευμέ-νη η συνάρτηση. Με άλλα λόγια, η συνάρτηση “foo” πρέπει να αποθηκευθεί στο αρχείο “foo.m”. Το όνομα αρχείου ακολουθεί η (προαιρετική) λίστα παραμέτρων εισόδου, που περικλείεται σε παρενθέσεις. Και οι δύο λίστες παραμέτρων – εισό-δου και εξόδου – αποτελούνται από έγκειρα ονόματα μεταβλητών του MATLAB. Οι μεταβλητές μπορεί να είναι οποιουδήποτε τύπου δεδομένων του MATLAB, ό-

Page 78: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 272

πως vectors (διανύσματα), matrices (πίνακες), strings (αλφαριθμητικά), structs (δομές) ή cell arrays (διατάξεις κελιών).

2.2.2 Παράμετροι Εισόδου και Εξόδου Η Λίστα 2.4 περιέχει μια ακολουθία από συναρτήσεις για την παρουσίαση της χρήσης των παραμέτρων εισόδου και εξόδου. Οι υπολογισμοί που γίνονται από τις συναρτήσεις αυτές δεν είναι ιδιαίτερης σημασίας. Οι συναρτήσεις περιλαμβάνο-νται σε τρία ξεχωριστά m-files: twosum.m, threesum.m και addmult.m twosum.m function twosum(x,y) % twosum Προσθέτει δύο πίνακες και εμφανίζει το αποτέλεσμα x+y threesum.m function s = threesum(x,y,z) %threesum Προσθέτει τρεις μεταβλητές και επιστρέφει το αποτέλεσμα s = x+y+z; addmult.m function [s,p] = addmult(x,y) % addmult Υπολογίζει το άθροισμα και το γινόμενο δυο πινάκων s = x+y; p = x*y; Λίστα 2.4 Τρεις συναρτήσεις που παρουσιάζουν τη χρήση των παραμέτρων εισό-δου και εξόδου. Οι συναρτήσεις περιέχονται σε τρία ξεχωριστά m-αρχεία: twosum.m, threesum.m και addmult.m Η συνάρτηση twosum έχει δύο ορίσματα εισόδου και κανένα όρισμα εξόδου. Προσθέτει τις δύο τιμές εισόδου και εμφανίζει στην οθόνη το αποτέλεσμα. Το α-ποτέλεσμα δεν αποθηκεύεται σε κάποια άλλη μεταβλητή. Αυτή είναι μια ισχύουσα λειτουργία στο MATLAB και είναι παρόμοια με το να ορίσουμε δύο μεταβλητές x και y στο παράθυρο εντολών και να πληκτρολογήσουμε x + y. Οι ακόλουθες εντολές είναι σημεία εκκίνησης για πειραματισμό με τη συνάρτηση twosum (δο-κιμάστε τις!): >> twosum(x,y) >> x = [1 2]; y = [3 4]; twosum(x,y); >> twosum(x,y')

Page 79: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 273

>> A = [1 2; 3 4]; B = [5 6; 7 8]; twosum(A,B) >> twosum('one','two') Δουλεύει η συνάρτηση όπως ήταν αναμενόμενο; Πως υπολογίζει το MATLAB το άθροισμα των δύο αλφαριθμητικών τιμών, ‘one’ και ‘two’; Τώρα προσπαθήστε >> clear >> twosum(2,3) >> disp([x y]) >> who Η εντολή clear σβήνει όλες τις μεταβλητές που έχουν οριστεί από τον χρήστη στο χώρο εργασίας. Η δήλωση twosum(2,3) προσθέτει 2 και 3 και εμφανίζει το αποτέλεσμα στην οθόνη. Ενώ εκτελείται η συνάρτηση twosum, οι μεταβλητές x και y που ανήκουν στην twosum δημιουργούνται και τίθενται ίσες με τα εισαγό-μενα ορίσματα 2 και 3. Όταν η συνάρτηση τερματίζεται, οι x και y καταστρέφο-νται (δηλ. η μνήμη που δεσμεύτηκε γι’ αυτές, απελευθερώνεται). Το απλό αυτό παράδειγμα δείχνει την ισχυρή ιδέα των τοπικών11 μεταβλητών. Εφόσον οι x και y είναι τοπικές για την συνάρτηση twosum, δεν έχουν καμία σχέση με μεταβλητές με το ίδιο όνομα που έχουν οριστεί στο χώρο εργασίας (συγκρίνετε τη συμπεριφο-ρά αυτή με εκείνη που παρουσιάστηκε στην §2.1.2.). Δοκιμάστε τις ακόλουθες δηλώσεις >> clear >> x=4; y=-2; (μεταβλητές που ορίζονται στο χώρο εργασίας) >> twosum(1,2) (τοπικές μεταβλητές της συνάρτησης) >> disp([x y]) (εμφανίζει τις μεταβλητές του χώρου εργασίας και όχι τις τοπικές) >> who Η συνάρτηση threesum έχει ένα μοναδικό όρισμα εξόδου και τρία ορίσματα εισόδου. Αν το threesum.m βρίσκεται στο μονοπάτι του MATLAB, μπορείτε να εισάγετε >> a = threesum(1,2,3)

11 Στο σημείο αυτό, ένας προγραμματιστής θα εισήγαγε την έννοια της εμβέλειας(scope) και θα εξηγούσε ότι η εμβέλεια των x και y είναι περιορισμένη στην συνάρτηση στην ο-ποία ορίζονται. Σε αντίθεση με τις μεταβλητές των function m-files, όλες οι μεταβλητές που χρησιμοποιούνται σε script m-files έχουν την ίδια εμβέλεια με τις μεταβλητές που ορί-ζονται και χρησιμοποιούνται στο παράθυρο εντολών.

Page 80: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 274

a = 6 Η έξοδος της συνάρτησης δεν χρειάζεται να ανατεθεί σε κάποια μεταβλητή, όπως, για παράδειγμα >> threesum(4,5,6) ans = 15 Και φυσικά, το αποτέλεσμα μπορεί να ανατεθεί σε μια μεταβλητή, χωρίς αυτό να εμφανιστεί στην οθόνη προσθέτοντας ένα (;) στο τέλος της γραμμής εντολών: >> b = threesum(7,8,9); Η συνάρτηση addmult δείχνει πώς πολλές παράμετροι εξόδου, περνάν έξω από μια συνάρτηση. Να θυμάστε πάντα ότι οι παράμετροι εισόδου περικλείονται πάντα σε παρενθέσεις και ότι περισσότερες της μιας παράμετροι εξόδου περικλείονται πάντα σε αγκύλες. Εφόσον το αρχείο addmult.m οριστεί και περιληφθεί στο μονοπάτι του MATLAB, μπορεί να κληθεί, όπως φαίνεται: >> [a,b] = addmult(3,2) a = 5 b = 6 Σε αντίθεση με τις συναρτήσεις με μία μόνο παράμετρο εξόδου, αποτυχία στην ανάθεση των παραμέτρων εξόδου της addmult , δεν έχει σημασία. Για παρά-δειγμα, >> addmult(3,2) παράγει ans = 5 Το MATLAB δεν μπορεί να παραπλανηθεί με την ανάθεση δυο επιστρεφόμενων τιμών σε ένα διάνυσμα. Δηλαδή, >> v = addmult(3,2) v =

Page 81: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 275

5 Τα προηγούμενα παραδείγματα δείχνουν ότι ο αριθμός των παραμέτρων εξόδου που χρησιμοποιούνται κατά την κλήση μιας συνάρτησης πρέπει να είναι ίδιος με τον αριθμό των παραμέτρων εξόδου που επιστρέφει η συνάρτηση.12 Παράδειγμα 2.4: Ένα Function m-file για τη Σχεδίαση Δεδομένων Μια συνηθισμένη εφαρμογή του προγράμματος MATLAB είναι η ανάλυση πειρα-ματικών δεδομένων. Ας υποθέσουμε ότι έχουμε ένα απλό αρχείο κειμένου που περιλαμβάνει ζεύγη δεδομένων (x, y) από ένα σύστημα ανάκτησης δεδομένων. Χρησιμοποιώντας την εντολή load είναι εύκολο να αναθέσουμε τα δεδομένα x και y σε μεταβλητές του MATLAB και να δημιουργήσουμε το διάγραμμα. Ωστόσο, το θέμα αυτό γίνεται βαρετό όταν χρειάζεται να επαναληφθεί για περισσότερα αρ-χεία δεδομένων. Είναι εύκολο να γράψει κανείς ένα function m-file για να αυτομα-τοποιήσει το φόρτωμα και τη σχεδίαση των δεδομένων. Η συνάρτηση plotdata στη Λίστα 2.5 χρησιμοποιεί την ενσωματωμένη συνάρ-τηση load για την εισαγωγή δεδομένων και την δημιουργία ενός απλού δια-γράμματος. Υπάρχουν τέσσερις εκτελέσιμες εντολές στην plotdata. Η πρώτη είναι μια επίκληση της συνάρτησης load. Αφού επιστραφεί ο πίνακας δεδομένων από την load, οι πρώτες δύο στήλες αντιγράφονται στις μεταβλητές x και y και, τα (x, y) δεδομένα παριστάνονται γραφικά. Η λίστα της συνάρτησης περιλαμβάνει μερικές γραμμές με προτάσεις σχολίων στην κορυφή. Αυτές περιγράφουν την συ-νάρτηση και τις παραμέτρους εισόδου και εξόδου χρησιμοποιώντας μια ιδιαίτερη μορφοποίηση. Το αρχείο xy.dat στον (υποθετικό) κατάλογο data περιέχει δύο στήλες δεδο-μένων. Για τη δημιουργία του διαγράμματος του αρχείου αυτού, πληκτρολογήστε >> plotData('xy.dat') fuction plotData(fname) % plotData σχεδιάζει διάγραμμα από στήλες δεδομένων ενός εξ. Αρχείου % % Σύνοψη: plotData(fname) %

12 Αυτός ο περιορισμός μπορεί να γίνει πιο ευρύς με τη χρήση της υπηρεσίας nargout που δημιουργεί μια συνάρτηση για τον εντοπισμό του αριθμού των παραμέτρων εξόδου με τον οποίο είχε κληθεί η συνάρτηση. Ο ορισμός συναρτήσεων με μεταβλητό αριθμό παρα-μέτρων εξόδου περιγράφεται στην §2.6.1.

Page 82: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 276

% Είσοδος: fname=(string)name, περιλαμβάνει την κατάληξη του αρχείου % % Έξοδος: ένα διάγραμμα σε ξεχωριστό παράθυρο data = load(fname); % φορτώνει το αρχείο σε έναν πίνακα x = data(:,1); % αρχικά οι x και y είναι στήλες δεδομένων y = data(:,2); plot(x,y,'o'); Λίστα 2.5 Η συνάρτηση plotData σχεδιάζει ένα διάγραμμα από ένα απλό αρ-

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

2.2.3 Πρωταρχικές και Δευτερεύουσες Συναρτήσεις Στις εκδόσεις του MATLAB από την 4η και πριν, κάθε m-file μπορούσε να περιέ-χει μόνο μία συνάρτηση. Από την έκδοση 5 και μετά, επιτρέπεται ο ορισμός πολ-λών συναρτήσεων σε ένα m-file. Η πρώτη συνάρτηση στο m-file καλείται πρω-ταρχική συνάρτηση (primary function). Όλες οι επόμενες συναρτήσεις καλούνται υποσυναρτήσεις (subfunctions). Μόνο η πρωταρχική συνάρτηση μπορεί να κληθεί από το παράθυρο εντολών ή από άλλες συναρτήσεις. Οι υποσυναρτήσεις ενός αρ-χείου μπορούν μόνο να καλέσουν άλλες υποσυναρτήσεις του ίδιου αρχείου. Η χρήση υποσυναρτήσεων έχει πολλά πλεονεκτήματα. Η ομαδοποίηση σχετικών μεταξύ τους συναρτήσεων σε ένα αρχείο μειώνει τον καθαρό αριθμό των m-files που χρειάζεται να είναι υπό διαχείριση. Επειδή οι υποσυναρτήσεις μπορούν να κληθούν μόνο από την πρωταρχική συνάρτηση του αρχείου, το ίδιο όνομα υποσυ-νάρτησης μπορεί να χρησιμοποιηθεί με διαφορετικές πρωταρχικές συναρτήσεις. Οι υποσυναρτήσεις μπορούν να χρησιμοποιηθούν για την ενθυλάκωση μεγάλων μπλοκ κώδικα, επιτρέποντας έτσι στην πρωταρχική συνάρτηση να είναι πιο συνε-κτική, κάνοντας δε ευκολότερο το διάβασμα και την αποσφαλμάτωσή της. Αυτό μπορεί να είναι ένα σημαντικό πλεονέκτημα αν η υποσυνάρτηση ενθυλακώνει ένα μέρος του κώδικα που χρησιμοποιείται σε πολλά σημεία της πρωταρχικής συνάρ-τησης. Παράδειγμα 2.5: Εμβαδόν και Περίμετρος ενός Κανονικού Πολυγώνου με n

Πλευρές

Page 83: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 277

Η πλευρά s, το εμβαδόν α και η περίμετρος p ενός κανονικού πολυγώνου με n πλευρές, εγγεγραμμένου σε κύκλο ακτίνας r, δίνονται από τους ακόλουθους τύ-πους:

s = 2rtan(π/n) α = nr2sin(π/n) p = 2nrtan(π/n)

Η συνάρτηση polyGeom παρουσιάζει την χρήση μιας πρωταρχικής συνάρτησης που καλεί υποσυναρτήσεις για τον υπολογισμό των α και p. (Προφανώς, ο υπολο-γισμός των α και p θα ήταν πιο εύκολος και πιο συνεκτικά υλοποιήσιμος σε δυο γραμμές κώδικα του MATLAB, αντί της χρήσης κλήσης υποσυναρτήσεων.) Οι υ-ποσυναρτήσεις area και perimeter δεν μπορούν να κληθούν από το παράθυρο εντολών. Αυτό είναι ένα πλεονέκτημα επειδή τα ονόματα ‘‘area’’ και ‘‘perimeter’’ είναι αρκετά γενικά και μπορεί να είναι γίνει μπέρδεμα με παρόμοιους κώδικες που εκτελούν υπολογισμούς εμβαδού και περιμέτρου για διαφορετικά γεωμετρικά αντικείμενα. function [a,p] = polyGeom(s,n) % poluGeom υπολογίζει το εμβαδόν και την περίμετρο ενός κανονικού πολυγώνου % % Σύνοψη: [a,p] = polyGeom(s,n) % Είσοδος: s = μήκος της πλευράς του πολυγώνου % n = πλήθος πλευρών του πολυγώνου % Έξοδος: α = εμβαδόν % p = περίμετρος r = s/(2*tan(pi/n)); % ακτίνα πολυγώνου a = area(r,n); p = perimeter(r,n); % = = = = = = = subfunction “area” function a = area(r,n) % area υπολογίζει το εμβαδόν πολυγώνου με ακτίνα r a = n*r^2sin(pi/n); % = = = = = = = subfunction “perimeter” function p = perimeter(r,n) % perimeter υπολογίζει την περίμετρο πολυγώνου με ακτίνα r p = n*2*r*tan(pi/n);

Λίστα 2.6 Παρουσιάζει την χρήση πρωταρχικών συναρτήσεων και υποσυναρτή-

σεων. Η συνάρτηση polyGeom υπολογίζει το εμβαδόν και την περί-μετρο ενός πολυγώνου με n πλευρές.

Page 84: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 278

2.3 Είσοδοι και έξοδοι Ο φυσιολογικός τρόπος για την εισαγωγή και εξαγωγή δεδομένων από μια συνάρ-τηση είναι μέσω εισαγωγής και εξαγωγής λιστών παραμέτρων. Σε μερικές περι-πτώσεις μπορούμε βέβαια να χρησιμοποιούμε εναλλακτικούς μηχανισμούς εισό-δου και εξόδου. Για παράδειγμα, μπορεί ο χρήστης να θέλει να εισάγει δεδομένα κατά την εκτέλεση της συνάρτησης. Άλλοτε πάλι, ένας μορφοποιημένος πίνακας αποτελεσμάτων θα είχε περισσότερο νόημα από έναν, χωρίς ετικέτες, πίνακα α-ριθμητικών τιμών. Στην ενότητα αυτή περιγράφονται ενσωματωμένες συναρτήσεις που υποστηρίζουν τέτοιες ενέργειες εισόδου και εξόδου. (Οι είσοδοι και έξοδοι σε αρχεία περιγράφονται στην § 1.4.2.)

2.3.1 Εισαγωγή Δεδομένων κατά την εκτέλεση του Προγράμματος Η συνάρτηση input εμφανίζει ένα μήνυμα στην οθόνη και περιμένει να δεχθεί δεδομένα από το πληκτρολόγιο. Ένα απλό παράδειγμα, >> x = input('Enter a value for x'); Το όρισμα της συνάρτησης input είναι το αλφαριθμητικό προτροπής που θα εμ-φανιστεί. Εξ ορισμού, η συνάρτηση input επιστρέφει μια αριθμητική τιμή. Για να πάρουμε ως είσοδο ένα αλφαριθμητικό, απαραίτητη είναι μια δεύτερη παράμε-τρος, ‘s’ όπως φαίνεται >> yourName=input('enter your name','s'); Η συνάρτηση input μπορεί εύκολα να ‘‘παραχρησιμοποιηθεί’’. Θεωρείστε την τροποποιημένη μορφή της συνάρτησης threesum στην Λίστα 2.7. Αν και είναι σαφές νόημά της, ο συγγραφέας της inputAbuse είναι σίγουρος ότι θα μπερδέ-ψει όποιον χρησιμοποιήσει την συνάρτηση αυτή περισσότερες από μία φορές. Βα-σιζόμενοι στην συνάρτηση input ως ένα υποκατάστατο για τις παραμέτρους ει-σόδου είναι σαν να δουλεύεις για έναν ανταγωνιστή χρήστη του MATLAB. Για να δούμε αυτήν την κατάχρηση, δοκιμάστε την συνάρτηση inputAbuse σε διαφο-ρετικά δεδομένα και μετά συνεχίστε την ανάλυση με τη συνάρτηση threesum. Οι περισσότεροι χρήστες προτιμούν τις παραμέτρους εισόδου από την εισαγωγή δεδομένων κατά την εκτέλεση του προγράμματος, όπου δεν είναι απαραίτητο. Ει-δικά με συναρτήσεις που θα χρησιμοποιηθούν σαν μέρος μεγαλύτερης και αυτο-ματοποιημένης ανάλυσης. Είναι ακόμη καλύτερο η παροχή on-line βοήθειας για την τεκμηρίωση των παραμέτρων εισόδου. Γενικά, είναι καλύτερο να χρησιμοποι-είται η συνάρτηση input σπάνια ή και ποτέ.

Page 85: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 279

function s = inputAbuse x = input('Enter the first variable to be added '); y = input('Enter the second variable to be added '); z = input('Enter the second variable to be added '); s = x+y+z; Λίστα 2.7 Μια διαφοροποίηση της συνάρτησης threesum που παρουσιάζει πως

γίνεται κατάχρηση της συνάρτησης input.

2.3.2 Έξοδος Κειμένου Υπάρχουν δύο συναρτήσεις για κείμενο στην έξοδο: disp και fprintf. Η συ-νάρτηση disp χρησιμοποιείται για πιο απλές εξόδους κειμένου. Η συνάρτηση fprintf παρέχει πλήρη έλεγχο για την πληροφορία που εμφανίζεται, όπως και την άμεση αποθήκευση σε αρχείο. Το MATLAB, επίσης, προσφέρει μια ποικιλία επιλογών για γραφικά και δυαδικά αρχεία. (Επιλογές σχεδίασης διαγραμμάτων περιγράφονται στο Κεφάλαιο 2. βλ. MATLAB Language Reference Manual για πληροφορίες σε θέματα εξόδου δυαδικού αρχείου.) Η συνάρτηση disp Η συνάρτηση disp δέχεται μόνο ένα όρισμα το οποίο μπορεί να είναι πίνακας με αριθμούς ή αλφαριθμητικά. Για την εμφάνιση ενός α-πλού μηνύματος κειμένου, περικλείστε το σε μονά εισαγωγικά: >> disp('My favorite color is red') Συχνά χρειάζεται να εμφανίσουμε ένα μήνυμα κειμένου μαζί με την τιμή μιας με-ταβλητής του προγράμματος. Εφόσον η disp απαιτεί μόνο ένα όρισμα, το μήνυ-μα και η μεταβλητή πρέπει να συνδυαστούν σε ένα μόνο αλφαριθμητικό. Δείτε τον ακόλουθο κώδικα: >> yourName = input('enter your name','s'); >> disp(['Your name is',yourName]); Το όρισμα της disp στο παράδειγμα αυτό είναι το αλφαριθμητικό διάνυσμα γραμμή, ['Your name is',yourName]. Η χρήση του κόμματος επιτρέπει την συνένωση του αλφαριθμητικού 'Your name is' με το περιεχόμενο της μεταβλητής yourName.

Page 86: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 280

Η εμφάνιση ενός μηνύματος μαζί με την τιμή μιας αριθμητικής μεταβλητής απαι-τεί την μετατροπή της αριθμητικής μεταβλητής σε αλφαριθμητικό με τη συνάρτη-ση num2str: >> x = . . . % ανάθεση μιας τιμής στο x >> outstring = ['x = ',num2str(x)]; % ένα string που

%περιέχει την τιμή του x >> disp(outstring) Η ρητή δημιουργία της μεταβλητής outstring μπορεί να αποφευχθεί θέτοντας το αλφαριθμητικό εξόδου απευθείας στο όρισμα της disp, όπως φαίνεται >> disp(['x = ',num2str(x)]) Η συνάρτηση disp μπορεί να χρησιμοποιηθεί για την εμφάνιση ενός πίνακα (ta-ble) με αριθμούς αποθηκευμένων σ’ έναν πίνακα (matrix) ή μιας ομάδας dδιανυσμάτων στήλης. Επειδή η disp μπορεί να δεχθεί μόνο ένα εισαγόμενο όρι-σμα, οι στήλες του πίνακα (table) πρέπει να συνδυαστούν σε ένα μόνο πίνακα (ma-trix), όπως στις ακόλουθες εντολές: >> x = 0:pi/5:2*pi; % χ είναι ένα διάνυσμα – γραμμή >> y = sin(x); % και το y >> disp([x' y']); % αναστροφή των x και y και μετά συνδυασμός Εναλλακτικά, το x μπορεί να δημιουργηθεί σαν διάνυσμα στήλη: >> x = (0:pi/5:2*pi)'; % χ είναι ένα διάνυσμα στήλη >> y = sin(x); % και το y >> disp([x y]); % δεν χρειάζεται αναστροφή πριν τον συνδυασμό

Η εντολή format Η εντολή format ελέγχει την εμφάνιση των αριθμητικών τιμών στο παράθυρο εντολών. Εισάγεται αρχικά για την μορφοποίηση της εμφάνι-σης και παραμένει σε ισχύ μέχρι την επόμενη κλήση της. Δίνονται μερικά παρα-δείγματα: >> format short; disp(pi) 3.61416 >> format long; disp(pi) 3.614159265358979 Ο Πίνακας 2.1 συνοψίζει την επίδραση της εντολής format στην εμφάνιση των αριθμητικών τιμών. Η format εντολή επηρεάζει την εμφάνιση των αριθμητικών τιμών με την disp και οποιαδήποτε από τις τιμές που τυπώνονται από παραστά-

Page 87: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 281

σεις οι οποίες δεν τελειώνουν με ερωτηματικό. Η συνάρτηση fprintf δεν επη-ρεάζεται από την εντολή format. ΠΙΝΑΚΑΣ 2.1 ΕΠΙΔΡΑΣΗ ΤΩΝ ΒΑΣΙΚΩΝ ΕΝΤΟΛΩΝ format ΣΤΗΝ ΕΝΤΟΛΗ, disp(x) ΟΤΑΝ x = 1.23456789.

x = 1.23456789; disp(x); εντολή format έξοδος format short 1.2345 format long 1.23456789000000000

format short e 1.2345e+00 format + +

format bank 1.23 Η συνάρτηση fprintf Η συνάρτηση fprintf του MATLAB είναι παρόμοια με την συνάρτηση fprintf της C. Παρέχει έλεγχο στο εξαγόμενο α-ποτέλεσμα με τίμημα μια πιο σύνθετη σύνταξη. Η συνάρτηση fprintf έχει την παρακάτω σύνταξη fprintf(format) fprintf(format, variables) fprintf(fid, format, variables) όπου format είναι ένα αλφαριθμητικό που ορίζει την μορφοποίηση της εξόδου, variables είναι μια λίστα μεταβλητών διαχωρισμένη με κόμμα που θα εισαχθεί μέσω της format και fid είναι ένα αναγνωριστικό αρχείου (file identifier) για το αρχείο όπου θα αποθηκευθεί η έξοδος. Η τιμή fid ορίζεται με την fopen ό-πως περιγράφτηκε. Η πρώτη έκδοση της fprintf χρησιμοποιείται για την εμφάνιση ενός απλού μη-νύματος κειμένου – για παράδειγμα, >> fprintf('Warning: x is negative\n'); Το μήνυμα κειμένου περικλείεται σε μονά εισαγωγικά και τερματίζεται με το (προαιρετικό) \n, το newline αλφαριθμητικό. (Προγραμματιστές σε C, προσοχή: Το αλφαριθμητικό μορφοποίησης στην συνάρτηση fprintf περιλαμβάνεται σε μονά, και όχι διπλά, εισαγωγικά.) Χωρίς το \n, το μήνυμα θα τυπώνονταν και ο κέρσορας θα εμφανίζονταν στο τέλος του ‘‘negative’’. Πολλά newline αλφαριθμη-τικά μπορούν να συμπεριληφθούν στο αλφαριθμητικό μορφοποίησης για καλύτερα

Page 88: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 282

αποτελέσματα εξόδου. Είναι επίσης πιθανό να σπάσουμε ένα μήνυμα κειμένου σε πολλές συναρτήσεις fprintf και να εισάγουμε νέες γραμμές. Η δεύτερη μορφή της συνάρτησης fprintf fprintf(format, variables) παρέχει μορφοποιημένη έξοδο των εσωτερικών μεταβλητών. Το παρακάτω παρά-δειγμα δείχνει πως να εμφανίσουμε την τιμή ενός αλφαριθμητικού και μια αριθμη-τική τιμή στην οθόνη: >> name ='George'; age = str2num(datestr(now,10))-1945; >> fprintf('%s is %d years old\n',name,age); George is 55 years old Το αλφαριθμητικό μορφοποίησης περιέχει κωδικούς μορφοποίησης και χρησιμο-ποιεί προαιρετικούς χαρακτήρες για τη δημιουργία του αλφαριθμητικού που θα εμφανιστεί. Ο κωδικός μορφοποίησης ορίζει πως θα μετατραπεί η μεταβλητή όταν θα ανατεθεί στο αλφαριθμητικό εξόδου. Ο κωδικός %s χρησιμοποιείται για να εμ-φανίσει μια τιμή ως αλφαριθμητικό, ενώ ο κωδικός %d χρησιμοποιείται για να εμ-φανίσει μια αριθμητική τιμή ως ακέραιο. Οι κωδικοί αυτοί καθορίζουν μια λει-τουργία μετατροπής μεταξύ της εσωτερικής (δυαδικής) αναπαράστασης μιας με-ταβλητής και των ASCII χαρακτήρων που εμφανίζονται στον προορισμό εξόδου. Ο Πίνακας 2.2 παρουσιάζει μια περίληψη των κωδικών μορφοποίησης στην πιο βασική της μορφή. Περισσότερος έλεγχος στην εμφάνιση της εξόδου είναι εφικτός με την προσθήκη καθοριστικών (specifiers) για το πλάτος του πεδίου και (στην περίπτωση αριθμητικών μεταβλητών) του αριθμού των ψηφίων που θα εμφανι-στούν στο δεξιό μέρος των δεκαδικών. Για τον καθορισμό του πλάτους του πεδίου (δηλ. το συνολικό πλήθος των ψηφίων εξόδου) περιλαμβάνεται ένας ακέραιος α-νάμεσα στο % και τα s, d, f, e ή g του καθοριστικού στην έξοδο. Το πλήθος των δεκαδικών θέσεων που εμφανίζονται ελέγχεται προσθέτοντας ένα δεκαδικό σημείο και μια δεύτερη αλφαριθμητική τιμή ανάμεσα στο % και τα f ή e. Η χρήση του πλάτους του πεδίου και των καθοριστικών στον κωδικό μορφοποίησης παρου-σιάζεται στον Πίνακα 2.3. ΠΙΝΑΚΑΣ 2.2 ΠΕΡΙΛΗΨΗ ΤΩΝ ΚΩΔΙΚΩΝ ΜΟΡΦΟΠΟΙΗΣΗΣ ΓΙΑ ΧΡΗΣΗ ΜΕ ΤΗΝ fpintf ΚΑΙ ΤΗΝ fscanf. Κωδικός Οδηγίες μετατροπής %s Μορφοποίηση αλφαριθμητικού %d Μορφοποίηση ακεραίου %f Μορφοποίηση δεκαδικού %e Μορφοποίηση δεκαδικού με επιστημονική συμβολισμό %g Πιο συνεκτική μορφή των %f και %e

Page 89: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 283

\n Εισάγει νέα γραμμή στην έξοδο \t Εισάγει tab στο αλφαριθμητικό εξόδου Η τρίτη μορφή της συνάρτησης fprintf επιτρέπει στη μορφοποιημένη έξοδο να γραφεί σε αρχείο. Για την εγγραφή ή την ανάγνωση από ένα αρχείο, πρέπει να δη-μιουργηθεί μια σύνδεση ανάμεσα στο αρχείο και το συγκεκριμένο τμήμα του MATLAB. Η παράμετρος fid είναι μια μεταβλητή του MATLAB που ανατίθεται από την fopen και χρησιμοποιείται από την fprintf για την αναφορά της σε κάποιο αρχείο. (Η συνάρτηση fopen περιγράφθηκε στην §1.4.2) Οι ακόλουθες εντολές ανοίγουν ένα αρχείο με το όνομα myfile.dat και εγγράφουν το περιε-χόμενο του διανύσματος σε αυτό: x = . . . fout = fopen('myfile.dat','wt'); fprintf(fout, ' k x(k)\n'); for k=1:length(x) fprintf(fout,'%4d %5.2f\n',k,x(k)); end fclose(fout) ΠΙΝΑΚΑΣ 2.3 ΕΠΙΔΡΑΣΗ ΤΩΝ ΚΩΔΙΚΩΝ ΜΟΡΦΟΠΟΙΗΣΗΣ ΣΕ ΤΙΜΕΣ ΠΟΥ ΕΜΦΑΝΙΖΟΝΤΑΙ ΜΕ ΤΗΝ fprintf Τιμή %8.4f %12.3e %10g %8d 2 2.0000 2.000e+00 2 2 Sqrt(2) 1.4142 1.414e+00 1.41421 1.41421e+00 Sqrt(2e+11) 0.0000 4.472e-06 4.47214e-06 4.472136e-06 Sqrt(2e11) 447213.5955 4.472e+05 447214 4.472136e+05 Ο βρόχος for ... end χρησιμοποιείται για να περιληφθούν όλα τα στοιχεία του διανύσματος x. Δες § 2.4.5 για την περιγραφή των βρόχων στο MATLAB, ό-πως και το Using MATLAB ή την on-line βοήθεια για περισσότερες πληροφορίες για τις συναρτήσεις fscanf, fopen και fclose.

2.4 ΄Ελεγχος Ροής Όλοι, εκτός από τους πιο απλούς αλγόριθμους, απαιτούν την υπό συνθήκη εκτέλε-ση τμημάτων (μπλοκ) προγράμματος. Πολλοί αλγόριθμοι, επίσης, απαιτούν τον επαναληπτικό υπολογισμό των ίδιων τύπων ή την εφαρμογή του ίδιου τύπου σε έναν μεγάλο αριθμό παρόμοιων δεδομένων. Η υπό συνθήκη εκτέλεση μιας ομάδας εντολών υποστηρίζεται από την if … else … και άλλες σχετικές δομές. Ο επα-ναληπτικός υπολογισμός διαχειρίζεται από τους for … end βρόχους και τις

Page 90: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 284

while … end δομές. Όλα απ’ αυτά είτε άμεσα ή έμμεσα χρειάζονται κάποια μέσα ελέγχου του κατά πόσο μια συνθήκη είναι αληθής ή ψευδής. Το τμήμα αυτό ξεκινάει με μια διερεύνηση των σχεσιακών και λογικών τελεστών, των απαραίτητων για την επίτευξη του ελέγχου των συνθηκών. Οι if … else … δομές περιγράφονται στην συνέχεια. Μετά έπονται οι βρόχοι με τις for … end και while … end δομές. Τέλος καταλήγουμε με την τεκμηρίωση των ε-ντολών break και return.

2.4.1 Σχεσιακοί Τελεστές Η πρόταση “είναι A ίσον με B?” περιλαμβάνει μια σύγκριση ανάμεσα στα ορίσμα-τα “A” και “B” με τον σχεσιακό τελεστή “είναι ίσον με ”. Τα ορίσματα “A” και “B” μπορεί να είναι πολύπλοκες σχεσιακές παραστάσεις. Ο Πίνακας 2.4 περιλαμ-βάνει τους σχεσιακούς τελεστές στο MATLAB. Σχεσιακοί τελεστές μπορούν να εμφανιστούν σε εντολές ανάθεσης: >> a = 2; b = 4; >> aIsSmaller = a < b aIsSmaller = 1 >> bIsSmaller = b < a bIsSmaller 0 ΠΙΝΑΚΑΣ 2.4 ΣΧΕΣΙΑΚΟΙ ΚΑΙ ΛΟΓΙΚΟΙ ΤΕΛΕΣΤΕΣ ΣΤΟ MATLAB. Η ΔΙΑΦΟΡΑ ΜΕΤΑΞΥ ΣΧΕΣΙΑΚΩΝ ΚΑΙ ΛΟΓΙΚΩΝ ΤΥΠΩΝ ΕΙΝΑΙ ΣΗΜΑΝΤΙΚΗ ΣΤΗΝ ΕΚΤΙ-ΜΗΣΗ ΤΩΝ ΠΡΟΗΓΟΥΜΕΝΩΝ ΤΕΛΕΣΤΩΝ (βλ. §2.4.2)

Τελεστής

Τύπος

Σημασία

Αριθμός ορισμάτων

< σχεσιακός μικρότερο 2 <= σχεσιακός μικρότερο ή ίσο 2 > σχεσιακός μεγαλύτερο 2 >= σχεσιακός μεγαλύτερο ή ίσο 2 = = σχεσιακός ίσο 2 ~= σχεσιακός όχι ίσο 2 & λογικός και 2 | λογικός ή 2 ~ λογικός όχι 1

Page 91: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 285

Το αποτέλεσμα μιας σχεσιακής πράξης είναι είτε αληθές ή ψευδές. Το αριθμητικό ισοδύναμο του «αληθές» είναι οποιοσδήποτε μη μηδενικός αριθμός και το αριθμη-τικό ισοδύναμο του «ψευδές» είναι το μηδέν. Σε πολλές γλώσσες προγραμματι-σμού υπάρχει ένας τύπος δεδομένων Boolean που χρησιμοποιείται για την αποθή-κευση των τιμών αυτών (αληθές ή ψευδές). Στο MATLAB, το αποτέλεσμα των σχεσιακών πράξεων μπορεί να ανατεθεί σε μια μεταβλητή πίνακα. Οι μεταβλητές aIsSmaller και bIsSmaller του προηγούμενου παραδείγματος είναι βαθμω-τά (1x1 πίνακες) και μπορούν να χρησιμοποιηθούν σε κάθε αριθμητική παράστα-ση που ακολουθεί. Λογικές πράξεις μπορούν να γίνουν συνδυάζοντας σχεσιακές παραστάσεις με τους τελεστές “and”, “or” και “not”: >> bothTrue = aIsSmaller & bIsSmaller bothTrue = 0 >> eitherTrue = aIsSmaller | bIsSmaller eitherTrue = 1 >> ~eitherTrue ans = 0 Σχεσιακές πράξεις μπορούν επίσης να γίνουν σε πίνακες ίδιου μεγέθους, όπως >> x = 1:5; y = 5:-1:1; >> z = x>y z = 0 0 0 1 1 Το αποτέλεσμα είναι ένα διάνυσμα από μηδενικά και άσσους (τιμές αληθές, ψευ-δές). Ένα τέτοιο διάνυσμα μπορεί να χρησιμοποιηθεί σε συνεκτικές παραστάσεις για την εξαγωγή στοιχείων από έναν πίνακα, όπως περιγράφηκε στην § 2.5.3.

3.4.2 Προτεραιότητα Τελεστών Υπάρχει συγκεκριμένο σύνολο κανόνων για τη σειρά με την οποία αποτιμώνται οι σχεσιακές και αριθμητικές πράξεις. Για παράδειγμα, η παράσταση του MATLAB >> x = 2+3^2/4

Page 92: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 286

είναι ισοδύναμη με την

232

4 x

και όχι με την

4

2

32 x

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

1. αριθμητικοί τελεστές υψηλότερη προτεραιότητα 2. σχεσιακοί τελεστές 3. λογικοί τελεστές χαμηλότερη προτεραιότητα

Οι αριθμητικοί τελεστές έχουν υψηλότερη προτεραιότητα από του σχεσιακούς τελεστές, οι οποίοι έχουν υψηλότερη προτεραιότητα από τους λογικούς τελεστές. Έτσι, στην παράσταση >> y = 3>8-2 | sqrt(15)>4 το 8-2 υπολογίζεται πριν την σύγκριση του αποτελέσματος με το 3, επιστρέφο-ντας την τιμή «ψευδής». Κατόπιν, υπολογίζεται η sqrt(15)>4, επιστρέφοντας το αποτέλεσμα «ψευδής». Τελικά το λογικό «ή» εφαρμόζεται, επιστρέφοντας μια «ψευδής» τιμή, που ανατίθεται στο y. Ανάμεσα στους αριθμητικούς τελεστές υπάρχει μια ιεραρχία κανόνων προτεραιό-τητας που συνοψίζεται στον Πίνακα 2.5. Οι προκαθορισμένοι κανόνες της προτε-ραιότητας τελεστών μπορούν να τροποποιηθούν με την χρήση παρενθέσεων. Γενι-κά, είναι καλή πρακτική να κάνουμε σαφή τη δομή της παράστασης με τη τοποθέ-τηση παρενθέσεων που ίσως και να μην είναι απαραίτητες. Οι κανόνες προτεραιό-τητας είναι σαφώς ορισμένοι, έτσι ώστε ένας επεξεργαστής να μπορεί αναμφίβολα να υπολογίσει μια παράσταση. Οτιδήποτε κάνει τον κώδικα πιο εύκολο για τον άνθρωπο βοηθά στην αποφυγή προγραμματιστικών λαθών. Σαν παράδειγμα, θεω-ρείστε τις ακόλουθες ισοδύναμες παραστάσεις: x=s.^2/t/3*sin(pi/4*n) x=( (s.^2)/(3*t) )*sin(n*pi/4)

Page 93: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 287

Οι επιπλέον παρενθέσεις και τα κενά στην έκφραση δεξιά αφαιρούν κάθε αμφιβο-λία για το πώς θα υπολογισθεί ο τύπος. ΠΙΝΑΚΑΣ 2.5 ΠΡΟΤΕΡΑΙΟΤΗΤΑ ΑΡΙΘΜΗΤΙΚΩΝ ΤΕΛΕΣΤΩΝ. ΟΙ ΟΡΙΖΟΝΤΙΕΣ ΓΡΑΜΜΕΣ ΔΙΑΧΩΡΙΖΟΥΝ ΤΙΣ ΟΜΑΔΕΣ ΤΩΝ ΤΕΛΕΣΤΩΝ ΜΕ ΙΔΙΑ ΠΡΟΤΕΡΑΙΟ-ΤΗΤΑ. ΜΙΑ ΟΜΑΔΑ ΤΕΛΕΣΤΩΝ ΕΧΕΙ ΠΡΟΤΕΡΑΙΟΤΗΤΑ ΣΕ ΣΧΕΣΗ ΜΕ ΑΛΛΕΣ ΟΜΑΔΕΣ, ΠΟΥ ΕΜΦΑΝΙΖΟΝΤΑΙ ΚΑΤΩ ΑΠΟ ΑΥΤΉΝ ΣΤΟΝ ΠΙΝΑΚΑ. ΜΕΣΑ ΣΤΗΝ ΟΜΑΔΑ, Η ΠΡΟΤΕΡΑΙΟΤΗΤΑ ΟΡΙΖΕΤΑΙ ΑΠΟ ΑΡΙΣΤΕΡΑ ΠΡΟΣ ΤΑ ΔΕΞΙΑ, ΟΠΩΣ ΑΥΤΟΙ ΕΜΦΑΝΙΖΟΝΤΑΙ ΣΕ ΜΙΑ ΠΑΡΑΣΤΑΣΗ.

Τελεστής Περιγραφή .’ Αναστροφή στοιχείο προς στοιχείο (μιγαδικός συζυγής) .~ Ύψωση σε δύναμη στοιχείο προς στοιχείο ’ Αναστροφή πίνακα (μιγαδικός συζυγής ανάστροφος) ^ Δύναμη πίνακα + Πρόσθεση στοιχείο με στοιχείο - Μοναδιαίο πλην (άρνηση) .* Πολλαπλασιασμός στοιχείο με στοιχείο ./ Διαίρεση από δεξιά στοιχείο με στοιχείο .\ Διαίρεση από αριστερά στοιχείο – στοιχείο * Πολλαπλασιασμός πινάκων / Διαίρεση από δεξιά πινάκων \ Διαίρεση από αριστερά πινάκων + Πρόσθεση - Αφαίρεση : Τελεστής :

2.4.3 if . . . else . . . Οι σχεσιακές πράξεις συχνά συνδυάζονται με μια δομή if … else … για την επιλεκτική εκτέλεση ορισμένων μπλοκ του κώδικα. Η γενική μορφή είναι if παράσταση μπλοκ εντολών end Οι εντολές στο «μπλοκ εντολών» εκτελούνται μόνον όταν η «παράσταση» είναι αληθής. Η οδόντωση των εντολών εντός της δομής δεν είναι απαραίτητη, αν και διευκολύνει το διάβασμα του κώδικα. Ένα παράδειγμα μιας απλή δομής if: if a<0 disp('a is negative');

Page 94: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 288

end Παρατηρήστε ότι δεν χρειάζονται ερωτηματικά για τα if και end, γιατί οι δηλώ-σεις αυτές δεν υπολογίζουν κάποια παράσταση. Σύντομες δομές if … else μπορούν να συνδυαστούν σε μια γραμμή: if a<0, disp('a is negative'); end Εδώ, χρησιμοποιείται κόμμα στο τέλος του ‘‘if a<0’’, για να μην είναι ασαφές στον μεταγλωττιστή του MATLAB. Η δομή if … elseif … end χρησιμοποιείται για την επιλογή από δύο αμοι-βαία αποκλειόμενες (ανεξάρτητες) επιλογές: if x>=y c = x^2-y; elseif y/x>0.0 c = log(y/x); end Το elseif υπολογίζεται μόνον εφόσον η πρώτη συνθήκη είναι ψευδής και η δεύτερη αληθής. Αν για παράδειγμα, x=-2 και y=5, και οι δυο προηγούμενοι έ-λεγχοι θα είναι ψευδείς, οπότε η μεταβλητή c δεν θα ανατεθεί ποτέ. Αυτό μπορεί να είναι ή να μην είναι στις προθέσεις του προγραμματιστή που γράφει τον κώδι-κα. Εναλλακτικά, θα μπορούσε να χρησιμοποιηθεί η if … else … end, η ο-ποία εγγυάται ότι ένα από τα δύο μπλοκ εκτελείται: if x>=y c = x^2-y; elseif y/x>0.0 c = log(y/x); else fprintf('WARNING:either x and y are both negative or x<y\n'); fprintf('x = %f y = %f\n',x,y); end Παρατηρήστε ότι αν η τελευταία επιλογή καθορίζεται από ένα else, θα πιάσει όλες τις περιπτώσεις που δεν ικανοποιούν τις συνθήκες των προηγούμενω ελέγ-χων. Γενικά, είναι καλή πρακτική να περιλαμβάνεται μια τέτοια συνθήκη σε σύν-θετους λογικούς ελέγχους.

Page 95: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 289

2.4.4 Επιλογή case με Δομή switch Η δομή switch είναι εναλλακτική της χρήσης μιας μακριάς ακολουθίας από elseif μπλοκ σε μια δομή if … else … Η σύνταξη της δομής switch εί-ναι switch παράσταση case τιμή1 μπλοκ εντολών case τιμή2 μπλοκ εντολών otherwise μπλοκ εντολών end Η παράσταση στην εντολή switch μπορεί να είναι μια αριθμητική τιμή (συνή-θως μια παράσταση που αποτιμάται σ’ έναν ακέραιο), ή ένα αλφαριθμητικό. Κάθε μια από τις τιμή1, τιμή2, … στις case εντολές αναπαριστούν ένα πιθανό απο-τέλεσμα του υπολογισμού (αποτίμησης) της παράσταση. Το μπλοκ εντολών σε κάθε case ομάδα μπορεί να είναι οποιαδήποτε από τις ισχύουσες εντολές του MATLAB, ακόμη και κλήση συνάρτησης. Μόνο μία case ομάδα εκτελείται σε οποιαδήποτε συνάντηση με μια δομή switch. Αν η παράσταση ταιριάζει με περισσότερες από μία case τιμή, τότε εκτελείται η πρώτη case ομάδα που ται-

ριάζει με την παράσταση. Υπάρχει μόνο μία otherwise ομάδα. το μπλοκ

εντολών στην otherwise ομάδα εκτελείται μόνον αν η παράσταση δεν ται-ριάζει σε καμία από τις case τιμές. (Οι προγραμματιστές σε C, προσοχή: δεν υ-πάρχουν εντολές break στο τέλος μιας case ομάδας.) Το ακόλουθο τμήμα κώδικα παρουσιάζει την χρήση της δομής switch: x = . . . switch sign(x) case -1 disp('x is negative'); case 0 disp('x is zero'); case 1 disp('x is positive'); otherwise disp('sign test fails'); end

Page 96: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 290

Η ενσωματωμένη συνάρτηση sign επιστρέφει το πρόσημο (-1,0 και +1) του ορί-σματός της. Το switch μπλοκ απλώς εμφανίζει ένα μήνυμα ανάλογα με το πρό-σημο του x. Το ίδιο αποτέλεσμα θα μπορούσε να υλοποιηθεί με μια if … else δομή.

2.4.5 Βρόχοι for Βρόχοι (loops) χρησιμοποιούνται για έργα που απαιτούν την επανάληψη ενός μπλοκ εντολών. Δύο συνήθη παραδείγματα είναι υπολογισμοί που διαπερνούν τα στοιχεία ενός διανύσματος ή πίνακα και επαναληπτικοί υπολογισμοί που επανα-λαμβάνονται έως ότου ικανοποιηθεί ένα κριτήριο τερματισμού. Οι βρόχοι στο MATLAB υλοποιούνται με τις δομές for … end και while … end. Η γενική μορφή ενός for βρόχου είναι for δείκτης = έκφραση μπλοκ εντολών end Η οδόντωση του μπλοκ εντολών που περικλείεται στον βρόχο for … end αν και δεν είναι απαραίτητη, είναι χρήσιμη για την αποτελεσματικότερη ανάγνωση του προγράμματος,. Εδώ για παράδειγμα, είναι ένας απλός βρόχος που προσθέτει τα στοιχεία ενός διανύσματος.13 x = . . . % δημιουργεί ένα διάνυσμα sumx = 0; % αρχικοποιεί το άθροισμα for k = 1:length(x) sumx = sumx + x(k) end Η παράσταση k = 1:length(x) δημιουργεί ένα διάνυσμα γραμμή με μονα-διαία αύξηση δείκτη και με πλήθος στοιχείων ίσο με τον αριθμό των στοιχείων του x. Ο βρόχος επαναλαμβάνεται μια φορά για κάθε στήλη του διανύσματος 1:length(x), ενώ οι τιμή του k ανατίθεται στα στοιχεία του 1:length(x).

13 Τα τμήματα κώδικα αυτής της ενότητας επιλέχτηκαν με στόχο την παρουσίαση της χρή-σης των βρόχων for και όχι σαν παραδείγματα αποτελεσματικού κώδικα. (βλ. § 2.5 για το πώς μπορούμε να αντικαταστήσουμε βρόχους με πιο αποτελεσματικές διανυσματικοποιη-μένες εντολές)

Page 97: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 291

Βρόχοι με οποιαδήποτε δεικτοδότηση μπορούν να δημιουργηθούν από κατάλληλα δομημένα διανύσματα στην εντολή for. Ένας βρόχος με δείκτη αυξανόμενο κατά δύο μονάδες είναι for k =1:2:n … end Ένας βρόχος με αρνητικό δείκτη μέτρησης είναι επίσης δυνατός for k = n:-1:1 … end όπως και ένας βρόχος με όχι ακέραιο βήμα δείκτη for x = 0:pi/15:pi disp(sin(x)); end Η σύνταξη του for … end στο MATLAB είναι πιο ‘‘πονηρός’’ από ότι στις πε-ρισσότερες γλώσσες προγραμματισμού. Ο αριθμός των φορών που εκτελείται ο βρόχος ορίζεται από τον αριθμό των στηλών στο δεξί μέλος της διανυσματικής παράστασης στην εντολή for. Έτσι, ο βρόχος for x = 0:pi/15:pi εκτελεί-ται 16 φορές επειδή length(0:pi/15:pi) = 16. Επιπλέον, η μεταβλητή για τον δείκτη δεν είναι απαραίτητο να είναι ένα βαθμωτό. Θεωρείστε το επόμενο πα-ράδειγμα, το οποίο υπολογίζει τις μέσες τιμές των στοιχείων των στηλών ενός πί-νακα: A = [1 2 3; 4 5 6; 7 8 9;10 11 12]; for v = A disp(mean(v)); end Ο βρόχος εκτελείται τρεις φορές επειδή ο Α έχει τρεις στήλες. Κάθε φορά μέσω του βρόχου, το ν ανατίθεται σε μια από τις στήλες του Α. Είναι μια καλή ιδέα να μελετήσετε τις προηγούμενες εντολές προσεχτικά. Εξετάστε, για παράδειγμα, τι θα συνέβαινε αν αντικαθιστούσαμε την γραμμή for v = A από την for v = A'. Παράδειγμα 2.6: Κανόνας του Horner Το πολυώνυμο τετάρτου βαθμού

Page 98: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 292

5

1

145

34

23214

i

ii xbxbxbxbxbbxp

μπορεί να υπολογισθεί με την

p = b(1) + b(2)*x + b(3)*x^2 + b(4)*x^3 + b(5)*x^4; (2.1)

υποθέτοντας ότι οι συντελεστές bi αποθηκεύονται στο διάνυσμα b. Αν και η εντο-λή αυτή είναι άμεση (και σωστή αλγεβρικά) δεν είναι μια καλή υλοποίηση του υπολογισμού ενός πολυωνύμου. Μια καλύτερη υλοποίηση, η οποία χρησιμοποιεί λιγότερους υπολογισμούς, είναι ο κανόνας ή το σχήμα Horner, που καλείται, επί-σης, ένθετος πολλαπλασιασμός (nested multiplication).

p = b(1) + x*(b(2) + x*(b(3) + x*(b(4) + x*(b(5) ) ) ); (2.2) Η εξίσωση (2.1) απαιτεί 10 πολλαπλασιασμούς και 4 προσθέσεις, ενώ η εξίσωση (2.2) απαιτεί 4 πολλαπλασιασμούς και 4 προσθέσεις. Επειδή περιλαμβάνει λιγότε-ρους υπολογισμούς αριθμών κινητού σημείου, ο κανόνας του Horner είναι και πιο αποτελεσματικός και λιγότερο ευάλωτος σε σφάλματα στρογγυλοποίησης. Η αποθήκευση των συντελεστών του πολυωνύμου σ’ έναν πίνακα (array) επιτρέ-πει στον κανόνα του Horner να υλοποιηθεί με ένα βρόγχο for: n = … ; x = … ; p = b(n); for k = n-1:-1:1 p = p*x + b(k)' end Μερικές φορές απαιτούνται συγχρόνως ένα πολυώνυμο και η (οι) παράγωγός (οί) του. Επειδή

1 1

1 2

1 2

1n n

i inn i i

i i

dpp x b x b i x

dx

,

ένας μόνο βρόχος μπορεί να υπολογίσει και το pn(x) και το dpn/dx|x. (Αφήνεται ως άσκηση στον αναγνώστη). Αν και ο κανόνας του Horner είναι πιο αποτελεσματι-κός από τη χρήση δυνάμεων του x για τον υπολογισμό του πολυωνύμου, συνιστά-ται να χρησιμοποιείται η ενσωματωμένη συνάρτηση polyval για την εκτίμηση συ-νηθισμένων πολυωνύμων στο MATLAB (βλ. § 1.3.3).

Page 99: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 293

Σημειώστε ότι οι ενσωματωμένες συναρτήσεις για τον χειρισμό πολυωνύμων ορί-ζουν ένα πολυώνυμο σε φθίνουσες δυνάμεις του x. (βλ. § 1.3.3.) Η ιδέα των ένθε-των πολλαπλασιασμών μπορεί να εφαρμοστεί σε πολυώνυμα που ορίζονται σε φθίνουσες ή αύξουσες δυνάμεις του x.

2.4.6 Βρόχοι while Η γενική μορφή του βρόχου while είναι while παράσταση μπλοκ εντολών end Η οδόντωση του μπλοκ των εντολών συνιστάται σφόδρα. Το σώμα του βρόχου εκτελείται όσο η παράσταση αποτιμάται ‘‘αληθής’’. Ένας βρόχος while είναι χρήσιμος όταν, σε αντίθεση με το βρόχο for, οι υπο-λογισμοί είναι να επαναληφθούν ένα μη καθορισμένο πλήθος φορών. Τέτοιοι υπο-λογισμοί είναι συνηθισμένοι σε επαναληπτικές διαδικασίες στις οποίες η αρχική εκτίμηση βελτιώνεται μέχρι να ισχύσει κάποια συνθήκη. Ένα απλό παράδειγμα: x = 1; while x>0.01 x = x/2; end disp(x) Την πρώτη φορά που συναντάται η εντολή while, η τιμή του x είναι προφανώς μεγαλύτερη από 0.01, οπότε το σώμα του βρόχου εκτελείται. Ο βρόχος επαναλαμ-βάνεται μέχρι ο έλεγχος να επιστρέψει τιμή ‘‘ψευδής’’. Να σημειωθεί ότι είναι πάντοτε δυνατό να χρησιμοποιήσουμε έναν βρόχο for αντί του βρόχου while.

Παράδειγμα 2.7: Επαναλήψεις του Newton για τον Υπολογισμό της x Ένας τύπος που χρησιμοποιεί την μέθοδο του Newton για τον υπολογισμό της τε-τραγωνικής ρίζας του x, είναι

112

1

kkk r

xrr ,

όπου rk είναι η kη προσέγγιση της x . Οι υπολογισμοί ξεκινούν με μια αρχική προσέγγιση, συνήθως r0 = x, και συνεχίζονται μέχρις ότου δύο διαδοχικές προσεγ-

Page 100: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 294

γίσεις της τετραγωνικής ρίζας είναι τόσο κοντά ώστε η διαφορά τους να είναι αμε-λητέα. Μια υλοποίηση του αλγόριθμου αυτού είναι delta = . . . % ανοχή σύγγλισης r = . . . % αρχικοποίηση της r και rold rold = . . . while abs(rold-r) > delta rold = r; % αποθήκευση της παλιάς τιμής για έλεγχο σύγγλισης r = 0.5*(rold + x/rold); %ανανέωση εκτίμησης για τετρ. ρίζα end όπου delta είναι μια κατάλληλα επιλεγμένη τιμή ανοχής για σύγκλιση. Ο βρό-χος while είναι προτιμότερος από έναν βρόχο for στην περίπτωση αυτή, γιατί ο αριθμός των επαναλήψεων που απαιτούνται για την ικανοποίηση της συνθήκης σύγκλισης δεν είναι γνωστός κατά την εκκίνηση του βρόχου. Συνήθως, μια καλή ιδέα είναι να βάζουμε ένα πάνω όριο στον αριθμό των επαναλήψεων που γίνονται από έναν βρόχο while. Μια πιο ασφαλής έκδοση των υπολογισμών της τετραγω-νικής ρίζας θα μπορούσε να είναι η delta = . . . % ανοχή σύγγλισης r = . . . % αρχικοποίηση της r και rold rold = . . . it =0; % αρχικοποίηση μετρητή επαναλήψεων maxit = 25; % μέγιστος αριθμός επαναλήψεων while abs(rold-r) > delta & it<maxit rold = r; % αποθήκευση της παλιάς τιμής για έλεγχο σύγγλισης r = 0.5*(rold + x/rold); %ανανέωση εκτίμησης για τετρ. ρίζα it = it + 1; % αύξηση του μετρητή επαναλήψεων end Ο λογικός έλεγχος στην εντολή while απαιτεί και οι δύο συνθήκες να είναι αλη-θείς έτσι ώστε να εκτελεστεί το σώμα του βρόγχου.

2.4.7 Η Εντολή break Σε έναν επαναλαμβανόμενο υπολογισμό που περιέχει μια δομή while … end, πρέπει να υπάρχει ένας μηχανισμός διαφυγής έτσι ώστε να μην εμπλακούμε σε έναν ατέρμονα βρόχο (βρόχο χωρίς τέλος). Αυτό μπορεί συχνά να επιτευχθεί θέτο-ντας ένα πάνω όριο στον αριθμό των επαναλήψεων. Για παράδειγμα., ο επόμενος βρόχος ανανεώνει το x μέχρις ότου η αλλαγή στην τιμή του x από τη μια επανά-ληψη στην επόμενη να είναι μικρότερη από μια ανοχή:

Page 101: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 295

iter = 0; % μετρητής επανάληψης tol = . . . % ανοχή σύγκλισης xold = . . . % αρχικές τιμές x = . . . while iter<maxit xold = x; % αποθήκευση για έλεγχο σύγκλισης x = . . . % ανανέωση του x iter = iter+ 1; if abs((x-xold)/xold)<tol % έλεγχος για σύγκλιση. Αν αληθής,

break; % μεταπήδηση στην πρώτη εντολή μετά end % το περικλείον while … end end Όταν συναντάται μια εντολή break, ο βρόχος while που την περικλείει τερμα-τίζεται και η εκτέλεση συνεχίζει από την πρώτη εντολή μετά τον βρόχο. Η εντολή break μπορεί επίσης να χρησιμοποιηθεί εντός ενός βρόχου for … end. Ση-μειώστε ότι η εντολή break στην while . . . if . . . break; end end αναφέρεται, όχι στο if … end μπλοκ, αλλά στην while … end δομή που πε-ρικλείει το if … end μπλοκ. function k = demoBreak(n) % demoBreak % % Σύνοψη: k = demoBreak(n) % % Είσοδος: n = μέγεθος τυχαίου διανύσματος που θα δημιουργηθεί % % Έξοδος: k = ο πρώτος μικρότερος δείκτης x = random(1,n); k = 1; while k<=n if x(k)>0.8 break end

Page 102: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 296

k = k+1; end fprintf('x(k)=%f for k = %d n = %d\n',x(k),k,n); % τι συμβαίνει αν ο βρόχος if τερματίζεται χωρίς να βρεθεί x(k)>0.8?

Λίστα 2.8 Απλή συνάρτηση για την παρουσίαση της χρήσης της εντολής break. Παράδειγμα 2.8: Χρήση της Εντολής break Η συνάρτηση demoBreak στην Λίστα 2.8 είναι ένα επινοημένο πρόγραμμα για την παρουσίαση της χρήσης της εντολής break. Ένα διάνυσμα μήκους n δημι-ουργείται με στοιχεία τυχαίους αριθμούς μεταξύ 0 και 1 (βλ. “help rand”). Ο βρόχος χρησιμοποιείται για την εξέταση κάθε στοιχείου του διανύσματος. Η συ-νάρτηση επιστρέφει τον δείκτη του πρώτου στοιχείου που είναι μεγαλύτερο από 0.8. Για παράδειγμα, τρεις δυνατές έξοδοι είναι >> demoBreak(5) % ενδεχομένως τα αποτελέσματά σας μπορεί να διαφέρουν ans = 3 >> demoBreak(35) ans = 1 >> demoBreak(35) ans = 7 Παρατηρήστε ότι η εντολή break αναφέρεται όχι στην δομή if … end, αλλά στην δομή while … end. Όταν συναντάται μια τιμή του x(k)>0, η εκτέλεση μεταφέρεται στην εντολή fprintf αμέσως μετά την while … end. Η συνάρτηση demoBreak περιέχει ένα bug, όπως υποδηλώνεται με το σχόλιο στην τελευταία γραμμή της συνάρτησης. Η διόρθωσή του αφήνεται στον αναγνώ-στη ως άσκηση.

2.4.8 Η Εντολή return Ενώ η εντολή break τερματίζει τον βρόχο που την περικλείει, η εντολή return τερματίζει την τρέχουσα συνάρτηση (m-file) που εκτελείται. Όταν συναντάται μια

Page 103: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 297

εντολή return, οι τιμές από όλες τις παραμέτρους εξόδου που ορίστηκαν σε αυ-τήν τη φάση, περνιούνται πίσω στην καλούσα συνάρτηση, ή στον χώρο εργασίας αν η συνάρτηση κλήθηκε από την γραμμή εντολών. Το Σχήμα 2.3 δείχνει την δια-φορά ανάμεσα στις εντολές break και return. function k = demoBreak(n) . . . while k<=n if x(k)>0.8 break; end k = k+1; end μεταπηδά στο τέλος του περικλείοντος “while … end” μπλοκ

function k = demoReturn(n) . . . while k<=n if x(k)>0.8 return; end επιστρέφει στην καλούσα

k = k+1; συνάρτηση end

Σχήμα 2.2 Απεικόνιση της διαφοράς μεταξύ των εντολών break και return. Παράδειγμα 2.9: Χρήση της Εντολής return Η συνάρτηση demoReturn στην Λίστα 2.9 είναι μια παραλλαγή του προηγούμε-νου παραδείγματος. Αντί της εξόδου από το loop με την εντολή break, χρησιμο-ποιείται μια εντολή return για την έξοδο εξ ολοκλήρου από την συνάρτηση. Να σημειωθεί ότι η συνάρτηση demoReturn περιέχει το ίδιο bug όπως η συνάρτηση demoBreak. function k = demoReturn(n) % demoReturn % % Σύνοψη: k = demoReurn(n) % % Είσοδος: n = μέγεθος τυχαίου διανύσματος που θα δημιουργηθεί % % Έξοδος: k = ο πρώτος μικρότερος δείκτης x = random(1,n); k = 1; while k<=n if x(k)>0.8 return

Page 104: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 298

end k = k+1; end % τι συμβαίνει αν ο βρόχος τερματίζεται χωρίς να βρεθεί x(k)>0.8?

Λίστα 2.9 Συνάρτηση για την παρουσίαση της χρήσης της εντολής return.

2.5 Διανυσματικοποίηση Η διανυσματικοποίηση (vectorization) είναι ο μετασχηματισμός κώδικα που λει-τουργεί σε βαθμωτά σε υπολογίζει ανύσματα σε κώδικα που λειτουργεί σε διανύ-σματα. Ο μετασχηματισμός αυτός είναι πιο προφανής όταν ο αρχικός βαθμωτός κώδικας εκφράζεται με τις δομές βρόχων for ή while που διατρέχουν τα στοι-χεία ενός πίνακα ή ενός διανύσματος. Η διανυσματικοποίηση δεν αλλάζει το πλή-θος των αριθμητικών πράξεων που είναι αναγκαίες για να παράγουν ένα υπολογι-σμένο αποτέλεσμα. Απλά αλλάζει την αποτελεσματικότητα με την οποία οι πρά-ξεις αυτές εκτελούνται από το MATLAB. Διανυσματικοποιημένες εντολές εκτε-λούνται πολύ πιο γρήγορα από τις ισοδύναμες βαθμωτές εντολές επειδή οι διανυ-σματικοποιημένες εντολές εκτελούνται με βελτιστοποιημένο δυαδικό κώδικα στον πυρήνα του MATLAB και όχι με τον διερμηνευμένο (interpreted) βαθμωτό κώδικα σ’ ένα m-file. Η διανυσματικοποίηση παρουσιάστηκε στην § 1.2.5 ως μέσο σύνταξης συμπαγών εντολών που ενεργούν σε όλα τα στοιχεία ενός πίνακα ή διανύσματος. Σ’ αυτήν την ενότητα, δείχνουμε πως μπορεί να χρησιμοποιηθεί η διανυσματικοποίηση για τη βελτίωση της απόδοσης του κώδικα του MATLAB.

2.5.1 Χρήση Διανυσματικοποιημένων Πράξεων αντί Βρόχων Με τη χρήση των δομών while και for, μπορούν να γραφούν προγράμματα στο MATLAB που είναι άμεσες μεταφράσεις της Fortran ή της C. Τα προγράμματα αυτά, αν και συντακτικά είναι σωστά, μπορεί να μην είναι αποτελεσματικά επαρ-κώς όταν οι βρόχοι περιέχουν πολλές βαθμωτές πράξεις. Θεωρείστε έναν βρόχο για τον υπολογισμό της y = sin(3x) για 20 x dx = pi/30; nx = 1 + 2*pi/dx; for i=1:nx x(i) = (i-1)*dx; y(i) = sin(3*x(i));

Page 105: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 299

end Ο παραπάνω κώδικας αποτελείται από απόλυτα σωστές εντολές του MATLAB, αλλά είναι ένας μη αποτελεσματικός τρόπος για την δημιουργία των διανυσμάτων x και y. Η κύρια αιτία της μη αποτελεσματικότητας είναι ο διερμηνευμένος υπο-λογισμός των x(i) και y(i) ένα στοιχείο τη φορά. Ένας δεύτερος λόγος είναι ότι, κάθε φορά μέσω του βρόχου, το MATLAB πρέπει να διευρύνει τα διανύσματα x και y για να συμπεριλάβει ένα νέο στοιχείο (θέματα κατανομής μνήμης, περιγρά-φονται στην § 2.5.2.) Ο προτιμότερος τρόπος δημιουργίας των ίδιων διανυσμάτων x και y είναι x = 0:pi/30:2*pi y = sin(3*x) Όχι μόνο απαλείφεται ο βρόχος, αλλά και (δοθείσης μιας εξοικείωσης με τον συμ-βολισμό της άνω – κάτω τελείας) ο σκοπός του κώδικα είναι πιο εύκολο να συλ-ληφθεί. Πράξεις Αντιγραφής Ο πιο αποτελεσματικός τρόπος για την αντιγραφή των στοιχείων ενός πίνακα (ή διανύσματος) σε άλλον πίνακα, είναι η αποφυγή της χρήσης βρόχων. Αυτό επιτυγχάνεται με διανυσματικοποιημένες πράξεις αντιγρα-φής μέσω της χρήσης του συμβολισμό της άνω – κάτω τελείας. Η τεχνική θα πα-ρουσιασθεί μέσω παραδειγμάτων. Θεωρείστε ότι θέλουμε να αντιγράψουμε μια στήλη ενός πίνακα σε μια στήλη ενός άλλου πίνακα ο οποίος έχει τον ίδιο αριθμό γραμμών. Για παράδειγμα, ξεκι-νείστε με τους πίνακες Α και Β >> Α = [1 2 3; 4 5 6; 7 8 9]; >> Β = ones(size(A)); και αντιγράψτε την πρώτη στήλη του Α στην πρώτη στήλη του Β. Η βαθμωτή και διανυσματικοποιημένη μορφή των πράξεων αντιγραφής είναι οι ακόλουθες: Βαθμωτός Κώδικας Διανυσματικός Κώδικας for i=1:3 B(i,1) = A(i,1); B(:,1) = A(:,1) end Οι πράξεις αντιγραφής μπορούν να συμπεριλάβουν οποιονδήποτε συνδυασμό γραμμών και στηλών, αρκεί να καθορίζεται ο ίδιος αριθμός στοιχείων και στον πηγαίο πίνακα και στον πίνακα στόχο και εφόσον οι διαστάσεις των δύο πινάκων

Page 106: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 300

είναι συμβατές. Για παράδειγμα, τμήμα της τελευταίας στήλης του πίνακα Α, που μόλις ορίστηκε, μπορεί να αντιγραφεί σε τμήμα της πρώτης γραμμής του πίνακα Β. Οι ισοδύναμες (βαθμωτή και διανυσματική) εκδόσεις μιας τέτοιας πράξης αντι-γραφής είναι οι ακόλουθες: Βαθμωτός Κώδικας Διανυσματικός Κώδικας for i=2:3 B(1,j) = A(j,3); B(1,2:3) = A(2:3,3)' end Οι διανυσματικοποιημένες πράξεις αντιγραφής με τη χρήση του συμβολισμού της άνω – κάτω τελείας, μπορούν να χρησιμοποιηθούν για κρυπτογραφικό κώδικα. Επειδή καλόν είναι να κάνουμε τον κώδικα πιο ευανάγνωστο, θα πρέπει να δίνο-νται προτάσεις σχολίων για την επεξήγηση διανυσματικοποιημένων πράξεων αντι-γραφής.

3.5.2 Δέσμευση Μνήμης για Διανύσματα και Πίνακες Αν και το MATLAB θα αυξήσει αυτόματα το μέγεθος ενός πίνακα (ή διανύσματος) για να συμπεριλάβει νέα στοιχεία, συνήθως καλόν είναι να δεσμεύσουμε μνήμη για τον πίνακα. Αυτό είναι ιδιαίτερα σημαντικό όταν στοιχεία ενός πίνακα ανατί-θενται ένα κάθε φορά μέσα σε έναν βρόχο. Η δέσμευση μνήμης περιλαμβάνει την δημιουργία ενός πίνακα (ή διανύσματος) με μια διανυσματικοποημένη εντολή προτού το οποιδήποτε από τα στοιχεία του πίνακα αναφερθεί ατομικά. Υποθέστε ότι το διάνυσμα s δεν έχει οριστεί πριν την εκτέλεση του ακόλουθου βρόχου: y = . . . for j = 1:length(y) if y(j)>0 s(j) = sqrt(y(j)); else s(j) = 0; end end Ο βρόχος περιέχει έγκυρες εντολές του MATLAB, αλλά δεν είναι αποτελεσματικός γιατί το s διευρύνεται επανειλημένα για να μπορεί να χειρίζεται περισσότερα στοιχεία. Η δέσμευση της μνήμης για το s έχει να κάνει με την εισαγωγή s = zeros(size(y)) πριν την εκκίνηση του βρόχου for:

Page 107: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 301

y = . . . s = zeros(size(y)); for j = 1:length(y) if y(j)>0 s(j) = sqrt(y(j)); end end Τα πλεονεκτήματα της δέσμευσης μνήμης είναι ότι ο χρόνος που χρειάζεται για τον επιμερισμό μνήμης για έναν πίνακα γίνεται μόνο μια φορά και τα στοιχεία του πίνακα αποθηκεύονται σε γειτονικά μπλοκ στον χώρο μνήμης του MATLAB. Ση-μειώστε ότι η δέσμευση μνήμης, στο παράδειγμα αυτό, έχει επίσης περιορίσει την ανάγκη της ανάθεσης s(j)=0 μέσα στο σώμα του βρόχου. Αυτό συνεισφέρει ακόμα περισσότερο στην αποτελεσματικότητα.

3.5.3 Διανυσματικοποιημένοι Δείκτες και Λογικές Συναρτήσεις Η χρήση των πινάκων, από το MATLAB, ως μια βασική δομή δεδομένων επιτρέπει συμπαγείς παραστάσεις οι οποίες δεν εμφανίζονται σε άλλες γλώσσες προγραμμα-τισμού. Μια σημαντική εφαρμογή της σύνταξης με πίνακες είναι η χρήση ενός διανύσματος ή ενός πίνακα ως δείκτη των στοιχείων ενός άλλου πίνακα. Αυτό κα-λείται array indexing (πινακοποιημένη δεικτοδότηση). Μια σχετική, αλλά διαφο-ρετική, τεχνική είναι η logical indexing (λογική δεικτοδότηση), στην οποία ένας πίνακας από μονάδες και μηδενικά, χρησιμοποιείται ως φόρμα για την επιλογή στοιχείων από έναν άλλο πίνακα. Και οι δυο δεικτοδοτήσεις επιτρέπουν να εκτε-λούνται πράξεις σε ολόκληρους πίνακες,περιορίζοντας έτσι την ανάγκη να γρά-φουμε αναλυτικούς βρόχους. Το αποτέλεσμα είναι συμπαγής κώδικας που εκτελεί-ται γρηγορότερα. Ένα μειονέκτημα είναι ότι η χρήση των δυο αυτών δεικτοδοτή-σεων έχει ως αποτελέσμα έναν μάλλον κρυπτογραφικό κώδικα, που είναι δύσκολο να αποκρυπτογραφηθεί από άπειρους προγραμματιστές του MATLAB. Αrray indexing Θεωρείστε τις ακόλουθες εντολές: >> x = 10:10:50 % Ορίζει ένα διάνυσμα γραμμή >> y = [5 3 1 2 4]; % Ένα άλλο διάνυσμα ίδιας μορφής με το x >> z = x(y) % Χρήση του y ως δείκτη στο x z = 50 30 10 20 40

Page 108: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 302

Το x(y) έχει ως αποτέλεσμα να χρησιμοποιούνται τα στοιχεία του y ως δείκτες του x. Η εντολή z = x(y) είναι η διανυσματικοποημένη ισοδύναμη του ακό-λουθου βαθμωτού βρόχου: for i = 1:length(y) z(i) = x(y(i)); end Η μορφή με τον βρόχο καθιστά φανερό ότι για να αποφεύγονται σφάλματα δει-κτοδότησης, (1) τα στοιχεία του y πρέπει να έχουν τιμές ανάμεσα στο 1 και το length(x) και (2) length(y)<=length(x). Δύο παραδείγματα των τύπων σφαλμάτων που μπορεί να εμφανιστούν: >> y(i) = 6 y = 6 3 1 2 4 >> x(y) ??? Index exceeds matrix dimensions. >> y(1) = -2; >> x(y) Warning: Subscript indices must be integer values. ??? Index into matrix is negative or zero. See release notes on changes to logical indices. Οι κανόνες για την δεικτοδότηση πινάκων συνοψίζονται στο Σχήμα 3.4. Λογικές Πράξεις και Λογική Δεικτοδότηση Μια λογική πράξη επιστρέφει 1 ή 0 (αληθής ή ψευδής) ως αποτέλεσμα της αποτίμησης μιας σχεσιακής παράστασης ή εκτέλεσης μιας λογικής συνάρτησης. Δυο απλά παραδείγματα είναι >> y = pi<sqrt(10) y = 1 και >> r = isreal(sqrt(-2)) r = 0

Page 109: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 303

Κανόνες για την πράξη λογικής ή πινακοποιημένης δεικτοδότησης C=A(B):

1. Το πλήθος των στοιχείων του Β δεν πρέπει να είναι μεγαλύτερο από το πλήθος των στοιχείων του Α.

2. Όταν Α και Β είναι πίνακες (εν αντιθέσει με διανύσματα), η τάξη εξαγωγής στοιχείου καθορίζεται ως εάν Α και Β μετατρέπονταν πρώτα σε διανύσματα – στήλη. Με άλλα λόγια , C=A(B) είναι ισοδύναμη με

X =A(:); Y = B(:); C = X(Y);

3. Για την πινακοποιημένη δεικτοδότηση, οι τιμές των στοιχείων του Β πρέπει να είναι ισχύοντες δείκτες του Α.

4. Για την λογική δεικτοδότηση, τα στοιχεία του Β πρέπει να είναι μόνο μονάδες ή μηδενικά. Σχήμα 2.3 Κανόνες για την λογική και πινακοποιημένη δεικτοδότηση. ΠΙΝΑΚΑΣ 2.6 ΕΝΑ ΔΕΙΓΜΑ ΕΝΣΩΜΑΤΩΜΕΝΩΝ ΛΟΓΙΚΩΝ ΣΥΝΑΡΤΗΣΕΩΝ Συνάρτηση Περιγραφή Επιστρεφόμενη τιμή all(X) αληθής αν όλα τα στοιχεία του Χ είναι

μη μηδενικά βαθμωτό

any(x) αληθής για κάθε στήλη του Χ που έχει μη μηδενικά στοιχεία

βαθμωτό αν Χ διάνυσμα. Διάνυσμα γραμμή αν Χ πίνακας

isreal(X) αληθής αν το Χ έχει μόνο πραγματικά στοιχεία

βαθμωτό

isstudent(X) αληθής αν η έκδοση που τρέχει είναι η φοιτητική

βαθμωτό

isempty(X) αληθής αν ο Χ είναι ένας κενός πίνα-κας, [ ]

βαθμωτό

isnumeric(X) αληθής αν ο Χ είναι αριθμητικός (εν αντιθέσει με string, cell ή struct)

βαθμωτό

isnan(X) αληθής για κάθε στοιχείο του Χ που είναι ένα ΝΑΝ.

Πίνακας ίδιας μορφής με Χ

isfinite(X) αληθής για κάθε στοιχείο του Χ που είναι μικρότερο του Inf.

Πίνακας ίδιας μορφής με Χ

Ο Πίνακας 2.6 δίνει ένα μικρό δείγμα των ενσωματωμένων συναρτήσεων του MATLAB. Σημειώστε ότι η μορφή της επιστρεφόμενης τιμής από τις λογικές συ-ναρτήσεις ποικίλει. Μερικές συναρτήσεις, όπως η isreal, πάντα επιστρέφουν βαθμωτά, ενώ άλλες συναρτήσεις, όπως η isnan, επιστρέφουν πίνακες της ίδιας μορφήςς με τους πίνακες εισόδου. Η συνάρτηση any έχει την ιδιόμορφη συμπερι-

Page 110: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 304

φορά να επιστρέφει ένα διάνυσμα γραμμή αν η είσοδος είναι ένας πίνακας και ένα βαθμωτό αν η είσοδος είναι ένα διάνυσμα ή ένα βαθμωτό. Όπως σημειώνεται στην § 2.4.1, σχεσιακοί τελεστές μπορούν να χρησιμοποιηθούν για τη δημιουργία λογικών αποτελεσμάτων. Όταν ένας σχεσιακός τελεστής εφαρ-μόζεται σε δύο ή περισσότερους συμβατούς πίνακες, το αποτέλεσμα είναι ένας πίνακας με 1 και 0. Για παράδειγμα,14 θεωρείστε τον κώδικα >> A = rand(3,3) A = 0.9501 0.4860 0.4565 0.2311 0.8913 0.0185 0.6068 0.7621 0.8214 >> F = A>0.5 F = 1 0 0 0 1 0 0 0 1 Η παράσταση F = A>0.5 είναι ισοδύναμη με το ακόλουθο βαθμωτό κώδικα: [m, n] = size(A); F = zeros(m,n); for i=1:m for j=1:n if A(i,j)>0.5 F(i,j)=1; end end end Στις περισσότερες εκτιμήσεις ο F είναι ένας συνήθης πίνακας του MATLAB. Ο F είναι ειδικός, ωστόσο, ως προς το ότι τα στοιχεία του είναι μόνο 1 και 0. Αυτό επι-τρέπει να χρησιμοποιείται ο F για λογική δεικτοδότηση των στοιχείων του Α. Η λογική δεικτοδότηση διευκολύνει έναν δείκτη πίνακα (ή διάνυσμα) να εξάγει στοι-χεία από έναν άλλο πίνακα. (καλέστε τον πηγαίο πίνακα). Ο δείκτης πίνακας πρέ-πει να περιέχει μόνο 1 και 0 και δεν πρέπει να έχει περισσότερα στοιχεία από τον πηγαίο πίνακα που χρησιμοποιείται ως δείκτης. Δοθέντων των Α και F όπως ακρι-βώς ορίστηκαν, ο Α(F) χρησιμοποιεί τον F για λογική δεικτοδότηση τουΑ:

14 Η συγκεκριμένη μορφή των μονάδων και των μηδενικών στην F θα ποικίλει κάθε φορά που καλείται η rand.

Page 111: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 305

>> b = A(F) b = 0.9501 0.6068 0.8913 0.7621 0.8214 Η έκφραση A(F) χρησιμοποιεί τον F σαν μια φόρμα για την επιλογή των (i,j) στοιχείων του Α που αντιστοιχούν στο F(i,j) = 1. Η ανάθεση b = A(F) είναι ισοδύναμη με τον βαθμωτό κώδικα [m, n] k = 0; for i = 1:m for j = 1:n if F(i,j) = = 1 k = k+1; b(k) = A(i,j); end end end Αν o σκοπός είναι η εξαγωγή εκείνων των στοιχείων του Α που ικανοποιούν τα κριτήρια A(i,j)>0.5, τότε ο πίνακας F δεν χρειάζεται να δημιουργηθεί. Αντι-θέτως, μπορούμε να γράψουμε απλώς >> b = A(A>0.5) Οι κανόνες για λογική δεικτοδότηση συνοψίζονται στο Σχήμα 2.4. Είναι οι ίδιοι κανόνες για την πινακοποιημένη δεικτοδότηση, εκτός του ότι επιτρέπονται δείκτες με τιμή μηδέν. Η Συνάρτηση find Η ενσωματωμένη συνάρτηση find είναι χρήσιμη σε πολλές εφαρμογές λογικής και πινακοποιημένης δεικτοδότησης. Η συνάρτηση find παίρνει μια λογική παράσταση πινάκων και επιστρέφει ένα σύνολο δεικτών μονοδιάστατων πινάκων για τα στοιχεία του εισαγόμενου ορίσματος που ικανο-ποιούν τη συνθήκη. Η σύνταξη της συνάρτησης find είναι indexVector = find(findCondition)

Page 112: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 306

Η παράσταση findCondition θα πρέπει να παράγει έναν πίνακα με 1 και 0. Το indexVector είναι ένα διάνυσμα που περιέχει μόνο εκείνους τους δείκτες για τους οποίους η findCondition είναι αληθής. Αν η findCondition παράγει έναν πίνακα, το αποτέλεσμα της find είναι ένα διάνυσμα των θέσεων των μη μη-δενικών της findCondition όταν η findCondition μετατρέπεται ως ένα διάνυσμα στήλη, όπως >> A = rand(3,3) A = 0.4447 0.9218 0.4057 0.6154 0.7382 0.9355 0.7919 0.1763 0.9169 >> A>0.5 ans = 1 0 0 0 1 0 0 0 1 >> find(A>0.5) ans = 1 3 5 6 9 Δοθέντος του A = rand(3,3), είναι χρήσιμο να αντιπαραθέσουμε τις ακόλου-θες δύο παραστάσεις: >> b = A(A>0.5)) >> i = find(a>0.5) b = i = 0.9501 1 0.6068 3 0.8913 5 0.7621 6 0.8214 9 Στα αριστερά η A(A>0.5)), επιστρέφει τις τιμές των στοιχείων του Α που ικα-νοποιούν τη συνθήκη A(i)>0.5. Στα δεξιά, η find(A>0.5), επιστρέφει τους δείκτες που ικανοποιούν τη συνθήκη A(i)>0.5. Για τον λόγο αυτό, η A(find(A>0.5)) είναι ισοδύναμη με την A(A>0.5).

Page 113: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 307

Παράδειγμα 2.10: Ανάθεση τιμών κοντά στο μηδέν Η συνάρτηση Glnodes υπολογίζει τους κόμβους ή κορυφές (nodes) και τα βάρη για τους κανόνες αριθμητικής ολοκλήρωσης των Gauss-Legendre. Για τους κανό-νες Gauss-Legendre περιττής σειράς, ένας από τους κόμβους είναι στο x = 0. Εξαι-τίας της στρογγυλοποίησης η συνάρτηση GLnodes επιστρέφει μια τιμή κοντά στο 0, αλλά όχι ίση με 0. Εδώ, για παράδειγμα, είναι το αποτέλεσμα για τον κανό-να αριθμητικής ολοκλήρωσης τάξης 3: >> [x,w] = GLnodes(3) x = -0.7746 -0.0000 -0.7746 w = 0.5556 0.8889 0.5556 Η τιμή της x(2) θα έπρεπε να είναι μηδέν, αλλά αντί γι’ αυτό είναι ένας αριθμός της τάξεως του m (= σφάλμα μηχανής).

>> x(2) ans = -1.1102e-16 Υποθέστε ότι είναι σημαντικό να θέσουμε την τιμή αυτήν ακριβώς μηδέν. Η προ-φανής εντολή x(2) = 0 δουλεύει μόνον για τον κανόνα αριθμητικής ολοκλή-ρωσης τάξεως 3. Για άλλους κανόνες, ο κόμβος ίσος με μηδέν θα έχει έναν δείκτη διαφορετικό από 2. Οι ακόλουθες διανυσματικοποιημένες εντολές του MATLAB βρίσκουν τα «μικρά» αυτά στοιχεία του διανύσματος x και τα θέτουν ίσα με το μηδέν: >> x (abs(x)<100*eps) = 0 x = -0.7746 0 0.7746 Στην συγκεκριμένη εφαρμογή, οι διανυσματικοποιημένη εντολή είναι κατά κάποιο τρόπο περιττή, γιατί ο έλεγχος εφαρμόζεται σε όλα τα στοιχεία του x. Από τη φύ-ση του κανόνα αριθμητικής ολοκλήρωσης, γνωρίζουμε ότι το μεσαίο στοιχείο του

Page 114: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 308

x είναι μηδέν μόνον όταν είναι περιττής τάξεως. Οι ακόλουθες εντολές εκμεταλεύ-ονται την γνώση αυτή: k = . . . % τάξη του κανόνα αριθμ. ολοκλήρωσης if rem(round(k),2)~=0 %αληθής αν k είναι περιττός, round(k) εγγυάται

%έναν ακέραιο x(1+fix(k/2)) = 0; % μεσαίος ακέραιος είναι 1 + k/2 end Σε άλλες εφαρμογές, οι δείκτες με τα ‘‘κοντά στο μηδέν’’ στοιχεία μπορεί να μην είναι γνωστοί εκ των προτέρων. Στην περίπτωση αυτή, μια λογική πράξη που α-φορά μια αναζήτηση σε όλα τα στοιχεία του πίνακα στόχου, είναι η μόνη λύση. Παράδειγμα 2.11: Διανυσματικοποίηση μιας Αύξουσας Βηματικής Αναζή-

τησης Μια αύξουσα βηματική αναζήτηση είναι ένας τρόπος να βρούμε τον δείκτη i σε ένα διατεταγμένο διάνυσμα x, όπως

x i xhat x i 1 (2.4)

όπου xhat είναι μια τιμή εισόδου για την αναζήτηση. Αυτός ο τύπος πράξης είναι απαραίτητος για την παρεμβολή σε έναν πίνακα δεδομένων. O ακόλουθος βαθμω-τός κώδικας χρησιμοποιείται για την παρουσίαση της λογικής που εμπεριέχεται σε μια αύξουσα βηματική αναζήτηση (η αναζήτηση γίνεται μέσα στο βρόχο while): x = . . . %ένα διάνυσμα τιμών xhat = . . . %η τιμή ελέγχου n = length(x); if xhat<x(1) | xhat>x(n) error(sprintf('Test value of %g is not in range of x',xhat)); end i = n; while x(i)>xhat & i>1 i = i-1 end Η βελτιστοποίηση του κώδικα αυτού απαιτεί αντικατάσταση του βρόχου while με διανυσματικοποιημένες πράξεις. Ο βαθμωτός βρόχος while μπορεί να αντικα-τασταθεί από την παράσταση i = max(find(x<=xhat)) Για να δούμε πως δουλεύει αυτό, ξεχωρίζουμε το δεξιό σκέλος της παράστασης από το εσωτερικό. Για να είμαστε συγκεκριμένοι, υποθέτουμε ότι xhat = 3.7

Page 115: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 309

και x = 0:5. Τότε, μέσω ελέγχου, το i = 4 ικανοποιεί την εξίσωση (2.4). Η εσω-τερική παράσταση δίνει >> xhat = 3.7; x = 0:5; >> x<=xhat ans = 1 1 1 1 0 0 που δείχνει ότι τα τέσσερα πρώτα στοιχεία του x ικανοποιούν την συνθήκη x(i)<=xhat. Η εφαρμογή της εντολής find στην x<=xhat δίνει τους δείκτες στο διάνυσμα του αποτελέσματος: >> find(x<=xhat) ans = 1 2 3 4 Επιλέγοντας τον μεγαλύτερο δείκτη με την max βρίσκουμε το μεγαλύτερο i τέτοιο ώστε x(i)<=xhat: >> i = max(find(x<=xhat)) i = 4 Η παράσταση max(find(x<=xhat)) παρέχει τον σωστό δείκτη στο διάνυσμα x, εκτός εάν xhat είναι ακριβώς ίσο με το τελευταίο στοιχείο του x. Σαν παρά-δειγμα, εξετάστε το αποτέλεσμα των ακόλουθων εντολών: >> x = 0:5; xhat = 5; >> i = max(find(x<=xhat)) i = 6 Όταν i = length(x), η παράσταση x(i+1) στην εξίσωση (2.4) προκαλεί ένα εσφαλμένο δείκτη. Αυτό είναι πρόβλημα, για παράδειγμα, σε μια γραμμική πα-ρεμβολή που απαιτεί τις τιμές του x(i) και x(i+1). Η λύση είναι να κάνουμε έναν δεύτερο έλεγχο για να σιγουρευτούμε ότι η τιμή του i είναι μικρότερη από το length(x). Η ολοκληρωμένη πράξη αναζήτησης περιλαμβάνεται στις δύο γραμμές >> i = max(find(x<=xhat)); >> if i == length(x), i=i-1; ή , εναλλακτικά

Page 116: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 310

>> i = max(find(x<=xhat)); >> i = min(i,length(x)-1); Άλλες υλοποιήσεις της αύξουσας βηματικής αναζήτησης είναι επίσης δυνατές.

2.6 Ειδικές Περιπτώσεις Καθώς περισσότερες δυνατότητες προστίθενται σε ένα πρόγραμμα, η λογική να αντιμετωπίσουμε ειδικές περιπτώσεις μπορεί μερικές φορές να γίνει παραμορφω-τική. Οι πολλές εξαιρέσεις, για παράδειγμα, μπορεί να οδηγήσουν σε μπερδεμένες εντολές if … end. Συχνά, οι καταστάσεις αυτές πρέπει να επιλύονται με ριζική επανασχεδίαση του κώδικα. Σε άλλες περιπτώσεις, μια καλή λύση μπορεί να επι-τευχθεί με προγραμματισμό που είναι κάτι σαν τον από μηχανής θεό. Τέσσερις τέτοιες περιπτώσεις στο MATLAB είναι η πρόνοια για μεταβλητές παραμέτρους εισόδου και εξόδου, οι γενικές (global) μεταβλητές, η συνάρτηση feval και in-line αντικείμενα. Αυτά είναι εξειδικευμένα εργαλεία για την επίλυση συγκεκριμέ-νων προγραμματιστικών προβλημάτων.

2.6.1 Μεταβλητός Αριθμός Παραμέτρων Εισόδου και Εξόδου Τα function m-files μπορεί να γίνουν πολύ ευέλικτα και εύκολα στην χρήση αν ο αριθμός των παραμέτρων μπορεί να αλλάξει ανάλογα με τις ανάγκες του χρήστη ή του προγράμματος που τις καλεί. Πολλές από τις συναρτήσεις στην βασική εργα-λειοθήκη χρησιμοποιούν αυτήν την δυνατότητα. Σαν παράδειγμα, θεωρείστε την ενσωματωμένη συνάρτηση plot, η οποία μπορεί να κληθεί με πολλούς τρόπους: plot(x,y)' plot(x,y,'+'); plot(x1,y1,x2,y2); plot(x1,y1,'+',x2,y2,'ro'); Χωρίς την δυνατότητα χρήσης μεταβλητών παραμέτρων εισόδου, είτε η εργαλειο-θήκη του προγράμματος θα έπρεπε να περιέχει έναν μεγάλο αριθμό πολύ παρό-μοιων συναρτήσεων plot για την αντιμετώπιση όλων των ειδικών περιπτώσεων, ή η συνάρτηση plot θα απαιτούσε μια μεγάλη λίστα επιλογών ακόμα και για τα πιο απλά διαγράμματα. Η χρήση της συνάρτησης plot είναι πολύ πιο εύκολη με μεταβλητούς αριθμούς παραμέτρων εισόδου.

Page 117: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 311

Προαιρετικές παράμετροι εισόδου και εξόδου γίνονται δυναττές με τις δυο ειδικές μεταβλητές, nargin και nargout, που είναι αυτόματα ορισμένες για κάθε func-tion m-file. Η τιμή της nargin είναι ο αριθμός των παραμέτρων εισόδου (ορί-σματα) με τις οποίες κλήθηκε η συνάρτηση. Η τιμή της nargout είναι ο αριθμός των παραμέτρων εξόδου που αναμένεται να επιστραφούν. Οι τιμές των nargin και nargout μπορεί να είναι διαφορετικές κάθε φορά που καλείται η συνάρτηση, οπότε για να υποστηρίζει αυτήν την δυνατότητα, η συνάρτηση πρέπει να έχει μια λογική για να αποφασίζει πώς να διεκπαιρεώσει την είσοδο και πώς να πακετάρει την έξοδο. Η υποστήριξη μεταβλητού αριθμού των παραμέτρων εισόδου και εξόδου μπορεί να συμπεριληφθεί σε εκτεταμένη λογική κώδικα, ειδικά όταν στην λίστα εισόδου υπάρχουν διαφορετικοί τύποι μεταβλητών (δηλ. string ή numeric). Για παράδειγ-μα, θεωρείστε την λογική που είναι αναγκαία για την υποστήριξη των διαφόρων ειδών εισερχόμενων που είναι αποδεκτά από την ενσωματωμένη συνάρτηση plot. Παράδειγμα 2.12: Παρουσίαση Μεταβλητών Παραμέτρων Εισόδου και

Εξόδου Η συνάρτηση demoArgs στην Λίστα 2.10 παρουσιάζει το πως η nargin και η nargout μπορούν να χρησιμοποιούνται με μεταβλητούς αριθμούς παραμέτρων εισόδου και εξόδου. Όπως είναι τυπικό όταν χρησιμοποιείται η nargin, οι προ-αιρετικές παράμετροι εισόδου προωθούνται κατά την εκκίνηση της συνάρτησης. Η demoArgs είναι το κέλυφος μιας συνάρτησης. Εμφανίζει το πλήθος των παρα-μέτρων εισόδου και υπολογίζει το άθροισμα και το γινόμενο των εισαγόμενων. Ο αριθμός των παραμέτρων εξόδου στην κλήση της demoArgs καθορίζει ποιες από τις υπολογισμένες τιμές επιστρέφονται στην καλούσα ρουτίνα. Όταν χρησιμοποιούνται προαιρετικές παράμετροι εισόδου και εξόδου, τότε στον ορισμό της συνάρτησης (στην πρώτη γραμμή του m-file) πρέπει να καθοριστούν όλες οι πιθανές παράμετροι. Οι τιμές των nargin και nargout καθορίζουν ποιες από αυτές τις παραμέτρους είναι σημαντικές για μια συγκεκριμένη εκτέλεση της συνάρτησης. Οι μεταβλητές παράμετροι εξόδου ορίζονται μόνον αν ο χρήστης περιμένει από αυτές να επιστραφούν. Έτσι, στην demoArgs, το άθροισμα των τιμών εισόδου υπολογίζεται και αποθηκεύεται στην sumin. Το αποτέλεσμα αντι-γράφεται στην out1 αν η nargout είναι μεγαλύτερη ή ίση με την μονάδα. function [out1,out2] = demoArgs(in1,in2,in3) % demoArgs Μεταβλητοί αριθμοί παραμέτρων εισόδου και εξόδου

Page 118: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 312

% Σύνοψη: demoArgs % demoArgs(in1) % demoArgs(in1,in2) % demoArgs(in1,in2,in3) % out1 = demoArgs(in1,in2,in3) % [out1,out2] = demoArgs(in1,in2,in3) % % Είσοδος: in1, in2, in3 = optional input arguments % Έξοδος: out1, out2= optional output arguments if nargin == 0 disp('no input arguments'); return' elseif nargin == 1 disp('one input argument'); sumin = in1; prodin = in1 elseif nargin == 2 disp('two input arguments'); sumin = in1+in2; prodin = in1 + in2; elseif nargin == 3 disp('three input arguments'); sumin = in1+in2+in3; prodin = in1+in2+in3; else error ('Too many inputs to demoArgs'); end if nargout == 0 return; elseif nargout == 1 out1 = sumin; else out1 = sumin; out2 = prodin; end

Λίστα 2.10 Η συνάρτηση demoArgs σχεδιασμένη για την παρουσίαση της χρή-σης μεταβλητού πλήθους παραμέτρων εισόδου και εξόδου.

2.6.2 Καθολικές μεταβλητές Οι καθολικές μεταβλητές είναι ένας τρόπος για να αποφεύγει κανείς τις λίστες πα-ραμέτρων εισόδου και εξόδου των συναρτήσεων. Η χρήση καθολικών μεταβλητών στον προγραμματισμό μπορεί να λύσει μεγάλα προβλήματα στον κώδικα, αλλά οι καθολικές μεταβλητές δεν θα πρέπει να χρησιμοποιούνται όταν οι βασικές λίστες παραμέτρων εισόδου και εξόδου μπορούν να κάνουν την ίδια δουλειά. Οι καθολι-κές μεταβλητές μερικές φορές υπερχρησιμοποιούνται από προγραμματιστές οι οποίοι, για οικονομία, δεν χρησιμοποιούν παραμέτρους εισόδου και εξόδου για

Page 119: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 313

την επικοινωνία με ένα function m-file. Κάτι τέτοιο συνήθως οδηγεί σε ένα περί-πλοκο δίκτυο m-files που διασυνδέονται με περίεργους τρόπους. Το διάβασμα μιας συλλογής m-files που μοιράζονται καθολικές μεταβλητές απαιτεί την ταυτόχρονη κατανόηση όλων των m- files. Αντίθετα, περιορίζοντας την επικοινωνία μεταξύ των συναρτήσεων στις λίστες των παραμέτρων εισόδου και εξόδου επιτρέπει στον αναγνώστη να κατανοήσει κάθε m-file ως αυθύπαρκτη μονάδα. Ωστόσο, υπάρ-χουν μερικές καταστάσεις κατά τις οποίες η χρήση καθολικών μεταβλητών μπορεί να οδηγήσει σε μια ιδανική προγραμματιστική λύση. Όταν δεν χρησιμοποιούνται καθολικές μεταβλητές, οι μεταβλητές στον χώρο ερ-γασίας (βλ. § 1.4.1) διαχωρίζονται από τις μεταβλητές που χρησιμοποιούνται στις συναρτήσεις που καλούνται από το χώρο εργασίας ή άλλες συναρτήσεις. Η κατά-σταση αυτή απεικονίζεται στο πάνω μισό τμήμα του Σχήματος 2.5. Οι τιμές των x, y και s που είναι ορισμένες στο παράθυρο εντολών, αντιγράφονται στις εσωτερι-κές μεταβλητές a, b και c της localFun.

Επικοινωνία των τιμών μέσω μεταβλητών εισόδου και εξόδου

χώρος εργασίας localFun.m >> x = 1 (x,y,s) (a,b,c) Function d=localFun(a,b,c)

>> y = 2 . . . >> s = 1.2 . . . >>z = localFun(x,y,s) z d d = a + b^c

Επικοινωνία των τιμών μέσω μεταβλητών εισόδου και εξόδου και καθολικών με-ταβλητών που διαμοιράζονται από το χώρο εργασίας και συνάρτηση

χώρος εργασίας globalFun.m >> x = 1; (x,y) (a,b) function d =globalFun(a,b)

>> y = 2; . . . >> global ALPHA; global ALPHA >> . . . . . . >> ALPHA = 1.2; >> z = globalFun(x,y)

z d d = a + b^ALPHA;

Σχήμα 2.4 Αποφυγή των παραμέτρων εισόδου και εξόδου με χρήση καθολικών

μεταβλητών. Η τιμή της c μέσα στην localFun υπολογίζεται και μετά αντιγράφεται πίσω στην μεταβλητή z στο παράθυρο εντολών. Οι μεταβλητές x, y και z στο παράδειγ-μα αυτό, υπάρχουν μόνο στον χώρο εργασίας, ενώ οι a, b, c και d ανήκουν σε έ-ναν ξεχωριστό χώρο μνήμης, ο οποίος υπάρχει μόνο κατά την εκτέλεση της localFun.

Page 120: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 314

Οι καθολικές μεταβλητές παρέχουν άμεση πρόσβαση στις μεταβλητές που ορίζο-νται στο χώρο εργασίας ή σε άλλες συναρτήσεις. Ένα παράδειγμα φαίνεται στο κάτω μισό μέρος του Σχήματος 2.5. Όπως και πριν, οι x και y ορίζονται στο παρά-θυρο εντολών και αντίγραφα δίνονται ως είσοδος στην globalFun. Άλλη μια μεταβλητή, η ALPHA, ορίζεται ως γενική μεταβλήτη ως εξής global ALPHA Στην εισαγωγή αυτή, τα ονόματα των καθολικών μεταβλητών είναι πάντα σε κε-φαλαία για να διακρίνουμε τις μεταβλητές αυτές. Σε μια δήλωση μπορούμε να ο-ρίσουμε πολλές μεταβλητές, όπως global ALPHA SIGMA ZETA Σημειώστε ότι οι μεταβλητές στην δήλωση καθολικότητας χωρίζονται με κενά και δεν υπάρχει ερωτηματικό στο τέλος της γραμμής. Όπως φαίνεται στο Σχήμα 2.5, η καθολική μεταβλητή πρέπει να οριστεί ως τέτοια και στον χώρο εργασίας και στην συνάρτηση που χρειάζεται πρόσβαση για τη με-ταβλητή αυτή. Ακόμα, το όνομα της μεταβλητής πρέπει να είναι ακριβώς το ίδιο και στους δύο ορισμούς. Στο παράδειγμα αυτό, δεν είναι απαραίτητο να ορίσουμε την ALPHA ως καθολική μεταβλητή. Η τιμή της ALPHA μπορεί και πρέπει να πε-ραστεί ως παράμετρος εισόδου στην globalFun. Δεν είναι απαραίτητο να εμπλέξουμε τον χώρο εργασίας στις διαμοιραζόμενες καθολικές μεταβλητές: δύο συναρτήσεις μπορούν να μοιράζονται καθολικές μετα-βλητές με τον ίδιο τρόπο που οι καθολικές μεταβλητές μοιράζονται μεταξύ του χώρου εργασίας και μιας συνάρτησης.

2.6.3 Η Συνάρτηση feval Υπάρχουν πολλοί αριθμητικοί αλγόριθμοι για τους οποίους ο χρήστης πρέ-πει να δημιουργήσει μια ρουτίνα για την εκτίμηση συνάρτησης για ένα συ-γκεκριμένο πρόβλημα. Για παράδειγμα, για τον υπολογισμό της αριθμητι-κής στρογγυλοποίησης της

b

adxxfI ,

Page 121: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 315

η συνάρτηση f(x) πρέπει να εκτιμηθεί σε τυχαία σημεία με πεδίο ορισμού . Μια γενική ρουτίνα για αριθμητικές στρογγυλοποιήσεις πρέπει να εί-

ναι ικανή να δουλεύει για κάθε f(x). Αυτό θέτει ένα πρόβλημα, γιατί το όρισμα εισόδου στην διαδικασία υπολογισμού δεν είναι μια τιμή – ας πούμε, η τιμή που είναι αποθηκευμένη στην x – αλλά αντίθετα, είναι το όνομα της ρουτίνας (όνομα του m-file) το οποίο εκτιμά την f(x) για κάθε τιμή του x. Στο MATLAB, η λύση σε αυτό το προγραμματιστικό πρόβλημα είναι η συνάρτηση feval.

bxa

Η σύνταξη της συνάρτησης feval είναι feval(fun, p1, p2, … ) Η πρώτη παράμετροs, fun, είναι ένα αλφαριθμητικό που δίνει το όνομα της συ-νάρτησης που είναι να κληθεί. Οι άλλες παράμετροι, p1, p2, …, περνιούνται στη συνάρτηση στην οποία αναφέρονται μέσω της fun. Για παράδειγμα, οι ακό-λουθες δύο εντολές, είναι ισοδύναμες: >> feval('sin',pi/2); ans = 1 >> sin(pi/2); ans = 1 Φυσικά, δεν είναι απαραίτητο να χρησιμοποιούμε την συνάρτηση feval για τον υπολογισμό του συνημιτόνου μιας γωνίας. Το προηγούμενο παράδειγμα απλώς δείχνει ότι υπάρχει μια ισοδυναμία ανάμεσα στον άμεσο υπολογισμό της συνάρ-τησης και την έμμεση εκτίμησή της μέσω της feval. Στην πράξη, η συνάρτηση feval χρησιμοποιείται μόνον όταν το όνομα του m-file πρέπει να περαστεί ως παράμετρος εισόδου σε κάποιο άλλο m-file. Παράδειγμα 2.13: Μέσος Όρος των Τιμών μιας Συνάρτησης Ας υποθέσουμε ότι πρέπει να υπολογίσουμε το άθροισμα διακριτών τιμών μιας τυχαίας συνάρτησης σε n ισαπέχοντα σημεία σε ένα διάστημα bxa . Έστω s το άθροισμα

n

iixfs

1

,

όπου

Page 122: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 316

,1 hiaxi 1

n

abh .

Θα ήταν εύκολο να γράψουμε τον κώδικα για να φέρει εις πέρας αυτό το έργο για μια συγκεκριμένη συνάρτηση, ας πούμε, την sin(x). Τότε θα μπορούσαμε να γρά-ψουμε μια εντελώς διαφορετική συνάρτηση για τον υπολογισμό του αθροίσματος της cos(x). Η συνάρτηση feval επιτρέπει μια πιο γενική λύση, όπως αυτή υλο-ποιείται από τη συνάρτηση fsum στην Λίστα 2.11. Το πρώτο όρισμα εισόδου της fsum είναι το όνομα της συνάρτησης, που πρέπει να είναι αλφαριθμητικό. Για παράδειγμα, για να χρησιμοποιήσουμε την fsum στον υπολογισμό του αθροίσμα-τος των συναρτήσεων sin και cos σε πέντε σημεία στο διάστημα 0 , εισά-γουμε τις ακόλουθες εντολές: >> fsum('sin',0,pi,5) ans = 2.4142 >> fsum('cos',0,pi,5) ans = 0 function s = fsum(fun,a,b,n) % fsum Υπολογίζει το άθροισμα των τιμών της f(x) σε n σημεία του a<=x<=b % % Σύνοψη: s = fsum(fun,ab,n) % % Είσοδος: fun = (αλφαριθμητικό) όνομα της f(x), που θα εκτιμηθεί % a,b = τα άκρα του διαστήματος % n = το πλήθος των σημείων στο διάστημα % % Έξοδος: s = άθροισμα της f(x) σε n διακριτά σημεία του διαστήματος x = linspace(a,b,n); % δημιουργεί τα σημεία στο διάστημα y = feval(fun,x); % εκτιμά την συνάρτηση στα σημεία s = sum(y); % υπολογίζει το άθροισμα

Λίστα 2.11 Η συνάρτηση fsum για τον υπολογισμό του αθροίσματος οποιασδή-

ποτε συνάρτησης σε διάστημα ορισμένο από τον χρήστη. Το πρώτο όρισμα στις εντολές της fsum πρέπει να περικλείεται σε μονά εισαγω-γικά, έτσι ώστε η fsum να το μετατρέπει σε αλφαριθμητικό. Η συνάρτηση fsum μπορεί να χρησιμοποιηθεί σε οποιεσδήποτε συναρτήσεις. Για τον λόγο αυτό, η συνάρτηση πρέπει να είναι ενσωματωμένη σε ένα m-file, το οποίο μπορεί να δε-χθεί ένα διάνυσμα ως είσοδο και επιστρέφει ένα διάνυσμα τιμών συνάρτησης. Για παράδειγμα, η συνάρτηση sincos στην Λίστα 2.12 υπολογίζει το γινόμενο

Page 123: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 317

sin(x)cos(x). Εφόσον δημιουργηθεί το αρχείο sincos.m και τοποθετηθεί στο μονοπάτι του MATLAB, η εντολή >> fsum('sincos',0,pi,15) ans = 3.3307e-16 υπολογίζει το άθροισμα των τιμών sin(x)cos(x) σε 15 σημεία στο 0 x . function y = sincos(x) % sincos υπολογίζει το sin(x)*cos(x) για οποιοδήποτε x % % Σύνοψη: y = sincos(x) % % Είσοδος: x = γωνία σε ακτίνια, ή διάνυσμα γωνιών σε ακτίνια % % Έξοδος: y = τιμή του sin(x)*cos(x) για κάθε στοιχείο του x y = sin(x).*cos(x);

Λίστα 2.12 Η συνάρτηση sincos που χρησιμοποιήθηκε στην παρουσίαση της

συνάρτησης fsum στην Λίστα 2.11.

2.6.4 Inline Αντικείμενα Συναρτήσεων Στην έκδοση 5 του MATLAB προστέθηκε υποστήριξη για αντικειμενοστραφή προγραμματισμό. Ο αντικειμενοστραφής προγραμματισμός χρησιμοποιεί μια με-γάλη ποικιλία τεχνικών για τη συσχέτιση συμπεριφορών (ενεργειών) με αντικείμε-να, που είναι μια αφαιρετική επέκταση των μεταβλητών που χρησιμοποιούμε για την αποθήκευση αριθμών. Είναι δυνατό να δημιουργηθούν αντικείμενα για την αποθήκευση πολλών τύπων οντοτήτων: αριθμών, αλφαριθμητικών, πινάκων, συ-ναρτήσεων, άλλων αντικειμένων και συνδυασμών αυτών των οντοτήτων. Για κάθε αντικείμενο, ο προγραμματιστής καθορίζει ένα σύνολο από μεθόδους, που είναι επεκτάσεις των συναρτήσεων που χρησιμοποιήσαμε για την διαχείριση μεταβλη-τών. Ο αντικειμενοστραφής προγραμματισμός είναι ένα ισχυρό παράδειγμα για την οργάνωση υπολογιστικών έργων. Βέβαια, μπορεί να είναι πιο περίπλοκος και απαιτεί ένα υψηλότερο επίπεδο ικανοτήτων για την επιτυχή χρήση του. Για τα βα-σικά θέματα αριθμητικής ανάλυσης, δεν χρειάζεται να χρησιμοποιήσουμε αντικει-μενοστραφή προγραμματισμό, αν και για την ανάπτυξη σύνθετων προγραμμάτων μπορεί να είναι χρήσιμος.

Page 124: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 318

Ένα χαρακτηριστικό του αντικειμενοστραφούς προγραμματισμού, το οποίο είναι χρήσιμο για αριθμητικά θέματα είναι το inline αντικείμενο συνάρτησης. Οι inline συναρτήσεις είναι εύκολες στον ορισμό και τη χρήση και περιορίζουν την ανάγκη για δημιουργία function m-files που χρησιμοποιούνται για τον υπολογισμό απλών τύπων. Ένα inline αντικείμενο συνάρτησης είναι ένα αντικείμενο το οποίο κρατάει μια παράσταση του MATLAB, η οποία είναι να υπολογισθεί. Συνήθως η παράστα-ση περιέχει μία ή περισσότερες μεταβλητές που ενεργούν όπως οι παράμετροι ει-σόδου σε ένα function m-file. Θεωρείστε την ακόλουθη συνεδρία του MATLAB: >> scfun = inline('sin(x).*cos(x)') scfun = Inline function: scfun(x) = sin(x).*cos(x) Η εντολή scfun = inline('sin(x).*cos(x)') δημιουργεί ένα inline αντικείμενο συνάρτησης με το όνομα scfun. Η άμεση ανταπόκριση στην εντολή αυτή είναι Inline function: scfun(x) = sin(x).*cos(x) που δείχνει ότι το MATLAB έχει θεωρήσει την x σαν μεταβλητή εισόδου για το αντικείμενο συνάρτησης scfun. Οι μεταβλητές στα inline αντικείμενα συνάρτη-σης ορίζονται αυτόματα από τον parser του MATLAB. Βλ.το help inline για περισσότερες πληροφορίες όσον αφορά τον τρόπο με τον οποίο ανιχνεύονται αυ-τές οι μεταβλητές. Από την στιγμή που οριστεί η scfun, μπορεί να χρησιμοποιηθεί όπως οποιοδή-ποτε άλλο function m-file. Με άλλα λόγια, η inline συνάρτηση scfun μπορεί να χρησιμοποιηθεί αντί της συνάρτησης sincos στη Λίστα 2.14: >> scfun(5)-sin(5)*cos(5) ans = 0 >> scfun(0:pi/4:pi) ans = 0 0.5000 0 -0.5000 0 Οι inline συναρτήσεις αντικείμενα διαφέρουν από τα function m-files σημαντικά. Ένα inline αντικείμενο συνάρτησης δημιουργείται στον χώρο εργασίας του MATLAB και υφίσταται μόνο στην τρέχουσα συνεδρία:

Page 125: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα 319

>> whos Name Size Bytes Class Ans 1x5 40 double array scfun 1x1 844 inline object Grand total is 52 elements using 884 bytes Όταν ένα inline αντικείμενο συνάρτησης ανατεθεί σε μια μεταβλητή του MATLAB, μπορεί να περαστεί ως παράμετρος σε μια άλλη συνάρτηση. Για παρά-δειγμα, >> fsum(scfun,0,pi,15) ans = 3.3307e-16 περνάει το αντικείμενο scfun στην συνάρτηση fsum που περιγράφηκε στο Πα-ράδειγμα 2.14. Σημειώστε ότι δεν υπάρχουν μονά εισαγωγικά να περικλείουν την scfun, σε αντίθεση με την εντολή >> fsum('sincos',0,pi,15) ans = 3.3307e-16 η οποία παράγει το ίδιο αριθμητικό αποτέλεσμα. Τα inline αντικείμενα συνάρτησης μπορούν να δημιουργηθούν μέσα σε function m-file. Η Λίστα 2.13 δείχνει πως επιτυγχάνεται αυτό. function s = demoXcosx(n) % demoXcosx χρησιμοποιεί ένα inline αντικείμενο με την fsum % Σύνοψη: s = demoXcosx % Είσοδος: n = πλήθος σημείων στα οποία υπολογίζεται η x*cos(x),0<=χ<=2pi % Έξοδος: s = άθροισμα των τιμών της x*cos(x) στα n σημεία xcosx = inline('x.*cos(x)'); s = fsum(xcosx,0,3*pi,n);

Λίστα 2.13 Η demoXcosx δείχνει πως ένα inline αντικείμενο συνάρτησης μπο-ρεί να οριστεί και να χρησιμοποιηθεί μέσα σε ένα function m-file.

Page 126: Για μια Εισαγωγή στο MATLABusers.uom.gr/~zvasil/matlab steph.pdf · Ο πίνακας 2.1 περιλαμβάνει τις ενσωματωμένες μεταβλητές

Παράρτημα

320

2.7 Περίληψη Το κεφάλαιο αυτό ασχολείται με την δημιουργία μονάδων (modules) προγράμμα-τος στο MATLAB. Συζητούνται τα script m-files, όπως και τα function m-files. Επειδή οι συναρτήσεις είναι πιο χρήσιμες για τον δομημένο προγραμματισμό, τα function m-files συνιστώνται σε σχέση με τα script m-files, σχεδόν για κάθε προ-γραμματιστικό έργο. Ένας βασικός σκοπός του κεφαλαίου αυτού είναι να περιγράψει και να παρουσιά-σει τις δομές ελέγχου της γλώσσας του MATLAB. Παρέχονται παραδείγματα σε τμήματα κώδικα και m-αρχεία. Tα m-files που χρησιμοποιήθηκαν δεν είναι ρουτί-νες γενικές που ενσωματώνονται σε άλλα προγραμματιστικά έργα. Σχεδιάστηκαν για την παρουσίαση συγκεκριμένων προγραμματιστικών τεχνικών. Περαιτέρω Μελέτη Η πρωταρχική πηγή τεκμηρίωσης για προγραμματισμό στο MATLAB είναι τα εγ-χειρίδια για την τρέχουσα έκδοση του προγράμματος. Η on-line βοήθεια μέσω των εντολών help και helpwin παρέχει συνοπτικές περιγραφές για κάθε συ-νάρτηση. Σε κάθε έκδοση του MATLAB υπάρχουν τυπωμένα εγχειρίδια, καθώς και σε ηλεκτρονική PDF μορφή για περισσότερο περιεκτικές αναφορές. Υπάρχει βέβαια και μια πληθώρα βιβλίων γραμμένων ειδικά για την εκμάθηση του MAT-LAB, μερικά των οποίων είναι: [1] D. Hanselman and B. Littlefield. Mastering MATLAB 5: A Comprehensive Tu-

torial and Reference. Prentice Hall, Upper Saddle River, NJ, 1998.

[2] B. D. Hahn. Essential MATLAB for Scientists and Engineers. John Wiley & Sons, 1997.

[3] D. J. Higham and N. J. Higham. MATLAB Guide. SIAM, Philadelphia, 2002.

[4] P. Marchand. Graphics and GUIs with MATLAB. CRC Press, Bosa Raton, FL, 2d edition, 1999.

[5] R. Pratap. Getting Started with MATLAB. Harcourt Brace & Company, 1996.

[6] K. Sigmon. MATLAB primer. 5th edition. CRC Press, Inc. 1998.

[7] The Student Edition of MATLAB. Prentice Hall, 1997.