ΑΛΓΟΡΙΘΜΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΣΕ ΠΕΡΙΒΑΛΛΟΝ MATLAB



Σχετικά έγγραφα
ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ ΣΕ ΠΕΡΙΒΑΛΛΟΝ MATLAB

ΚΕΦΑΛΑΙΟ 1 Ψηφιακός Κόσμος

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 8 & 9 11/10/07

Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Βασικές Έννοιες Προγραμματισμού. Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD

Πανεπιστήμιο Δυτικής Μακεδονίας. Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών. Ηλεκτρονική Υγεία. Εργαστήριο 4 ο : MATLAB

Υπολογιστές Ι. Άδειες Χρήσης. Εισαγωγή. Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

Β1.1 Αναπαράσταση Δεδομένων και Χωρητικότητα Μονάδων Αποθήκευσης

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΜΑΡΙΑ Σ. ΖΙΩΓΑ ΚΑΘΗΓΗΤΡΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

ΠΛΗΡΟΦΟΡΙΚΗ Ι Εργαστήριο 1 MATLAB ΠΛΗΡΟΦΟΡΙΚΗ Ι ΕΡΓΑΣΤΗΡΙΟ 1. Θέμα εργαστηρίου: Εισαγωγή στο MATLAB και στο Octave

ΕΙΣΑΓΩΓΗ ΣΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ Microsoft WINDOWS (95-98-NT-2000-XP)

Κεφάλαιο 4: Λογισμικό Συστήματος

ΥΠΟΛΟΓΙΣΤΕΣ Ι. Τα επιμέρους τμήματα Η ΟΜΗ TOY ΥΠΟΛΟΓΙΣΤΗ. Αναπαράσταση μεγεθών. Αναλογική αναπαράσταση ΚΕΝΤΡΙΚΗ ΜΝΗΜΗ ΜΟΝΑ Α ΕΛΕΓΧΟΥ

Δημιουργία και εκτέλεση προγραμμάτων. Εντολές εισόδου από το πληκτρολόγιο και εξόδου στην οθόνη.

Περιεχόμενα. Λίγα λόγια από το συγγραφέα... 7 Κεφάλαιο 1: Windows XP Κεφάλαιο 2: Επιφάνεια εργασίας (desktop)... 15

ΗΛΕΚΤΡΟΝΙΚΟΙ ΥΠΟΛΟΓΙΣΤΕΣ

Τετάρτη 5-12/11/2014. ΣΗΜΕΙΩΣΕΙΣ 3 ου και 4 ου ΜΑΘΗΜΑΤΟΣ ΕΙΔΙΚΟΤΗΤΑ: ΤΕΧΝΙΚΟΣ ΕΦΑΡΜΟΓΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΜΑΘΗΜΑ: ΑΡΧΙΤΕΚΤΟΝΙΚΗ Η/Υ Α ΕΞΑΜΗΝΟ

Κεφάλαιο 2.3: Προγραμματισμός. Επιστήμη ΗΥ Κεφ. 2.3 Καραμαούνας Πολύκαρπος

Λειτουργικά Συστήματα Κεφάλαιο 2 Οργάνωση Συστήματος Αρχείων 2.1 Διαχείριση Αρχείων και Σύστημα Αρχείων(File System)

ΑΕΠΠ Ερωτήσεις θεωρίας

Εισαγωγή στον Προγραμματισμό

ΗΜΥ 100 Εισαγωγή στην Τεχνολογία ιάλεξη 5

ΣΗΜΕΙΩΣΕΙΣ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

Μαλούτα Θεανώ Σελίδα 1

Προγραμματισμός Ι (HY120)

Μαλούτα Θεανώ Σελίδα 1

Λειτουργικά Συστήματα (Λ/Σ)

Κεφάλαιο 1.6: Συσκευές αποθήκευσης

Εισαγωγή στην Πληροφορική ΓΕΝΙΚΟ ΤΜΗΜΑ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ TEI ΧΑΛΚΙ ΑΣ

Ε Ι Α Γ Ω Γ Η Σ Ο Ν Π Ρ Ο Γ Ρ Α Μ Μ Α Σ Ι Μ Ο Κ Ε Υ Α Λ Α Ι Ο 6. Σο πρόγραμμα γράφεται σε κάποια γλώσσα προγραμματισμού.

Εισαγωγή στην Αριθμητική Ανάλυση

Κεφάλαιο 2.4: Εργασία με εικονίδια

Τυπικές χρήσεις της Matlab

ΠΡΟΒΛΗΜΑ ΕΠΕΓΕΡΓΑΣΙΑ. (Είναι οι σκέψεις και οι πράξεις που κάνουμε για να λυθεί το πρόβλημα) ΕΙΣΟΔΟΥ - ΕΞΟΔΟΥ

ΕΡΩΤΗΣΕΙΣ ΑΞΙΟΛΟΓΗΣΗΣ

Βασική δοµή και Λειτουργία Υπολογιστή

Λειτουργικά Συστήματα Ι - Εργαστήριο

ΕΙΔΗ,ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙ- ΣΜΟΥ

Εργαστήριο του Μαθήματος: ΕΠΛ 001: Εισαγωγή στην Επιστήμη της Πληροφορικής

Κεφ. 2 Θέματα Θεωρητικής Επιστήμης Υπολογιστών. Κοντογιάννης Βασίλειος ΠΕ19

Στοιχεία από την αρχιτεκτονική των μικροϋπολογιστών

ΚΕΦΑΛΑΙΟ 6 - ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

ΚΕΦΑΛΑΙΟ 6 ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. 03/01/09 Χαράλαμπος Τζόκας 1

Μάθημα 2: Παράσταση της Πληροφορίας

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ, ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 001: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 003: ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΠΛΗΡΟΦΟΡΙΑΚΑ ΣΥΣΤΗΜΑΤΑ

Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον κεφ.6 Εισαγωγή στον Προγραμματισμό

Παραδείγματα Δεδομένων: Οι τιμές στο κυλικείο, μια λίστα από ονόματα, τα σήματα της τροχαίας.

Αναπαράσταση Δεδομένων. ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική

Γενικά Στοιχεία Ηλεκτρονικού Υπολογιστή

Αναπαράσταση Μη Αριθμητικών Δεδομένων

! Δεδομένα: ανεξάρτητα από τύπο και προέλευση, στον υπολογιστή υπάρχουν σε μία μορφή: 0 και 1

Εισαγωγή στην επιστήμη των υπολογιστών. Υπολογιστές και Δεδομένα Κεφάλαιο 2ο Αναπαράσταση Δεδομένων

MULTIPLE CHOICE REVISION: ΜΑΘΗΜΑ 1-2

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ. Στέφανος Ουγιάρογλου

ΠΛΗΡΟΦΟΡΙΚΉ. Μάθημα 7

ΣΥΣΚΕΥΕΣ ΑΠΟΘΗΚΕΥΣΗΣ (ΜΝΗΜΗ)

ΕΦΑΡΜΟΓΕΣ ΠΛΗΡΟΦΟΡΙΚΗΣ Α ΤΑΞΗ

Σημειώσεις : Χρήστος Μουρατίδης. Κάντε κλικ για έναρξη

Βασικές Έννοιες της Πληροφορικής

Περιεχόµενα. I Βασικές Γνώσεις 1

ΕΠΛ 003: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ. Αναπαράσταση δεδομένων

[2] Υπολογιστικά συστήματα: Στρώματα. Τύποι δεδομένων. Μπιτ. επικοινωνία εφαρμογές λειτουργικό σύστημα προγράμματα υλικό

ΕΠΛ 001: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ. Επανάληψη

ΚΑΤΑΝΟΗΣΗ ΑΝΑΛΥΣΗ ΕΠΙΛΥΣΗ. Ο προγραμματισμός ασχολείται με το σύνολο των εντολών που δίνονται στον υπολογιστή ώστε να υλοποιείται ο αλγόριθμος.

ΠΕΡΙΕΧΟΜΕΝΑ 1 ΚΕΦΑΛΑΙΟ ΟΙ ΥΠΟΛΟΓΙΣΤΕΣ ΑΠΟ ΤΗΝ ΑΡΧΑΙΟΤΗΤΑ ΜΕΧΡΙ ΣΗΜΕΡΑ Ιστορική αναδρομή Υπολογιστικές μηχανές

Μάθημα 3: Αρχιτεκτονική Υπολογιστών

1 ο ΕΡΓΑΣΤΗΡΙΟ ΣΗΜΑΤΑ & ΣΥΣΤΗΜΑΤΑ

ΘΕΜΑ : ΣΥΣΤΗΜΑΤΑ ΑΡΙΘΜΗΣΗΣ. ΔΙΑΡΚΕΙΑ: 1 περιόδους. 22/1/ :11 Όνομα: Λεκάκης Κωνσταντίνος καθ. Τεχνολογίας

Χρονικές σειρές 1 ο μάθημα: Εισαγωγή στη MATLAB

10. Με πόσους και ποιους τρόπους μπορεί να αναπαρασταθεί ένα πρόβλημα; 11. Περιγράψτε τα τρία στάδια αντιμετώπισης ενός προβλήματος.

Πληροφορική 2. Γλώσσες Προγραμματισμού

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

Δεδομένα & Αναπαράσταση Πληροφορίας

Μόνιμη Αποθήκευση Δεδομένων στον Η/Υ

ΚΕΦΑΛΑΙΟ 1 Βασικές Έννοιες της Πληροφορικής

Υπάρχουν δύο τύποι μνήμης, η μνήμη τυχαίας προσπέλασης (Random Access Memory RAM) και η μνήμη ανάγνωσης-μόνο (Read-Only Memory ROM).

Λιβανός Γιώργος Εξάμηνο 2017Β

ΕΠΛ 003: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ. Επανάληψη

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ (TP-105)

ΠΕΡΙΕΧΟΜΕΝΑ ΜΕΡΟΣ Α : ΘΕΜΑΤΑ ΒΑΣΗΣ 1. ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ ΑΡΙΘΜΗΤΙΚΑ ΣΥΣΤΗΜΑΤΑ...30

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Προγραμματισμός Η/Υ. Χειρισμός Αρχείων. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

1 η Εργαστηριακή Άσκηση MATLAB Εισαγωγή

4 η γενιά ( δεκαετία 70 έως σήμερα) Δομικό Στοιχείο : Ολοκληρωμένο κύκλωμα ή τσιπ μεγάλης κλίμακας ολοκλήρωσης.

Σχεδιάζοντας Εφαρμογές για το Διαδίκτυο

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

ΗΜΥ 100 Εισαγωγή στην Τεχνολογία ιάλεξη 9

Εισαγωγή στο περιβάλλον Code::Blocks

0 κ. Αντης Χατζηβασιλείου, Διευθυντής της Εταιρείας DATACOM παραδίδει στον κ. Σάββα Πετρίδη ένα Η.Υ. δώρο στην ΚΕΕΒ για τις μηχανογραφικές ανάγκες

7.Α.1 Παρουσιάσεις. 7.Α.2 Περιγραφή περιεχομένων της εφαρμογής

ΦΥΛΛΟ ΕΡΓΑΣΙΑΣ B.2.M3 Κύρια και Βοηθητική Μνήμη

Κεφάλαιο 7 ο Βασικές Έννοιες Προγραμματισμού (σελ )

ΗΜΥ 100 Εισαγωγή στην Τεχνολογία Διάλεξη 9

Το «κλειστό» σύστημα. Ανοικτές επικοινωνίες... Εισαγωγή στην Τεχνολογία της Πληροφορικής. Εισαγωγή στην τεχνολογία της πληροφορικής

Να αποθηκεύουμε και να ξανανοίγουμε αρχεία σε περιβάλλον Windows. Να ξεχωρίζουμε τα συστατικά (αρχεία, φακέλους κλπ.) ενός δίσκου

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Λειτουργικά Συστήματα Ι. Καθηγήτρια Παπαδάκη Αναστασία

Περιεχόμενα. Μέρος 1: Βασικές έννοιες Πληροφορικής και επικοινωνιών Μέρος 2: Χρήση υπολογιστή και διαχείριση αρχείων Πρόλογος...

ΦΥΛΛΟ ΠΛΗΡΟΦΟΡΙΩΝ. Μονάδες μέτρησης χωρητικότητας μνήμης - Η περιφερειακή μνήμη

Εισαγωγή στην Πληροφορική

Transcript:

Γιάννης Καλατζής ΑΛΓΟΡΙΘΜΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΣΕ ΠΕΡΙΒΑΛΛΟΝ MATLAB ` ΘΕΩΡΙΑ 2014

Το εγχειρίδιο αυτό περιέχει τις βασικές αρχές προγραμματισμού των ηλεκτρονικών υπολογιστών, χωρίς καμία προαπαιτούμενη γνώση, για χρήση κυρίως από προπτυχιακούς φοιτητές τμημάτων μηχανικών και θετικών επιστημών. Ως γλώσσα προγραμματισμού επιλέχθηκε αυτή του περιβάλλοντος MATLAB της εταιρείας MathWorks. Παρόλ αυτά, ο κύριος στόχος δεν είναι η εκμάθηση του MATLAB, αλλά του γενικού αλγοριθμικού προγραμματισμού. Για το λόγο αυτό παραλείπονται αρχικά πολλές από τις εξαιρετικά χρήσιμες και ιδιαίτερες δυνατότητες του MATLAB (οι οποίες όμως αναφέρονται στη συνέχεια σε ιδιαίτερες παραγράφους). Με τον τρόπο αυτό δίνεται έμφαση στην ανάπτυξη απλού κώδικα, ώστε οι φοιτητές να διδαχτούν τις γενικές αρχές του αλγοριθμικού προγραμματισμού, και να μπορούν εύκολα αν επιθυμούν να προχωρήσουν στην εκμάθηση κλασσικότερων γλωσσών προγραμματισμού, όπως η C (γενικότερα) ή η Fortran (ειδικότερα), με τις οποίες εξάλλου το MATLAB μοιράζεται πολλά κοινά στοιχεία. Στο τέλος κάθε κεφαλαίου υπάρχει σειρά ερωτήσεων θεωρίας και ασκήσεων ανάπτυξης κώδικα. Οι ερωτήσεις και οι ασκήσεις περιορίζονται στα θέματα των απλών προγραμματιστικών διαδικασιών που αναφέρθηκαν προηγουμένως με σκοπό τη χρήση τους στα πλαίσια σειράς μαθημάτων εκμάθησης των εννοιών του κλασσικού προγραμματισμού, και όχι στις ιδιαίτερες δυνατότητες του MATLAB, οι οποίες αναπτύσσονται στη συνέχεια σε άλλα κεφάλαια ώστε όποιος επιθυμεί να μπορεί να εμβαθύνει και σε αυτές, αφού όμως εξοικειωθεί με τον βασικό τρόπο ανάπτυξης κώδικα. Η επιλογή του MATLAB ως εργαλείου εκμάθησης προγραμματισμού Η/Υ έγινε λόγω της ευκολίας στη σύνταξη της γλώσσας προγραμματισμού του καθώς και του σύγχρονου γραφικού του περιβάλλοντος, δυο στοιχεία που ελκύουν και δεν αποθαρρύνουν τον αρχάριο. Ταυτόχρονα, δίνεται η δυνατότητα στους φοιτητές να εξοικειωθούν με ένα πολύ δυνατό περιβάλλον ανάπτυξης προγραμμάτων και εφαρμογών, που αποτελεί σημαντική γνώση τόσο για αρκετά από τα υπόλοιπα μαθήματά τους κατά τη διάρκεια των σπουδών τους, όσο και κατά την σταδιοδρομία τους ως μηχανικών και επιστημόνων, ενώ τέλος αποτελεί ισχυρότατο εργαλείο στην περίπτωση που επιλέξουν να ασχοληθούν με την ακαδημαϊκή έρευνα. Γ. Κ.

ΠΕΡΙΕΧΟΜΕΝΑ 1 Γενικά περί Ηλεκτρονικών Υπολογιστών... 7 1.1 Ο ηλεκτρονικός υπολογιστής... 7 1.2 Φυσική δομή Η/Υ: Υλικό (hardware)... 7 1.3 Λειτουργία Η/Υ: Λογισμικό (software)... 8 1.4 Δυαδικό σύστημα... 9 1.5 Κωδικοποίηση χαρακτήρων σε αριθμούς: ASCII και Unicode... 11 1.6 Οργάνωση αρχείων... 12 Ερωτήσεις... 15 Ασκήσεις... 15 2 Αλγόριθμοι και Προγραμματισμός... 16 2.1 Αλγόριθμοι... 16 2.2 Γλώσσες προγραμματισμού... 17 2.3 Δημιουργία ενός προγράμματος... 17 Ερωτήσεις... 18 Ασκήσεις... 18 3 Το περιβάλλον και ο τρόπος λειτουργίας του MATLAB... 19 3.1 Το περιβάλλον του MATLAB... 19 3.2 Ο τρόπος λειτουργίας του MATLAB... 21 3.3 Χρήσιμες συντομεύσεις πληκτρολογίου... 23 3.4 Συνοπτική παρουσίαση εντολών γενικής χρήσης του MATLAB: general... 23 Ερωτήσεις... 24 4 Βασικά στοιχεία προγραμματισμού... 25 4.1 Στοιχεία του κώδικα ενός προγράμματος... 25 4.2 Μεταβλητές... 26 4.3 Τελεστές και Πράξεις... 28 4.4 Συνοπτική παρουσίαση τελεστών και ειδικών χαρακτήρων του MATLAB: ops... 29 Ερωτήσεις... 30 Ασκήσεις... 30 5 Βασικές εντολές... 33 5.1 Γενικά... 33 5.2 Εντολή ανάθεσης... 34 5.3 Εντολές μορφοποίησης του Command Window... 35 5.4 Εντολές μεταβλητών... 36 5.5 Εντολές εισόδου δεδομένων από τo πληκτρολόγιο... 37 5.6 Εντολές εξόδου αποτελεσμάτων στην οθόνη (στο Command Window)... 38 Ερωτήσεις... 40 Ασκήσεις... 40 6 Εντολές διακλάδωσης της ροής του προγράμματος... 42 6.1 Εντολή επιλογής IF... 42 6.2 Εντολή επιλογής SWITCH... 44 6.3 Συνοπτική παρουσίαση εντολών προγραμματισμού του MATLAB: lang... 44 Ερωτήσεις... 45 Ασκήσεις... 45 7 Επαναληπτικοί βρόχοι... 47

7.1 Εντολή επανάληψης FOR... 47 7.2 Εντολή επανάληψης WHILE... 48 7.3 Εντολή διακοπής επαναληπτικού βρόχου: BREAK... 49 7.4 Εντολή μετάβασης στην επόμενη επανάληψη βρόχου: CONTINUE... 49 7.5 Συνοπτική παρουσίαση εντολών προγραμματισμού του MATLAB: lang... 49 7.6 Μεταβλητές συγκεκριμένης χρήσης... 50 7.7 Βασικά παραδείγματα εφαρμογής εντολών επιλογής και επανάληψης... 52 Ερωτήσεις... 55 Ασκήσεις... 55 8 Πίνακες... 57 8.1 Γενικά για τους πίνακες... 57 8.2 Μονοδιάστατοι πίνακες... 58 8.3 Δισδιάστατοι πίνακες... 59 8.4 Συναρτήσεις πινάκων... 61 8.5 Σύγκριση ισότητας πινάκων... 63 8.6 Συνοπτική παρουσίαση απλών εντολών χειρισμού πινάκων του MATLAB: elmat... 63 Ερωτήσεις... 64 Ασκήσεις... 64 9 Ιδιαίτερος χειρισμός των πινάκων στο MATLAB... 66 9.1 Τελεστής «'»... 66 9.2 Τελεστής «:»... 66 9.3 Αναφορά στα στοιχεία πίνακα με μοναδικό δείκτη... 67 9.4 Χρήση του ως τελικού δείκτη... 67 9.5 Δημιουργία πινάκων με χρήση άλλων πινάκων... 67 9.6 Εύρεση στοιχείων πίνακα υπό συνθήκες. Συνάρτηση find... 68 9.7 Σύγκριση πινάκων και των στοιχείων τους... 69 9.8 Συναρτήσεις ταξινόμησης πίνακα... 70 9.9 Συναρτήσεις και τελεστές χειρισμού πινάκων... 71 9.10 Αλγεβρικές πράξεις πινάκων... 73 9.11 Στοιχείο-προς-στοιχείο πολλαπλασιαστικές πράξεις πινάκων στο MATLAB... 74 9.12 Δημιουργία ειδικών πινάκων... 75 9.13 Συναρτήσεις εύρεσης συγκεντρωτικών μεγεθών από τα στοιχεία ενός πίνακα... 76 9.14 Αραιοί (sparse) πίνακες... 77 9.15 Συνοπτική παρουσίαση εντολών και συναρτήσεων πινάκων και διαδικασιών γραμμικής άλγεβρας με το σύστημα βοηθείας του MATLAB: elmat και matfun... 79 10 Συμβολοσειρές... 80 10.1 Ανάθεση τιμών συμβολοσειράς... 80 10.2 Συναρτήσεις συμβολοσειρών... 80 10.3 Συνοπτική παρουσίαση συναρτήσεων συμβολοσειρών του MATLAB: strfun... 82 Ερωτήσεις... 82 Ασκήσεις... 83 11 Συναρτήσεις... 85 11.1 Γενικά: functions και scripts στο MATLAB... 85 11.2 Τοπικές μεταβλητές... 86 11.3 Δημιουργία συνάρτησης... 86 11.4 Κλήση συνάρτησης... 87 11.5 Έξοδος από συνάρτηση (εντολή return)... 87 11.6 Υποσυναρτήσεις... 87 11.7 Σειρά αναζήτησης μιας συνάρτησης από το MATLAB... 87 11.8 Δομή ενός αρχείου συνάρτησης... 88

11.9 Εμφωλευμένες συναρτήσεις (nested functions)... 90 11.10 Ανώνυμες συναρτήσεις (anonymous functions)... 91 11.11 Ιδιωτικές συναρτήσεις (private functions)... 91 11.12 Μεταβλητό πλήθος ορισμάτων εισόδου ή εξόδου σε συναρτήσεις... 92 11.13 Εφαρμογή συνάρτησης σε πολλαπλές μεταβλητές: arrayfun, structfun, cellfun... 94 Ερωτήσεις... 95 Ασκήσεις... 95 12 Δομές... 97 12.1 Απλή δομή... 97 12.2 Πίνακας Δομών (Structure Array)... 98 12.3 Ιδιαίτερα είδη δομών του MATLAB: Πίνακες Κελιών (Cell Arrays)... 99 Ερωτήσεις... 101 Ασκήσεις... 102 13 Αρχεία... 103 13.1 Είδη αρχείων... 103 13.2 Άνοιγμα και κλείσιμο αρχείου... 103 13.3 Αρχεία κειμένου... 104 13.4 Δυαδικά αρχεία... 106 13.5 Έλεγχος του δείκτη θέσης σε αρχείο... 107 13.6 Παραδείγματα τρόπου εργασίας με αρχεία κειμένου... 108 13.7 Ιδιαίτερες συναρτήσεις του MATLAB για χειρισμό αρχείων... 110 13.8 Ιδιαίτερες συναρτήσεις του MATLAB για χειρισμό φακέλων... 111 Ερωτήσεις... 112 Ασκήσεις... 112 14 Γραφικά... 114 14.1 Γραφικές παραστάσεις... 114 14.2 Συναρτήσεις παραμετροποίησης γραφημάτων... 122 14.3 Εικόνες... 128 14.4 Λήψη συντεταγμένων σημείων γραφήματος... 131 14.5 Συνοπτική παρουσίαση συναρτήσεων γραφικών του MATLAB: graphics, graph2d, graph3d, specgraph... 132 15 Χρήσιμες συναρτήσεις του MATLAB... 133 15.1 Εντολές βοήθειας... 133 15.2 Αρχεία εντολών εκκίνησης και τερματισμού του MATLAB... 133 15.3 Συναρτήσεις διακοπής και επαναφοράς της ροής του προγράμματος... 133 15.4 Μαθηματικές συναρτήσεις... 134 15.5 Συναρτήσεις χρόνου... 136 15.6 Συναρτήσεις αρχείων... 137 16 Παράλληλη επεξεργασία σε CPUs... 141 16.1 Πλεονεκτήματα παράλληλης και κατανεμημένης επεξεργασίας... 141 16.2 matlabpool: Δημιουργία «κοινοπραξίας» για παράλληλη επεξεργασία σε CPUs... 141 16.3 parfor: Παράλληλο for... 142 16.4 spmd: Single Program Multiple Data... 143 17 Παράλληλη επεξεργασία στη GPU... 144 17.1 Απαιτήσεις... 144 17.2 Προϋποθέσεις... 144 17.3 Διαδικασία χρήσης GPU από το MATLAB... 144

17.4 Ένα απλό παράδειγμα... 145 17.5 Ένα τεστ χρόνου... 145 18 Βελτιστοποίηση κώδικα... 146 18.1 Έλεγχος χρόνου εκτέλεσης... 146 18.2 Εντολές tic - toc... 146 18.3 Profiler... 146 18.4 Προδέσμευση πίνακα στη μνήμη (preallocation)... 147 18.5 Σάρωση πίνακα κατά στήλες... 148 18.6 Διανυσματοποίηση (vectorization)... 149 18.7 Παράλληλη επεξεργασία... 151 18.8 Άλλες τεχνικές επιτάχυνσης χρόνου εκτέλεσης... 151 18.9 Βελτιστοποίηση μνήμης... 152 18.10 Σύστημα υποδείξεων σφαλμάτων και βελτίωσης κώδικα MATLAB... 155 19 Αποσφαλμάτωση... 156 19.1 Είδη σφαλμάτων... 156 19.2 Συντακτικά σφάλματα... 157 19.3 Εύρεση του σφάλματος: Διακοπή προγράμματος και απεικόνιση μεταβλητών... 159 19.4 Εύρεση του σφάλματος: Η λειτουργία αποσφαλμάτωσης του MATLAB... 159 19.5 Σύστημα υποδείξεων σφαλμάτων και βελτίωσης κώδικα MATLAB... 160 20 Δημιουργία και εκτέλεση αυτόνομης εφαρμογής... 161 20.1 Δημιουργία αυτόνομης εφαρμογής... 161 20.2 Εκτέλεση της αυτόνομης εφαρμογής... 161 20.3 Μετατροπή κώδικα MATLAB σε C/C++... 162 21 Από τη C στο MATLAB... 163 21.1 Γρήγορος οδηγός του MATLAB για προγραμματιστές γλώσσας C... 163 21.2 Διαφορές και αντιστοιχίες μεταξύ C και MATLAB... 164

1.1 Ο ηλεκτρονικός υπολογιστής 1 Γενικά περί Ηλεκτρονικών Υπολογιστών Ο ηλεκτρονικός υπολογιστής είναι μια διάταξη η οποία τροφοδοτείται με ηλεκτρικά σήματα, τα επεξεργάζεται, και εξάγει ως αποτέλεσμα τα επεξεργασμένα σήματα. Με άλλα λόγια, ο υπολογιστής μετασχηματίζει την πληροφορία ή το πληροφοριακό περιεχόμενο ενός σήματος (όπως, για παράδειγμα, μια μηχανή είναι μια διάταξη η οποία μετασχηματίζει την ενέργεια από μια μορφή σε άλλη). Πρόγραμμα ονομάζεται μια σειρά εντολών προς τον υπολογιστή (για την είσοδο των δεδομένων, για την επεξεργασία τους καθώς και για την έξοδο των αποτελεσμάτων), που προετοιμάζονται, ομαδοποιούνται και αποθηκεύονται στον υπολογιστή ώστε να εκτελεστούν όποτε επιθυμεί ο χρήστης του υπολογιστή. Είσοδος Επεξεργασία Έξοδος Καθολικός υπολογιστής: Οι επεξεργαστές των σύγχρονων ηλεκτρονικών υπολογιστών είναι εφοδιασμένοι με κατάλληλες ομάδες εντολών, ώστε να μπορούν θεωρητικά να επιλύσουν οποιοδήποτε αλγοριθμικό πρόβλημα, αρκεί να τροφοδοτηθούν με το κατάλληλο πρόγραμμα. Διατάξεις με αυτήν την ιδιότητα ονομάζονται καθολικοί υπολογιστές. Οι ηλεκτρονικοί υπολογιστές αποτελούνται από το υλικό (hardware) και το λογισμικό (software). Ως υλικό εννοούμε τα φυσικά μέρη από τα οποία αποτελείται ο υπολογιστής, ενώ ως λογισμικό εννοούμε το σύνολο των εντολών με τις οποίες λειτουργεί και επεξεργάζεται τις πληροφορίες. Στην πραγματικότητα το λογισμικό σε στοιχειώδες επίπεδο δεν είναι τίποτε άλλο παρά μεταβολές ηλεκτρικών σημάτων στο υλικό, δηλαδή στα ηλεκτρονικά κυκλώματα του επεξεργαστή και της μνήμης του υπολογιστή. 1.2 Φυσική δομή Η/Υ: Υλικό (hardware) Συσκευές εισόδου: Για εισαγωγή εντολών και δεδομένων (π.χ. πληκτρολόγιο, ποντίκι). Κεντρική μονάδα επεξεργασίας (Central Processing Unit, CPU): Για την επεξεργασία των δεδομένων, μέσω των εντολών του προγράμματος. Η επεξεργασία γίνεται από τον επεξεργαστή με τη βοήθεια της κύριας μνήμης (μνήμη RAM, Random Access Memory). Η μνήμη RAM είναι προσωρινή, δηλ. τα δεδομένα της χάνονται με διακοπή της τροφοδοσίας. Συσκευές εξόδου: Για την έξοδο των αποτελεσμάτων (π.χ. οθόνη, εκτυπωτής). Μόνιμα αποθηκευτικά μέσα: Για τη μόνιμη αποθήκευση των προγραμμάτων, των δεδομένων εισόδου και των αποτελεσμάτων εξόδου (π.χ. μαγνητικά μέσα: σκληρός δίσκος, δισκέτα, μνήμες τύπου flash, ψηφιακές ταινίες, ή οπτικά μέσα: CD, DVD, BLU RAY). Στους σύγχρονους προσωπικούς Η/Υ οι σκληροί δίσκοι χρησιμεύουν επίσης και για «εικονική» αύξηση της μνήμης RAM (παρόμοια δυνατότητα υπάρχει και στις μνήμες τύπου USB flash). Τα μόνιμα αποθηκευτικά μέσα χρησιμεύουν τόσο ως συσκευές εισόδου όσο και ως συσκευές εξόδου. Συσκευές εισόδου (πληκτρολόγιο, ποντίκι) Μονάδα επεξεργασίας (επεξεργαστής, κύρια μνήμη RAM) Μόνιμα αποθηκευτικά μέσα (σκληρός δίσκος) Συσκευές εξόδου (οθόνη, εκτυπωτής)

8 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 1.3 Λειτουργία Η/Υ: Λογισμικό (software) BIOS: Κατά την εκκίνηση του υπολογιστή τον έλεγχο αναλαμβάνει ένα μικρό κομμάτι βασικών εντολών που ελέγχουν την καλή λειτουργία των βασικών υποσυστημάτων εισόδου και εξόδου του υπολογιστή. Οι αρχικές αυτές βασικές εντολές αποτελούν το BIOS (Basic Input-Output System), το οποίο είναι αποθηκευμένο σε ένα τμήμα μιας μικρής μόνιμης μνήμης (μνήμη ROM, Read Only Memory). Λειτουργικό σύστημα: Στη συνέχεια τον έλεγχο αναλαμβάνει το λειτουργικό σύστημα, το βασικότερο κομμάτι του λογισμικού των σύγχρονων ηλεκτρονικών υπολογιστών. Ο ρόλος του λειτουργικού συστήματος είναι (α) να ελέγχει τη ροή των δεδομένων από και προς τις συσκευές εισόδου-εξόδου, τον επεξεργαστή, την κύρια μνήμη και τα μόνιμα αποθηκευτικά μέσα, (β) να φροντίζει για την ορθή επικοινωνία των υπόλοιπων προγραμμάτων με τον υπολογιστή, και (γ) να συντονίζει την επικοινωνία με άλλους υπολογιστές (δίκτυα υπολογιστών). Οι περισσότεροι προσωπικοί υπολογιστές χρησιμοποιούν σήμερα το λειτουργικό σύστημα Microsoft Windows. Ένα από τα παλαιότερα και ισχυρότερα λειτουργικά συστήματα είναι το Unix που, μαζί με την παραλλαγή του Linux, χρησιμοποιείται μέχρι και σήμερα, από προσωπικούς υπολογιστές για ακαδημαϊκή έρευνα μέχρι πολύ ισχυρούς υπολογιστές ιδιαίτερα απαιτητικών εφαρμογών. Προγράμματα εφαρμογών: Το ανώτερο τμήμα της λειτουργίας του υπολογιστή είναι τα προγράμματα εφαρμογών που απευθύνονται στον τελικό χρήστη του υπολογιστή. Ως παραδείγματα εφαρμογών μπορούν να αναφερθούν: Εφαρμογές γραφείου (που περιλαμβάνουν προγράμματα επεξεργασίας κειμένου, λογιστικών φύλλων και παρουσιάσεων). Προγράμματα προβολής και επεξεργασίας εικόνας, κινούμενης εικόνας (video) και ήχου. Γλώσσες προγραμματισμού (δηλαδή προγράμματα δημιουργίας νέων προγραμμάτων). ΛΟΓΙΣΜΙΚΟ (SOFTWARE) Εφαρμογές τελικού χρήστη Λειτουργικό σύστημα B.I.O.S. ΥΛΙΚΟ (HARDWARE) Συσκευές εισόδου CPU Συσκευές εξόδου HD RAM

Γενικά περί Ηλεκτρονικών Υπολογιστών 9 1.4 Δυαδικό σύστημα Στο σύνηθες σύστημα αρίθμησης, που έχει βάση το 10, κάθε αριθμός απεικονίζεται ως μια σειρά ψηφίων (από 0 έως 9) που καθένα πολλαπλασιάζεται με μια δύναμη του 10. Παράδειγμα: 5204 = 5 1000 + 2 100 + 0 10 + 4 1 = 5 10 3 + 2 10 2 + 0 10 1 + 4 10 0 Παρόμοια, σε ένα σύστημα αρίθμησης με βάση το 2, ένας αριθμός απεικονίζεται ως μια σειρά ψηφίων (0 ή 1) που καθένα πολλαπλασιάζεται με μια δύναμη του 2. Παράδειγμα: 13 = 1 8 + 1 4 + 0 2 + 1 1 = 1 2 3 + 1 2 2 + 0 2 1 + 1 2 0 = 1101 (2). Η λειτουργία του υπολογιστή στηρίζεται στο δυαδικό σύστημα αρίθμησης, διότι εσωτερικά ο υπολογιστής λειτουργεί με σειρές ηλεκτρικών σημάτων, που για λόγους απλότητας σχεδιασμού και μεγαλύτερης αξιοπιστίας είναι αποκλειστικά δύο ειδών («απουσία» ή «παρουσία» ρεύματος ή τάσης, π.χ. 0Volt ή +5Volt) που συμβολίζονται ως 0 ή 1. Bits & Bytes: Bit (σύμβολο b, binary digit, δυαδικό ψηφίο), ονομάζεται κάθε ένα από τα ψηφία 0 ή 1. Byte (σύμβολο Β) ονομάζεται μια ακολουθία από 8 bit: 1 Byte = 8 bit (1B = 8b). Για τα πολλαπλάσια του bit συνήθως χρησιμοποιείται το 1000, ενώ για τα πολλαπλάσια του Byte συνήθως χρησιμοποιείται το 1024 (που τυπικά λέγεται Kibi (kilo binary) και αρχικά είχε επιλεχθεί γιατί είναι δύναμη του 2 (1024=2 10 ), ενώ ταυτόχρονα είναι κοντά στο 1000): Πολλαπλάσια bit (b) Byte (B) Kilo (k) 1 kb = 1000 b = 10 3 b 1 KiB = 1024 B = 2 10 B Mega (M) 1 Mb = 1000 kb = 10 6 b 1 MiB = 1024 kib = 2 20 B Giga (G) 1 Gb = 1000 Mb = 10 9 b 1 GiB = 1024 MiB = 2 30 B Tera (T) 1 Tb = 1000 Gb = 10 12 b 1 TiB = 1024 GiB = 2 40 B Π.χ. Σε σύνδεση ADSL ταχύτητας 1024 kbps, η ταχύτητα μεταφοράς είναι 1024 kbits per sec, δηλαδή 1024000 bits/sec = 1024000/8 Bytes/sec = 128000 B/s = 128000/1024 kib/s = 125 kib/s Μετατροπή από δυαδικό σε δεκαδικό σύστημα αρίθμησης: Τα ψηφία 0/1 σε ένα δυαδικό αριθμό πολλαπλασιάζονται με διαδοχικές δυνάμεις του 2, ξεκινώντας από τη δύναμη 0 στο δεξί μέρος. Παράδειγμα: Μετατροπή του δυαδικού 01101001 σε δεκαδική μορφή: 01101001 (2) =0 2 7 + 1 2 6 + 1 2 5 + 0 2 4 + 1 2 3 + 0 2 2 + 0 2 1 + 1 2 0 =64+32+0+8+0+0+1 = 105 (10) Μετατροπή από δεκαδικό σε δυαδικό σύστημα αρίθμησης: 1 ος τρόπος: Γράφουμε τις δυνάμεις του 2 (με αντίστροφη σειρά) και στη συνέχεια βρίσκουμε ποιες από αυτές τις δυνάμεις πρέπει να προσθέσουμε για να σχηματίσουμε τον αριθμό. Στις θέσεις αυτών των δυνάμεων βρίσκεται το ψηφίο «1», και στις θέσεις των υπόλοιπων συνάμεων το ψηφίο «0». Παράδειγμα: Μετατροπή του δεκαδικού 105 σε δυαδική μορφή: Γράφουμε τις δυνάμεις του 2 με αντίστροφη σειρά, και μετά γράφουμε «1» κάτω από όσες πρέπει να προσθέσουμε για να σχηματιστεί το 105 και «0» κάτω από τις υπόλοιπες: 2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0 128 64 32 16 8 4 2 1 0 1 1 0 1 0 0 1 Ή, αλλιώς: 105 (10) = 64+32+0+8+0+0+1 = 1 2 6 +1 2 5 +0 2 4 +1 2 3 +0 2 2 +0 2 1 +1 2 0 = 1101001 (2)

10 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 2 ος τρόπος: Ο αριθμός, και στη συνέχεια τα διαδοχικά πηλίκα, διαιρούνται συνεχώς με το 2 μέχρι το πηλίκο να γίνει 0. Τότε τα διαδοχικά υπόλοιπα των διαιρέσεων, σε αντίστροφη σειρά, είναι ο αριθμός σε δυαδική μορφή. Παράδειγμα: Μετατροπή του 13 σε δυαδική μορφή: 13 6 3 1 0 1 0 1 1 Το 13, και μετά τα διαδοχικά πηλίκα, διαιρούνται με το 2. Τα πηλίκα γράφονται από κάτω και τα διαδοχικά υπόλοιπα δεξιά. Όταν το πηλίκο γίνει 0, η δυαδική αναπαράσταση του αριθμού είναι η δεξιά στήλη, σε αντίστροφη σειρά: 13 (10) = 1101 (2) Συνήθως χρησιμοποιούνται πολλαπλάσια του 1 Byte (δηλ. των 8 bits), οπότε αν χρειαστεί συμπληρώνουμε με 0, δηλαδή ο παραπάνω αριθμός γράφεται ως 00001101 (2), δηλαδή: 00001101 (2) = 0 2 7 + 0 2 6 + 0 2 5 + 0 2 4 + 1 2 3 + 1 2 2 + 0 2 1 + 1 2 0 = 13 (10) Οκταδικό και Δεκαεξαδικό σύστημα Η ανάλυση σε δυνάμεις βάσης εφαρμόζεται σε όλα τα θεσιακά συστήματα αρίθμησης (όπως στο δεκαδικό σύστημα, π.χ. 5204 = 5 10 3 + 2 10 2 + 0 10 1 + 4 10 0 ), δηλαδή σε αυτά στα οποία η θέση ενός ψηφίου καθορίζει την «αξία» του, και συγκεκριμένα τον εκθέτη της δύναμης με την οποία πολλαπλασιάζεται (σε αντίθεση π.χ. με το ρωμαϊκό σύστημα αρίθμησης: XII = 12, XIV = 14, C = 100, ). Κάθε αριθμός μπορεί να εκφραστεί σε σύστημα αρίθμησης οποιασδήποτε βάσης (Ν). Τότε, η απεικόνιση του αριθμού γίνεται με μια σειρά ψηφίων (από 0 έως Ν-1), που καθένα πολλαπλασιάζεται με μια δύναμη του Ν. Στον προγραμματισμό, εκτός από το δυαδικό, χρησιμοποιούνται επίσης το οκταδικό (octal) και το δεκαεξαδικό σύστημα (hexadecimal, hex): Οκταδικό σύστημα: Τα 8 ψηφία του είναι τα 0, 1, 2, 3, 4, 5, 6, 7. Π.χ.: 204 (10) = 3 8 2 + 1 8 1 + 4 8 0 = 314 (8) Δεκαεξαδικό σύστημα: Απαιτούνται 16 ψηφία (από 0 έως 15), έτσι χρησιμοποιούνται τα συνήθη ψηφία 0 έως 9, καθώς και τα λατινικά γράμματα A έως F ως σύμβολα των 10 έως 15. Δηλαδή, τα 16 ψηφία του είναι τα 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Π.χ.: 172831 (10) = 2 16 4 + 10 16 3 +3 16 2 + 1 16 1 + 15 16 0 = 2A31F (16)

Γενικά περί Ηλεκτρονικών Υπολογιστών 11 1.5 Κωδικοποίηση χαρακτήρων σε αριθμούς: ASCII και Unicode Ο ηλεκτρονικός υπολογιστής είναι ένας αριθμητικός υπολογιστής. Έτσι, η απεικόνιση των χαρακτήρων (γράμματα του αλφαβήτου, σύμβολα των αριθμητικών ψηφίων, σημεία στίξης) στην οθόνη, στον εκτυπωτή κλπ γίνεται μέσω της αντιστοίχισής τους σε αριθμούς. ASCII: Το γνωστότερο διεθνές πρότυπο κωδικοποίησης χαρακτήρων σε αριθμούς είναι μέσω του κώδικα ASCII (American Standard Code for Information Interchange), ο οποίος χρησιμοποιεί 7 bits, αντιστοιχώντας έτσι συνολικά 2 7 =128 χαρακτήρες ή σύμβολα στους α- ριθμούς 0 έως 127. Στις θέσεις 0 έως 31 και 127 βρίσκονται οι λεγόμενοι μη εκτυπώσιμοι χαρακτήρες του κώδικα ASCII, οι οποίοι αντιστοιχούν σε στοιχειώδεις λειτουργίες (π.χ.: 0=null character, 7=bell, 8=backspace, 9=tab, 10=line feed, 13=carriage return, 27=escape, 127=delete). Στις υπόλοιπες θέσεις, 32 έως 126, βρίσκονται οι εκτυπώσιμοι χαρακτήρες του πίνακα ASCII, οι οποίοι είναι τα πεζά και κεφαλαία γράμματα του λατινικού αλφαβήτου (a z, A Z), τα αριθμητικά ψηφία (0 9) και διάφορα άλλα σύμβολα (σημεία στίξης, παρενθέσεις, σύμβολα αριθμητικών πράξεων κλπ), όπως φαίνεται στον παρακάτω πίνακα: 32 (space) 51 3 70 F 89 Y 108 l 33! 52 4 71 G 90 Z 109 m 34 " 53 5 72 H 91 [ 110 n 35 # 54 6 73 I 92 \ 111 o 36 $ 55 7 74 J 93 ] 112 p 37 % 56 8 75 K 94 ^ 113 q 38 & 57 9 76 L 95 _ 114 r 39 ' 58 : 77 M 96 ` 115 s 40 ( 59 ; 78 N 97 a 116 t 41 ) 60 < 79 O 98 b 117 u 42 * 61 = 80 P 99 c 118 v 43 + 62 > 81 Q 100 d 119 w 44, 63? 82 R 101 e 120 x 45-64 @ 83 S 102 f 121 y 46. 65 A 84 T 103 g 122 z 47 / 66 B 85 U 104 h 123 { 48 0 67 C 86 V 105 i 124 49 1 68 D 87 W 106 j 125 } 50 2 69 E 88 X 107 k 126 ~ Exted ASCII: Επέκταση του ASCII αποτελεί το Exted ASCII, που χρησιμοποιεί 8 bits (επομένως έχει δυνατότητα για αντιστοίχιση 2 8 =256 θέσεων). Οι πρώτες 128 (0-127) θέσεις του Exted ASCII έχουν την ίδια αντιστοίχιση με αυτήν του 7-bit ASCII, ενώ οι θέσεις 128 έως 255 εκχωρούνται σε επιπλέον χαρακτήρες αλφαβήτων άλλων γλωσσών και α- πλών γραφικών συμβόλων. Το Exted ASCII αναφέρεται πλέον απλά ως ASCII. Unicode: Πλήρης λύσης για την κωδικοποίηση των χαρακτήρων όλων των διεθνών αλφαβήτων, καθώς και πάρα πολλών επιπλέον συμβόλων, δόθηκε με την κωδικοποίηση Unicode. Η κωδικοποίηση Unicode είναι 16-bit κι έτσι μπορεί να κωδικοποιήσει συνολικά 2 16 =65536 χαρακτήρες ή σύμβολα. Για παράδειγμα, οι χαρακτήρες του ελληνικού μονοτονικού αλφαβήτου βρίσκονται στις θέσεις 900-974, το σύμβολο του ευρώ ( ) στη θέση 8364 κλπ. Παρά την ύπαρξη του Unicode ως διεθνούς προτύπου, υπάρχουν ακόμη προβλήματα εμφάνισης λανθασμένων χαρακτήρων σε αρκετές περιπτώσεις, λόγω κατασκευής πολλών προγραμμάτων λογισμικού ως μη συμβατών με το Unicode.

12 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 1.6 Οργάνωση αρχείων Ένα αρχείο είναι μια ομάδα πληροφοριών αποθηκευμένη με ένα όνομα σε κάποιο αποθηκευτικό μέσο. Ονόματα αρχείων Τα ονόματα των αρχείων αποτελούνται από δύο μέρη, το κυρίως όνομα και την επέκταση, που χωρίζονται μεταξύ τους από μία τελεία (.). Η επέκταση χρησιμοποιείται από εμάς και από τα προγράμματα για τη διάκριση του είδους του αρχείου. Στο λειτουργικό σύστημα MS-DOS, το κυρίως όνομα πρέπει να είναι από 1 μέχρι 8 χαρακτήρες και η επέκταση από 0 μέχρι 3 χαρακτήρες. Οι χαρακτήρες του ονόματος ή της επέκτασης μπορεί να είναι λατινικά γράμματα (a z, A Z), ψηφία (0 9) ή σύμβολα (όλοι οι εκτυπώσιμοι χαρακτήρες του 7-bit ASCII, εκτός από τα \ / : *? " < >. και το κενό διάστημα (space), το οποίο πολλές φορές στα γραπτά κείμενα το συμβολίζουμε ως ). Στο λειτουργικό σύστημα Microsoft Windows ο μόνος περιορισμός μήκους χαρακτήρων είναι ότι το κυρίως όνομα μαζί με την επέκταση αλλά και μαζί με τη λογική διαδρομή -pathαποθήκευσής του στο δίσκο είναι μέχρι 255 χαρακτήρες. Επιπλέον, επιτρέπονται σχεδόν όλοι οι εκτυπώσιμοι χαρακτήρες του Unicode, όπως και οι ελληνικοί ή άλλων γλωσσών χαρακτήρες, η τελεία (.) και το κενό διάστημα, με εξαίρεση τους \ / : *? " < > οι οποίοι α- παγορεύονται. Το DOS και τα Windows δεν κάνουν διάκριση μεταξύ πεζών και κεφαλαίων γραμμάτων στα ονόματα των αρχείων (σε αντίθεση π.χ. με τα Unix και Linux). Είδη αρχείων Εκτελέσιμα αρχεία: Είναι αρχεία εντολών προς τον υπολογιστή. Η επέκτασή τους είναι συνήθως.exe ή.com («προγράμματα», executables, commands),.bat (batch files ή αρχεία δέσμης, περιέχουν μια ομάδα («δέσμη») απλών εντολών του λειτουργικού συστήματος), κλπ. Βοηθητικά αρχεία: Είναι αρχεία υποβοηθητικά για τη λειτουργία των προγραμμάτων ή του λειτουργικού συστήματος. Αρχεία δεδομένων: Είναι αρχεία που δημιουργούνται από εμάς συνήθως, με τη βοήθεια ενός εκτελέσιμου αρχείου (προγράμματος). Η κατάληξή τους, για λόγους οργάνωσης και ευκολίας, εξαρτάται από το πρόγραμμα που τα δημιούργησε και που μπορεί να τα αναγνώσει και τα εμφανίσει τα περιεχόμενά τους. Παραδείγματα:.DOC: Έγγραφα (documents), από το MS-Word..PDF: Έγγραφα (documents), από το Adobe Acrobat..XLS: Λογιστικά φύλλα (spreadsheets), από το MS-Excel..TXT: Αρχεία απλού κειμένου (plain text). Μπορούν να δημιουργηθούν και να αναγνωστούν από απλά προγράμματα που λέγονται διορθωτές (editors), όπως π.χ. το Notepad..C: Κώδικας προγράμματος γλώσσας προγραμματισμού C. Είναι απλό αρχείο κειμένου και μπορεί να δημιουργηθεί από απλό διορθωτή, όπως το Notepad, ή συνηθέστερα από το διορθωτή ενός περιβάλλοντος για ανάπτυξη προγραμμάτων σε γλώσσα C..M: Κώδικας προγράμματος γλώσσας προγραμματισμού MATLAB. Είναι απλό αρχείο κειμένου και μπορεί να δημιουργηθεί από απλό διορθωτή, όπως το Notepad, ή συνηθέστερα από το διορθωτή του περιβάλλοντος MATLAB..HTML: Αρχείο ιστοσελίδας. Είναι απλό αρχείο κειμένου και μπορεί να δημιουργηθεί από απλό διορθωτή, όπως το Notepad, ή συνηθέστερα από πιο εξειδικευμένα προγράμματα

Γενικά περί Ηλεκτρονικών Υπολογιστών 13 (π.χ. FrontPage, DreamWeaver), ενώ αναπαράγεται με τα προγράμματα πλοήγησης στο διαδίκτυο (π.χ. Internet Explorer, Mozilla Firefox, Chrome, Opera, Safari)..BMP,.JPG,.TIF, GIF: Αρχεία εικόνων. Δημιουργούνται και διαβάζονται από προγράμματα επεξεργασίας εικόνων, όπως το Paint ή το Adobe Photoshop, ή από τα προγράμματα που χειρίζονται τις συσκευών εισόδου εικόνας (ψηφιακές κάμερες κλπ)..wav,.mp3: Αρχεία ήχου. Δημιουργούνται συνήθως από τα προγράμματα που χειρίζονται τις συσκευές εισόδων ήχου (μικρόφωνο κλπ) και αναπαράγονται ή επεξεργάζονται από κατάλληλα προγράμματα (Windows Media Player, WinAmp κλπ)..avi,.mpg,.mp4: Αρχεία video. Δημιουργούνται συνήθως από τα προγράμματα που χειρίζονται τις συσκευές εισόδων ήχου και εικόνας και αναπαράγονται ή επεξεργάζονται από κατάλληλα προγράμματα (Windows Media Player, QuickTime κλπ). Μορφή αρχείων Αρχεία κειμένου (text files): Περιέχουν απλό κείμενο χωρίς καμία μορφοποίηση (π.χ. αρχεία με κατάληξη.bat,.txt,.c,.m,.html), με απλούς χαρακτήρες του κώδικα ASCII. Δυαδικά αρχεία (binary files): Οι πληροφορίες που περιέχουν είναι σε στοιχειώδη δυαδική μορφή, μη αναγνώσιμη με άμεσο ή απλό τρόπο. Αν είναι εκτελέσιμα αρχεία (με επέκταση π.χ..exe), δεν μπορούμε να δούμε τις εντολές που περιέχουν, παρά μόνο να τα εκτελέσουμε και να δούμε το αποτέλεσμα. Αν είναι αρχεία δεδομένων (π.χ. με επεκτάσεις.doc,.xls,.pdf) μπορούμε να δούμε τα περιεχόμενά τους μόνο με το κατάλληλο πρόγραμμα που τα δημιούργησε ή που μπορεί να αναγνωρίσει την κωδικοποίηση των πληροφοριών τους (MS- Word, MS-Excel, Adobe Acrobat αντίστοιχα). Σύστημα οργάνωσης αρχείων Μόνιμα αποθηκευτικά μέσα: Τα αρχεία αποθηκεύονται μόνιμα σε μαγνητικούς δίσκους όπως σκληρούς δίσκους και (πολύ σπάνια πλέον) εύκαμπτες δισκέτες, σε οπτικούς δίσκους όπως CD και DVD εγγραφής (R) ή μόνο ανάγνωσης (ROM), σε μαγνητοοπτικούς δίσκους όπως CD και DVD επανεγγραφής (RW), σε μνήμες flash (USB sticks, SSD) ή σε μαγνητικές ταινίες. Τα ονόματα των μόνιμων αποθηκευτικών μέσων αποτελούνται από έναν λατινικό χαρακτήρα (πεζό ή κεφαλαίο) ακολουθούμενο από άνω-κάτω τελεία (:). Παραδείγματα: A:, B: Δισκέτα (Floppy disk, FDD). Χωρητικότητα 1.44MB (σχεδόν σε αχρηστία πλέον). C: Δίσκος συστήματος (σκληρός δίσκος, hard disk drive, HDD, π.χ. 80GB - 2TB ή «δίσκος» SSD, solid state drive, 32GB-256GB). Στο δίσκο αυτό εγκαθίσταται συνήθως το λειτουργικό σύστημα και οι εφαρμογές. D:, E:, F:, Z: Επιπλέον σκληροί δίσκοι ή SSD, συσκευές ανάγνωσης για CD (650-800MB) και για DVD (4.77GB, σπανιότερα 2 επιπέδων ή και 2 πλευρών), μνήμες flash (π.χ. 256MB- 32GB, συνήθως συνδεόμενες στις θύρες USB), ψηφιακές μαγνητικές ταινίες (digital tapes). Φάκελοι: Για καλύτερη οργάνωση, τα αρχεία ομαδοποιούνται σε φακέλους (folders, στα Windows) ή καταλόγους (directories, παλαιότερη ονομασία προερχόμενη από το λειτουργικό σύστημα MS-DOS). Τα ονόματα των φακέλων ακολουθούν τους ίδιους κανόνες με τα ονόματα των αρχείων (π.χ. 8+3 στο MS-DOS ή 255 χαρακτήρες στα Windows). Παλαιότερα για λόγους εύκολου διαχωρισμού συνήθως τους δινόταν όνομα με κεφαλαία γράμματα και χωρίς επέκταση (π.χ. MSDOS, WINDOWS, WINNT, SYSTEM κλπ), χωρίς αυτό να είναι υποχρεωτικό (π.χ. My Documents, Program Files κλπ). Η δομή των καταλόγων/φακέλων είναι «δενδροειδής». Ο αρχικός φάκελος λέγεται ριζικός (root) και συμβολίζεται με το σύμβολο «\» (ανάποδη κάθετος, backslash). Το ίδιο σύμβολο χρησιμοποιείται για να χωρίζουν και οι υποφάκελοι μεταξύ τους. Η ακολουθία των υποφακέλων λέγεται διαδρομή (path).

14 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Π.χ. Έστω η δομή φακέλων του διπλανού σχήματος. Στην περίπτωση αυτή υπάρχουν οι εξής κατάλογοι: C:\ C:\ (root) Windows C:\Windows\ C:\Program Files\ C:\Program Files\Matlab71\ C:\Program Files\Matlab71\work\ C:\My Documents\ C:\My Documents\Letters\ C:\My Documents\Photos\ Program Files Matlab71 My Documents work Letters Photos Βασικές εντολές γραμμής εντολών (command prompt) περιβάλλοντος Windows Η είσοδος σε περιβάλλον γραμμής εντολών στα Windows γίνεται από το κουμπί έναρξης των Windows > All Programs > Accessories > Command Prompt. Εντολές φακέλων (καταλόγων): Ο τρέχων φάκελος/κατάλογος (current folder/directory) συμβολίζεται με μια τελεία (.), ενώ ο φάκελος του αμέσως ανωτέρω επιπέδου (parent folder) με δύο τελείες (..). dir = εμφάνιση στην οθόνη μιας λίστας των ονομάτων των αρχείων και των υποφακέλων που περιέχει ο τρέχων φάκελος (κατάλογος, directory). md (make directory) = δημιουργία ενός φακέλου. rd (remove directory) = διαγραφή ενός (άδειου, για λόγους ασφαλείας) φακέλου. cd (change directory) = αλλαγή του τρέχοντος φακέλου. Π.χ.1: dir *.txt = εμφάνιση των αρχείων με επέκταση.txt Π.χ.2: Αν είμαστε στο C:\DATA\ και δώσουμε md LETTERS και μετά cd LETTERS, τότε θα βρεθούμε στον C:\DATA\LETTERS\. Με cd.. θα βρεθούμε ξανά στο C:\DATA\ Εντολές αρχείων: Ο χαρακτήρας «?» χρησιμοποιείται για να δηλώσει μόνο έναν οποιονδήποτε χαρακτήρα, ενώ ο χαρακτήρας «*» χρησιμοποιείται για να δηλώσει οποιουσδήποτε/οσουσδήποτε χαρακτήρες. Π.χ.: *.txt = όλα τα αρχεία με επέκταση.txt, *.* = όλα τα αρχεία (με οποιαδήποτε επέκταση), *. = όλα τα αρχεία χωρίς επέκταση May*.doc = May1.doc, May2.doc, May14.doc, MayLettr.doc, κλπ. May??.doc = May01.doc, May_K.doc κλπ. (αλλά όχι May1.doc, MayLettr.doc κλπ.) copy = αντιγραφή αρχείων (π.χ. copy *.txt a:\ σημαίνει αντιγραφή όλων των αρχείων με επέκταση.txt στη δισκέτα a:, ενώ copy c:\programs\prog1.m. σημαίνει α- ντιγραφή του prog1.txt από το φάκελο c:\programs\ στον τρέχοντα φάκελο ) del = διαγραφή αρχείων. Π.χ. del *.* σημαίνει διαγραφή όλων των αρχείων του τρέχοντος φακέλου. ren = μετονομασία αρχείων. Π.χ. ren john.doc john1.doc (προφανής μετονομασία), ενώ ren *.txt *.m σημαίνει μετονομασία όλων των αρχείων με επέκταση.txt σε αρχεία με το ίδιο όνομα αλλά με επέκταση.m (εντολή κατάλληλη για μαζική αλλαγή επέκτασης).

Γενικά περί Ηλεκτρονικών Υπολογιστών 15 Ερωτήσεις 1.1 Τι είναι ένας υπολογιστής, και τι ένας καθολικός υπολογιστής; 1.2 Από ποια γενικά τμήματα αποτελείται η φυσική δομή (hardware) ενός ηλεκτρονικού υπολογιστή, και ποιος ο ρόλος του καθενός; 1.3 Από ποια γενικά τμήματα αποτελείται το λογισμικό (software) ενός ηλεκτρονικού υπολογιστή, και ποιος ο ρόλος του καθενός; 1.4 Τι ονομάζουμε bit και τι byte; 1.5 Να αναφερθούν 4 πολλαπλάσια του bit και του byte. 1.6 Τι είναι τα θεσιακά συστήματα αρίθμησης; Να αναφερθούν 3 παραδείγματα. 1.7 Τι είναι η κωδικοποιήσεις ASCII και Unicode; Πόσα bits χρησιμοποιούν τα ASCII, Exted ASCII και Unicode, και κατά συνέπεια πόσοι είναι οι χαρακτήρες που μπορούν να κωδικοποιηθούν σε αυτά; 1.8 Ποια είναι τα γενικά είδη των ηλεκτρονικών αρχείων; Σε ποιες μορφές μπορούν να είναι αποθηκευμένα τα περιεχόμενα των αρχείων; 1.9 Να περιγρεφεί συνοπτικά η δομή του συστήματος αρχείων των συνηθισμένων λειτουργικών συστημάτων (DOS, Windows, Unix, Linux κλπ). 1.10 Οι χαρακτήρες * και? είναι επιτρεπτοί για χρήση σε ονόματα αρχείων; Τι αντιπροσωπεύουν αυτοί οι χαρακτήρες, όταν χρησιμοποιούνται σε εντολές του λειτουργικού συστήματος που αναφέρονται σε ονόματα αρχείων; Ασκήσεις 1.11 Να βρεθούν οι δεκαδικές αναπαραστάσεις των παρακάτω αριθμών του δυαδικού συστήματος: 110101, 101, 00101, 1111111 1.12 Να βρεθούν οι δυαδικές αναπαραστάσεις των παρακάτω αριθμών του δεκαδικού συστήματος (οι δυαδικοί αριθμοί να γραφτούν με 8 bits = 1 Byte): 128, 255, 0, 1 1.13 Να βρεθούν οι δεκαδικές αναπαραστάσεις των παρακάτω αριθμών του δεκαεξαδικού συστήματος: 0, 1, 9, A, F, 10, 11, 12, 19, 1A, 1F, 20, 2A, FF 1.14 Να βρεθούν οι δεκαεξαδικές αναπαραστάσεις των παρακάτω αριθμών του δεκαδικού συστήματος: 0, 15, 16, 255, 256

2.1 Αλγόριθμοι Αλγόριθμοι και προγραμματισμός 2 Αλγόριθμοι και Προγραμματισμός Αλγόριθμος είναι μια πεπερασμένη σειρά βημάτων για την επίλυση ενός προβλήματος. Ο προγραμματισμός δεν είναι παρά η κατάλληλη «μετάφραση» ενός αλγορίθμου στις ε- ντολές μιας γλώσσας προγραμματισμού. Ή αλλιώς, ένα πρόγραμμα είναι πάντα η «υλοποίηση» ενός αλγορίθμου στον υπολογιστή. Για παράδειγμα, η υλοποίηση του βήματος «τύπωσε στην οθόνη τη λέξη Hello!» στη γλώσσα προγραμματισμού του MATLAB μπορεί να γίνει με την εντολή: fprintf('hello!'); Βασικά στοιχεία αλγορίθμων Τα βασικά στοιχεία ενός αλγορίθμου, με τα οποία αποδεικνύεται ότι μπορεί να λυθεί οποιοδήποτε πρόβλημα (και μπορούν να χρησιμοποιηθούν κατά την δημιουργία οποιουδήποτε προγράμματος), είναι: 1. Ανάθεση 2. Επιλογή 3. Επανάληψη Τα παραπάνω στοιχεία εφαρμόζονται και στα 3 τμήματα ενός προγράμματος, δηλαδή στην είσοδο των δεδομένων, στην επεξεργασία τους και στην έξοδο των αποτελεσμάτων. Παράδειγμα: Επίλυση πρωτοβάθμιας εξίσωσης: Ανάθεση Θέσε την τιμή της μεταβλητής a ίση με 3. Είσοδος Ανάθεση Θέσε την τιμή της μεταβλητής b ίση με 12. Είσοδος Επιλογή Αν a 0, Ανάθεση Επιλογή Αν a=0, Επιλογή Θέσε στη μεταβλητή x το πηλίκο -b/a. Τύπωσε στην οθόνη την τιμή της x. Επεξεργασία Έξοδος Αν b=0, τύπωσε στην οθόνη το μήνυμα «Η εξίσωση Έξοδος είναι αόριστη». Επιλογή Αν b 0, τύπωσε στην οθόνη το μήνυμα «Η εξίσωση Έξοδος είναι αδύνατη». Άσκηση: Να κατασκευαστεί παρόμοιος αλγόριθμος που να επιλύει τη δευτεροβάθμια εξίσωση. Παράδειγμα: Εύρεση του αθροίσματος S των ακεραίων από 1 έως N: Ανάθεση Ζήτησε από το πληκτρολόγιο έναν θετικό ακέραιο και θέσε την Είσοδος τιμή του στη μεταβλητή N. Ανάθεση Θέσε στη μεταβλητή S την αρχική τιμή 0. Επεξεργασία Επανάληψη Επανάλαβε την παρακάτω διαδικασία θέτοντας διαδοχικά την τιμή της μεταβλητής i από 1 έως N Ανάθεση Θέσε στη μεταβλητή S την προηγούμενη τιμή της Επεξεργασία αυξημένη κατά i Τύπωσε την τιμή της μεταβλητής S. Έξοδος Άσκηση: Να βελτιωθεί ο παραπάνω αλγόριθμος, ώστε η ακολουθία να ξεκινάει από οποιοδήποτε ακέραιο k και να προχωράει με οποιοδήποτε βήμα a. Τα k και a πρέπει να δίνονται από το πληκτρολόγιο, όπως το N (στο προηγούμενο παράδειγμα ήταν k=1 και a=1).

Το περιβάλλον προγραμματισμού του MATLAB 17 2.2 Γλώσσες προγραμματισμού Γλώσσα προγραμματισμού είναι ένα σύνολο εντολών, από τις οποίες επιλέγονται όσες α- παιτούνται και τοποθετούνται με κατάλληλη σειρά κατά τη συγγραφή ενός προγράμματος. Γλώσσα μηχανής είναι ο τρόπος ελέγχου του υπολογιστή με σειρές δυαδικών ψηφίων (0 ή 1). Όπως καταλαβαίνουμε, ακόμα και οι απλούστερες εντολές προς τον υπολογιστή δημιουργούν πολύ μακρές σειρές δυαδικών ψηφίων, με αποτέλεσμα να είναι πρακτικά αδύνατος ο προγραμματισμός σε γλώσσα μηχανής. Για το λόγο αυτό, είναι αναγκαίος ο συμβολισμός των εντολών σε μια «γλώσσα» πιο κατανοητή και πιο εύχρηστη από τον άνθρωπο. Assembly είναι μια συμβολική γλώσσα για τον έλεγχο του υπολογιστή, στην οποία γίνεται απ ευθείας αντιστοίχιση των βασικότερων εντολών της γλώσσας μηχανής σε πιο εύχρηστα σύμβολα. Το αποτέλεσμα ενός προγράμματος σε assembly είναι πολύ γρήγορο καθώς είναι πολύ κοντά στη γλώσσα μηχανής. Παρόλ αυτά, η assembly δεν παύει να είναι ακόμη πολύ στοιχειώδης και δύσχρηστη, όπως φαίνεται στο παρακάτω παράδειγμα: Γλώσσα C, PASCAL, MATLAB Γλώσσα Assembly Γλώσσα Μηχανής c = a + b add $c, $a, $b 10001110 01101010 00000000 00001100 http://www.edu.physics.uoc.gr/~ph150/source/4-1.html Γλώσσες προγραμματισμού ανωτέρου επιπέδου: Για να γίνει δυνατή η κατασκευή προγραμμάτων για επίλυση συνθετότερων προβλημάτων αναπτύχθηκαν γλώσσες ανωτέρου επιπέδου, όπως Basic, Cobol, Fortran, Pascal, C, C++, Python κλπ. Η Basic θεωρείτο κατάλληλη για εισαγωγή στον προγραμματισμό, η Cobol είχε αναπτυχθεί με εξειδίκευση σε εμπορικές εφαρμογές, η Fortran είναι βελτιστοποιημένη για επίλυση προβλημάτων αριθμητικής ανάλυσης, ενώ η Pascal και η C είναι πλούσιες γενικές γλώσσες για πολλών ειδών εφαρμογές. Επιπλέον, έχουν αναπτυχθεί και γλώσσες για εξειδικευμένες περιοχές, όπως Lisp (τεχνητή νοημοσύνη), Matlab και Mathematica (τεχνικός και επιστημονικός προγραμματισμός), Java (διαδικτυακός προγραμματισμός και επικοινωνία συσκευών) κλπ. Την τελευταία δεκαετία έχει γίνει ανάπτυξη των παραπάνω γλωσσών σε περιβάλλον Windows και έχουν εμπλουτιστεί με πολλές «βιβλιοθήκες» (σύνολα εντολών και συναρτήσεων) για επαγγελματική ανάπτυξη ε- φαρμογών. Οι γλώσσες προγραμματισμού ανωτέρου επιπέδου χωρίζονται σε γλώσσες που υλοποιούν αλγοριθμικό προγραμματισμό (με υποκατηγορίες για διαδικασιακό (π.χ. Fortran, C), αντικειμενοστραφή (π.χ. C++, Java) και παράλληλο (π.χ. Java) προγραμματισμό) και σε γλώσσες που υλοποιούν δηλωτικό προγραμματισμό (με υποκατηγορίες για λογικό (π.χ. Prolog), συναρτησιακό (π.χ. Haskell, Lisp) και βάσεων δεδομένων (π.χ. SQL) προγραμματισμό). 2.3 Δημιουργία ενός προγράμματος 1. Δημιουργία του αλγορίθμου: Μετά από ανάλυση των απαιτήσεων του προβλήματος και διαίρεσή του σε απλά τμήματα γίνεται η κατασκευή του αλγορίθμου (στο «χαρτί» ή νοητά, ανάλογα με την πολυπλοκότητα, καθώς ο προγραμματιστής έχει πάντα στο μυαλό του, ενσυνείδητα ή υποσυνείδητα, τα βήματα που πρόκειται να ακολουθήσει). 2. Γράψιμο του κώδικα του προγράμματος: Αυτό γίνεται σε χρησιμοποιώντας απλά προγράμματα στον υπολογιστή, ειδικά για να συγγραφή απλού κειμένου, που λέγονται διορθωτές (editors). Το κείμενο που δημιουργείται από το διορθωτή και που περιέχει τις εντολές του προγράμματος λέγεται πηγαίος κώδικας (source code) ή απλά κώδικας του προγράμματος. 3. Μεταγλώττιση (compilation) ή διερμηνεία (interpretation): Είναι η μετατροπή του προγράμματος από τη μορφή του πηγαίου κώδικα στη γλώσσα μηχανής, έτοιμο να εκτελεστεί από τον υπολογιστή. Αυτό γίνεται με τη χρήση ειδικών προγραμμάτων που λέγονται μεταγλωττιστές (compilers) ή διερμηνείς (interpreters) της γλώσσας που χρησιμοποιούμε. Μια διαφορά μεταξύ τους είναι ότι ο compiler δημιουργεί ένα πρόγραμμα που μπορεί να τρέξει

18 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB αυτόνομα στον υπολογιστή (εκτελέσιμο αρχείο), ενώ ο interpreter εκτελεί το πρόγραμμα γραμμή-γραμμή, συνήθως μέσα από το περιβάλλον του interpreter. Κατά τη διάρκεια της τελευταίας διαδικασίας εμφανίζονται και τα τυχόν σφάλματα (bugs) του προγράμματος, οπότε εδώ πρέπει να προστεθεί και η πολύ σημαντική διαδικασία της α- ποσφαλμάτωσης (debugging). Ερωτήσεις 2.1 Τι είναι αλγόριθμος; Ποια η σχέση ενός αλγόριθμου με ένα πρόγραμμα στον υπολογιστή; 2.2 Τι από τα παρακάτω πλησιάζει περισσότερο την έννοια του αλγορίθμου: [ ] Ένα πρόγραμμα στον υπολογιστή. [ ] Οι εντολές ενός προγράμματος στον υπολογιστή. [ ] Τα απλά βήματα ενός προγράμματος στον υπολογιστή. [ ] Τα απλά βήματα για την επίλυση ενός προβλήματος. 2.3 Ένα πρόγραμμα στον υπολογιστή: [ ] Είναι ένας αλγόριθμος. [ ] Είναι η υλοποίηση ενός αλγορίθμου. [ ] Δεν έχει καμία σχέση με έναν αλγόριθμο. [ ] Αποτελεί τη βάση για την κατασκευή ενός αλγόριθμου. 2.4 Ποια είναι τα βασικά στοιχεία ενός αλγορίθμου; 2.5 Ποια είναι τα βήματα κατά τη δημιουργία ενός προγράμματος στον υπολογιστή; 2.6 Τι είναι η γλώσσα μηχανής και τι η assembly; Να αναφερθούν τρία παραδείγματα γλωσσών προγραμματισμού, με το πεδίο στο οποίο συνήθως χρησιμοποιούνται. 2.7 Να σημειωθούν ποιες από τις παρακάτω είναι γλώσσες προγραμματισμού ανωτέρου ε- πιπέδου: [ ] Basic [ ] Assembly [ ] Γλώσσα μηχανής [ ] Fortran [ ] Pascal [ ] C Ασκήσεις 2.8 Χρησιμοποιώντας τα βασικά στοιχεία ενός αλγορίθμου (ανάθεση, επιλογή, επανάληψη), να γραφτούν τα απλά βήματα με τα οποία ένας αλγόριθμος υπολογίζει το n- παραγοντικό (n!=1 2 3 n), αν το n είναι θετικός ακέραιος, ή τυπώνει μήνυμα «Ακατάλληλος αριθμός» σε αντίθετη περίπτωση. 2.9 Να γραφτεί ένας αλγόριθμος που υπολογίζει το μέσο όρο μιας ομάδας αριθμών. 2.10 (i) Να γραφτεί ένας αλγόριθμος που υπολογίζει και τυπώνει κατάλληλο μήνυμα με (α) το μέγιστο και (β) τον ελάχιστο αριθμό από ένα δοσμένο σύνολο. (ii) Να βελτιωθούν οι παραπάνω αλγορίθμοι, ώστε σε περίπτωση πολλαπλής εμφάνισης του μεγίστου ή του ελαχίστου να τυπώνουν και το πλήθος αυτών των επαναλήψεων (π.χ. «Ο ελάχιστος α- ριθμός είναι το -12 και εμφανίζεται 2 φορές»). 2.11 Δίνεται ένα σύνολο από βαθμολογίες φοιτητών. Να γραφτεί κατάλληλος αλγόριθμος ο οποίος βρίσκει το πλήθος των φοιτητών που πέρασαν το μάθημα (βαθμός 5) καθώς και των φοιτητών που αρίστευσαν (βαθμός 8.5).

Το περιβάλλον προγραμματισμού του MATLAB 19 3 Το περιβάλλον και ο τρόπος λειτουργίας του MATLAB Το MATLAB είναι μια γλώσσα προγραμματισμού ανώτερου επιπέδου, με εγγενείς ιδιαίτερες δυνατότητες χειρισμού πινάκων και απεικόνισης γραφικών. Ταυτόχρονα, περιέχει μια σειρά από έτοιμες συναρτήσεις που μπορούν να χρησιμοποιηθούν σε προγράμματα διαφόρων εφαρμογών. Το MATLAB χρησιμοποιείται παγκοσμίως για ανάπτυξη ακόμη και ιδιαιτέρως απαιτητικών ερευνητικών, τεχνικών και μηχανολογικών εφαρμογών. Τα περισσότερα από όσα αναφέρονται στη συνέχεια βασίζονται στην έκδοση 7.1 του MATLAB, αν και σχεδόν όλα ισχύουν και για μερικές προηγούμενες καθώς και επόμενες εκδόσεις. 3.1 Το περιβάλλον του MATLAB Μετά την πρώτη εγκατάσταση και εκτέλεση του MATLAB, εμφανίζεται το γραφικό περιβάλλον αλληλεπίδρασης με το χρήστη, που ονομάζεται Επιφάνεια Εργασίας (Desktop) του MATLAB, όπως φαίνεται στο σχήμα: Στο Desktop του MATLAB μπορούν να βρίσκονται τα εξής τμήματα (παράθυρα), που μπορούμε να επιλέξουμε την εμφάνισή τους ή όχι από την επιλογή Desktop του μενού, όπως φαίνεται στην παραπάνω εικόνα: Command Window Command History Current Directory (ή Current Folder, αναλόγως της έκδοσης του MATLAB) Workspace Help Profiler Αν και δεν φαίνονται στην παραπάνω εικόνα, μπορεί επίσης να είναι «ανοιχτό» το παράθυρο του Διορθωτή (Editor), που χρησιμεύει για να γράφουμε προγράμματα σε MATLAB, ενώ τέλος μπορεί να υπάρχουν και παράθυρα απεικόνισης γραφικών (Figures), δηλαδή εικόνων, γραφικών παραστάσεων ή άλλων γραφημάτων: Editor Figure

20 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Περιγραφή παραθύρων του Desktop Παρακάτω περιγράφονται τα παράθυρα που μπορεί να βρίσκονται ανοιχτά ή όχι στο Desktop του MATLAB, με σειρά σπουδαιότητας που έχουν σε σχέση με τους σκοπούς του εγχειριδίου αυτού: Editor Χρήση: Για συγγραφή και επεξεργασία κώδικα προγράμματος. Στον Editor μπορούν να βρίσκονται «ανοιχτά» ένα ή περισσότερα παράθυρα με προγράμματα. Ένα νέο παράθυρο για συγγραφή κώδικα δημιουργείται με την επιλογή New M-File του μενού File (συντόμευση πληκτολογίου: Control-N). Command Window Κύρια χρήση: (α) Εμφάνιση αποτελεσμάτων εκτύπωσης κειμένου στην οθόνη (όπου στη συνέχεια αναφέρεται «εκτύπωση στην οθόνη» θα εννοείται «εκτύπωση στο Command Window»). (β) Άμεση εκτέλεση εντολών. Με τον τρόπο αυτό μπορεί να δοκιμάζεται ο τρόπος λειτουργίας μιας εντολής πριν χρησιμοποιηθεί σε πρόγραμμα. Άλλες χρήσεις: Συνδυάζοντας τα δύο προηγούμενα μπορεί να γίνει αποσφαλμάτωση των προγραμμάτων. Επίσης, γράφοντας help εντολή δίνεται μια σύντομη περιγραφή λειτουργίας της συγκεκριμένης εντολής (ενώ με doc εντολή εμφανίζεται το παράθυρο Help με πολύ περισσότερες δυνατότητες βοήθειας για την εντολή αυτή). Τα δύο παραπάνω παράθυρα είναι τα περισσότερο χρήσιμα στην αρχή, οπότε συνιστάται να υπάρχουν μόνο αυτά μέχρι κάποιος να εξοικειωθεί με το MATLAB (τα άλλα παράθυρα μπορούν αρχικά να «κλείσουν», και να «ξανανοίξουν» αν χρειαστεί, από το μενού Desktop). Help Εμφάνιση βοήθειας για όλο το περιβάλλον, τις εντολές, τις συναρτήσεις και τα toolbox του MATLAB. Η έννοια για την οποία θέλουμε βοήθεια είτε ανευρίσκεται στην καρτέλα Contents, είτε γράφεται σε κατάλληλο πεδίο που βρίσκεται στην καρτέλα Index. Ιδιαιτέρως σημαντικό είναι το τμήμα Getting Started, ακολουθώντας τα βήματα του οποίου μπορεί κάποιος να μάθει εύκολα τις δυνατότητες του MATLAB. Το παράθυρο του Help μπορεί να εμφανιστεί και από το μενού Help. Workspace Εμφανίζονται οι μεταβλητές του MATLAB που βρίσκονται στη μνήμη του υπολογιστή. Έτσι μπορούμε να δούμε συνεχώς τις τιμές τους, ακόμα και κατά τη διάρκεια εκτέλεσης ενός προγράμματος, διότι το παράθυρο αυτό ενημερώνεται σε πραγματικό χρόνο. Current Directory/Current Folder Εκεί εμφανίζονται όλα τα αρχεία που βρίσκονται στο Current Directory/Current Folder. Command History Εμφανίζονται όλες οι προηγούμενες εντολές που έχουμε δώσει στο Command Window. Αυτό χρησιμεύει όταν εργαζόμαστε κυρίως από το Command Window (αντί του Editor). Profiler Πρόκειται για το παράθυρο μιας ενσωματωμένης εφαρμογής η οποία μας δίνει το χρόνο που απαιτείται για την εκτέλεση κάθε εντολής και συνάρτησης σε ένα πρόγραμμα. Είναι μια πολύ χρήσιμη εφαρμογή όταν θέλουμε να βρούμε τα σημεία στα οποία υπάρχουν καθυστερήσεις. Ένα παράθυρο μπορεί να μετακινηθεί σε άλλη θέση μετά από πίεση και μετακίνηση με το α- ριστερό πλήκτρο του ποντικιού στην μπάρα τίτλου του (που είναι μια οριζόντια ράβδος στο άνω τμήμα του παραθύρου με τον τίτλο του αριστερά, π.χ. ). Επίσης, με τα κουμπιά, ή που βρίσκονται στο δεξί μέρος της μπάρας τίτλου μπορεί να γίνει αποσύνδεση (undock) του παραθύρου από το Desktop, σύνδεση (dock) του παραθύρου στο Desktop, ή κλείσιμο του παραθύρου αντίστοιχα.

Το περιβάλλον προγραμματισμού του MATLAB 21 3.2 Ο τρόπος λειτουργίας του MATLAB Εντολές: Το MATLAB λειτουργεί με εντολές, οι οποίες είτε δίνονται απ ευθείας στο Command Window, είτε γράφονται σε κώδικα προγράμματος με τη βοήθεια του Editor. Μεταβλητές και Workspace: Οι μεταβλητές είναι θέσεις στη μνήμη του υπολογιστή, οι οποίες περιέχουν τιμές που μεταβάλλονται με τη βοήθεια εντολών. Οι μεταβλητές βρίσκονται σε μια περιοχή της μνήμης του MATLAB που ονομάζεται Workspace. Current Directory/Folder, Path: Για να μπορεί να εκτελεστεί ένα πρόγραμμα, πρέπει αυτό να βρίσκεται σ ένα φάκελο που λέγεται Τρέχων Φάκελος (Current Folder) (φαίνεται σ ένα ειδικό χώρο κάτω από το μενού, βλ. παρακάτω εικόνα). Π.χ. ο Current Folder μπορεί να είναι C:\Program Files\Matlab\work ή C:\My Documents\Matlab Για καλύτερη οργάνωση, τα προγράμματα που φτιάχνει ο χρήστης μπορούν να αποθηκευτούν και σε διαφορετικούς φακέλους (δηλαδή όχι μόνο στον Current Folder). Τότε, για να μπορούν να εκτελεστούν, πρέπει η διαδρομή αυτών των φακέλων να προστεθεί σε μια ειδική ομάδα που λέγεται Path (και βρίσκεται στο μενού File Set Path). Το MATLAB ε- λέγχει αρχικά τον Current Folder, και μετά ελέγχει το Path με τη σειρά προτεραιότητας όπως φαίνεται στο File Set Path. Η σειρά προτεραιότητας μπορεί να αλλάξει με Move Up ή Move Down (βλ. παρακάτω εικόνα). Συναρτήσεις και Toolboxes: Στο MATLAB υπάρχουν πολλές έτοιμες συναρτήσεις (ουσιαστικά «εντολές» που εμπλουτίζουν τις λειτουργίες του). Οι συναρτήσεις του MATLAB είναι οργανωμένες σε ομάδες, κάθε μια σχετική με μια εξειδικευμένη θεματική περιοχή. Κάθε ομάδα τέτοιων συναρτήσεων ονομάζεται Toolbox (π.χ. Statistics, Signal Processing, Image Processing, Communications, Financial,, όπως φαίνεται στην παρακάτω εικόνα).

22 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Προγράμματα στο MATLAB: Scripts και Functions Τα αρχεία προγραμμάτων στο MATLAB ονομάζονται m-files, καθώς έχουν επέκταση.m. Το MATLAB διακρίνει δύο είδη m-files: Scripts (προγράμματα) και functions (συναρτήσεις). Scripts: Ακολουθίες εντολών. Μοιράζονται το τρέχον workspace, δηλαδή μπορούν να χρησιμοποιήσουν μεταβλητές που ήδη υπάρχουν στο workspace, και οι μεταβλητές που δημιουργούν παραμένουν με τις τιμές τους στο workspace. Functions: Ακολουθίες εντολών, που συνήθως δεν εκτελούνται άμεσα από το περιβάλλον του MATLAB (όπως συνήθως τα scripts) αλλά «καλούνται» με το όνομά τους από άλλα προγράμματα ή το Command Window. Μπορούν να δεχθούν τιμές μεταβλητών ως είσοδο και να εξάγουν νέες τιμές ως έξοδο. Δημιουργούν το δικό τους ανεξάρτητο workspace, που είναι εντελώς απομονωμένο από του υπόλοιπου συστήματος, και «αντιλαμβάνονται» μόνο τις μεταβλητές που εισάγονται ως είσοδοι καθώς και αυτές που δημιουργούνται στο εσωτερικό τους. Έτσι ο κώδικας είναι «καθαρότερος» και τα σφάλματα λιγότερα. Δημιουργία, αποθήκευση και εκτέλεση προγράμματος στο MATLAB Ο κώδικας ενός προγράμματος στο MATLAB γράφεται με τη βοήθεια του ενσωματωμένου Editor. Με τη βοήθεια της επιλογής File του μενού μπορούμε να δημιουργήσουμε ένα νέο αρχείο προγράμματος (File New M-File), να το αποθηκεύσουμε (File Save ή Save As ) ή να ανοίξουμε (File Open ) ένα υπάρχον αρχείο. Προσοχή: Οι εντολές αφορούν κάθε φορά το ενεργό παράθυρο (διακρίνεται από την έγχρωμη μπλε μπάρα τίτλου). Για παράδειγμα, για αποθήκευση του προγράμματος πρέπει να είναι ενεργό το παράθυρο του Editor, και όχι π.χ. του Command Window. Όταν γραφτεί ο κώδικας, το πρόγραμμα εκτελείται («τρέχει») με την επιλογή Run του μενού Debug (συντόμευση πληκτρολογίου: F5). Η αποθήκευση γίνεται τότε αυτόματα, εκτός από την πρώτη φορά, οπότε ζητείται το όνομα του αρχείου του προγράμματος. Το όνομα του αρχείου πρέπει να περιέχει μόνο λατινικά γράμματα (a z, A Z), αριθμητικά ψηφία (0 9) και κάτω παύλα (_, underscore), καθώς και ο πρώτος χαρακτήρας να είναι γράμμα (είναι οι ίδιοι περιορισμοί με αυτούς των ονομάτων των μεταβλητών βλ. και 4.2). Σε αντίθετη περίπτωση, το αρχείο πιθανόν να αποθηκευτεί, αλλά δεν θα μπορεί να χρησιμοποιηθεί σωστά από το MATLAB. Κατά τη συγγραφή του ο κώδικας πρέπει να αποθηκεύεται τακτικά (με τη συντόμευση πληκτρολογίου: Ctrl+S, ή πατώντας στο κατάλληλο εικονίδιο: ). Χρήσιμες είναι επίσης και οι λειτουργίες Copy-Paste (Ctrl+C και Ctrl+V) και Undo (Ctrl+Z).

Το περιβάλλον προγραμματισμού του MATLAB 23 3.3 Χρήσιμες συντομεύσεις πληκτρολογίου Control+N (New): Νέο αρχείο προγράμματος στον editor Control+S (Save): Αποθήκευση προγράμματος Control+A: Επιλογή όλου του τρέχοντος προγράμματος Control+Ι: Εσοχές (indentation) στο επιλεγμένο τμήμα του κώδικα Control+R ή Control+T: Σχολιασμός ή αποσχολιασμός επιλεγμένου τμήματος Control+Break με focus στο Command Window: Διακοπή εκτέλεσης προγράμματος F5 (save and run): Αποθήκευση και εκτέλεση προγράμματος F9 (run selected): Άμεση εκτέλεση των εντολών του επιλεγμένου τμήματος κώδικα F12 (breakpoints): Τοποθέτηση (ή διαγραφή) σημείου διακοπής για debugging F10 (step): Εκτέλεση εντολών γραμμή-γραμμή κατά το debugging F11 (step-in): Είσοδος μέσα στις συναρτήσεις κατά το debugging Shift + F11 (step-out): Έξοδος από τις συναρτήσεις κατά το debugging Shift + F5: Τερματισμός λειτουργίας debugging 3.4 Συνοπτική παρουσίαση εντολών γενικής χρήσης του MATLAB: general Λίστα με τις εντολές γενικής χρήσης του MATLAB εμφανίζεται στο Command Window με την εντολή help general (ή doc general, στο παράθυρο της Βοήθειας).

24 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Ερωτήσεις 3.1 Ποιο παράθυρο της Επιφάνειας Εργασίας (Desktop) του MATLAB πρέπει να ανοιχθεί, ώστε: - να εκτελεστεί απ ευθείας μια εντολή:... - να δοκιμαστεί ο τρόπος λειτουργίας μιας εντολής:... - να γραφτούν πολλές εντολές που να εκτελεστούν αργότερα:... - να αποθηκευτεί σειρά διαδοχικών εντολών στο δίσκο:... - να βρεθεί μια εντολή που δώσατε προηγουμένως:... - να ζητηθεί πλήρη βοήθεια για μια εντολή:... - να γίνει διαχείριση των αρχείων του τρέχοντος καταλόγου εργασίας:... - να δείτε τις τιμές των μεταβλητών:... (Μπορεί να υπάρχει το ίδιο παράθυρο σε περισσότερες από μία απαντήσεις) 3.2 Σε ποιο από τα παράθυρα του Desktop του MATLAB μπορούν να γραφτούν εντολές α) οι οποίες μπορούν να εκτελεστούν απ ευθείας;... β) οι οποίες να συνθέτουν κώδικα προγράμματος;... 3.3 Να περιγραφεί η λειτουργία του Command Window. 3.4 Τι είναι το workspace του MATLAB; Τι περιέχει το αντίστοιχο παράθυρο; 3.5 Να περιγραφεί συνοπτικά ο τρόπος λειτουργίας του MATLAB, και συγκεκριμένα: α) Πού γράφονται οι εντολές και πώς εκτελούνται; β) Πού αποθηκεύονται οι μεταβλητές με τις τιμές τους; γ) Τι είναι το Current Directory (ή Current Folder) και τι το Path, και ποιος ο ρόλος καθενός; 3.6 Τι είναι τα Toolboxes; 3.7 Τι είναι τα scripts και τι οι functions; 3.8 Να γραφτεί ένα πλεονέκτημα των συναρτήσεων (functions) σε σχέση με τα απλά προγράμματα (scripts). 3.9 Ποιοι είναι οι περιορισμοί για ένα όνομα αρχείου με κώδικα προγράμματος σε MATLAB; 3.10 Ποια από τα παρακάτω ονόματα αρχείου με κώδικα MATLAB είναι αποδεκτά: [ ] program1.m Αν όχι, γιατί; [ ] _program.m Αν όχι, γιατί; [ ] 1program.m Αν όχι, γιατί; [ ] 1_program.m Αν όχι, γιατί; [ ] my program.m Αν όχι, γιατί; [ ] my-program.m Αν όχι, γιατί; [ ] my_program.m Αν όχι, γιατί; [ ] my_program.c Αν όχι, γιατί; [ ] προγραμμα.m Αν όχι, γιατί;

4.1 Στοιχεία του κώδικα ενός προγράμματος 4 Βασικά στοιχεία προγραμματισμού Τα στοιχεία που χρησιμοποιούνται κατά τη συγγραφή του κώδικα ενός προγράμματος είναι οι μεταβλητές, οι τελεστές και οι εντολές. Συνοπτικά: Μεταβλητές: Αντιστοιχούν σε θέσεις στη μνήμη του υπολογιστή για προσωρινή αποθήκευση δεδομένων και αποτελεσμάτων. Οι βασικοί τύποι μεταβλητών είναι μεταβλητές χαρακτήρων, αριθμητικές μεταβλητές (ακέραιες και "κινητής υποδιαστολής") και λογικές μεταβλητές: Μεταβλητές χαρακτήρα (character variables): Είναι μεταβλητές στις οποίες αποθηκεύονται γράμματα της αλφαβήτου, αριθμητικά ψηφία και διάφορα σύμβολα (π.χ. 'a', '3', '!'). Σειρές συνεχόμενων χαρακτήρων σχηματίζουν τις συμβολοσειρές (ή αλφαριθμητικές μεταβλητές ή strings), π.χ. 'Hello'. Ακέραιες μεταβλητές (integer variables): Είναι αριθμητικές μεταβλητές στις οποίες αποθηκεύονται ακέραιοι, π.χ. 3, 54, -21, 0. Μεταβλητές κινητής υποδιαστολής (floating point variables): Είναι μεταβλητές στις ο- ποίες αποθηκεύονται αριθμοί με δεκαδικά ψηφία, π.χ. 4.022, -21.77, 0.5, 1.0. Λογικές μεταβλητές: Είναι μεταβλητές στις οποίες αποθηκεύονται οι λογικές τιμές true ή false («αλήθεια» ή «ψεύδος»), και αποδίδονται με 1 ή 0 αντίστοιχα. Τελεστές: Είναι σύμβολα που παριστάνουν πράξεις ή συναρτήσεις με τις οποίες ο υπολογιστής συσχετίζει τις μεταβλητές (π.χ. κάνει αριθμητικές πράξεις με αυτές, τις συγκρίνει κλπ). Οι βασικοί τελεστές είναι: Αριθμητικοί: +, -, *, /, ^ Συγκριτικοί: == (ίσο), ~= (άνισο), >= (μεγαλύτερο ή ίσο), <=, >, < Λογικοί: & (και), (ή), ~ (όχι) Εντολές: Είναι οι οδηγίες προς τον υπολογιστή. Στις εντολές πρέπει να συμπεριλάβουμε και τις συναρτήσεις, που είναι σύνολα εντολών (ή άλλων συναρτήσεων) που συμπεριφέρονται ως μια νέα εντολή, που δέχεται ως είσοδο τιμές μεταβλητών και εξάγει νέες τιμές. Οι συναρτήσεις επεκτείνουν πάρα πολύ τις δυνατότητες προγραμματισμού, και εκτός από τις ενσωματωμένες συναρτήσεις του MATLAB, μπορεί ο προγραμματιστής να δημιουργήσει και τις δικές του. Οι βασικότερες εντολές είναι: Ανάθεση: = π.χ. a = 4; b = 2*a; a = a + 1; Επιλογή: if και switch π.χ. if a~=0, x=b/a; Επανάληψη: for και while π.χ. for i=1:10, sum = sum + i; Βασικές συναρτήσεις εισόδου-εξόδου είναι: Είσοδος (εισαγωγή τιμών από το πληκτρολόγιο): input π.χ. w = input('input your weight'); Έξοδος (εκτύπωση αποτελεσμάτων στην οθόνη): disp και fprintf π.χ. disp(x); fprintf('the weight is %d', x); Στη συνέχεια θα αναπτυχθούν αναλυτικότερα τα περί μεταβλητών, τελεστών και εντολών.

26 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 4.2 Μεταβλητές Στον προγραμματισμό ως «μεταβλητή» εννοείται μια καταχώρηση στη μνήμη του υπολογιστή, που περιέχει το όνομα της μεταβλητής, τον τύπο της και την τιμή της. Ονόματα μεταβλητών Το όνομα μιας μεταβλητής στο MATLAB πρέπει να ξεκινάει από λατινικό γράμμα και μπορεί να περιέχει λατινικά γράμματα (a-z, A-Z), ψηφία (0-9) και την κάτω παύλα (_, underscore). Τα πεζά θεωρούνται διαφορετικά από τα κεφαλαία (το MATLAB είναι "case sensitive"). Το μήκος του ονόματος μπορεί να είναι μέχρι 63 χαρακτήρες (namelengthmax). Επίσης, το όνομα μιας μεταβλητής δεν μπορεί να είναι μια από τις δεσμευμένες λέξεις του MATLAB, που είναι οι: break, case, catch, continue, else, elseif,, for, function, global, if, otherwise, persistent, return, switch, try και while. ** Τέλος, το όνομα μιας μεταβλητής δεν μπορεί να είναι ίδιο με το όνομα του προγράμματος ή της συνάρτησης όπου ορίζεται και χρησιμοποιείται η μεταβλητή. Τύποι μεταβλητών Μεταβλητές χαρακτήρα (character variables) Είναι μεταβλητές στις οποίες αποθηκεύονται χαρακτήρες (γράμματα, ψηφία, σύμβολα). Κάθε μεταβλητή χαρακτήρα καταλαμβάνει 2 bytes (δηλαδή υπάρχουν διαθέσιμοι 2 16 =65536 διαφορετικοί χαρακτήρες), διότι το MATLAB υποστηρίζει το σύνολο χαρακτήρων Unicode. Ακέραιες μεταβλητές (integer variables) Είναι μεταβλητές στις οποίες αποθηκεύονται ακέραιοι αριθμοί. Το MATLAB υποστηρίζει ακεραίους που καταλαμβάνουν 1, 2, 4, ή 8 Bytes μνήμης, σύμφωνα με τον παρακάτω πίνακα: Όνομα και συνάρτηση μετατροπής Είδος ακεραίου Εύρος τιμών int8 integer 8-bit (1 Byte) -2 7 2 7-1 (-128 127) uint8 unsigned integer 8-bit 0 2 8-1 (0 255) int16 integer 16-bit (2 Bytes) -2 15 2 15-1 (-32768 32767) uint16 unsigned integer 16-bit 0 2 16-1 (0 65535) int32 integer 32-bit (4 Bytes) -2 31 2 31-1 (-2147483648 2147483647) uint32 unsigned integer 32-bit 0 2 32-1 (0 4294967295) int64 integer 64-bit (8 Bytes) -2 63 2 63-1 (-9223372036854775808 9223372036854775807) uint64 unsigned integer 64-bit 0 2 64-1 (0 18446744073709551615) Μεταβλητές κινητής υποδιαστολής (floating point variables) Είναι μεταβλητές στις οποίες αποθηκεύονται αριθμοί με δεκαδικά ψηφία. Χωρίζονται σε μονής ακρίβειας (single, 4 Bytes) και διπλής ακρίβειας (double, 8 Bytes): Όνομα και συνάρτηση μετατροπής single double Είδος κινητής υποδιαστολής Μέγεθος στη μνήμη Ακρίβεια Single-precision 4 Bytes = 32 bits Ακρίβεια 7 δεκαδικών ψηφίων Double-precision 8 Bytes = 64 bits Ακρίβεια 15 δεκαδικών ψηφίων Εύρος τιμών Προσεγγιστικό εύρος τιμών με δυνάμεις του 10 Κατανομή bits στη μνήμη -(1-2 -24 ) 2 128-2 -126 και 2-126 (1-2 -24 ) 2 128 περίπου -3.40 10 38-1.18 10-38 και 1.18 10-38 3.40 10 38 sign exponent (8 bits) fraction (23 bits) 32 31 24 23 1 -(1-2 -53 ) 2 1024-2 -1022 και 2-1022 (1-2 -53 ) 2 1024 περίπου -1.80 10 308-2.23 10-308 και 2.23 10-308 1.80 10 308 sign exponent (11 bits) fraction (52 bits) 64 63 53 52 1 Λογικές μεταβλητές (logical variables) Είναι μεταβλητές στις οποίες αποθηκεύονται οι λογικές τιμές true ή false («αλήθεια» ή «ψεύδος»), που αντιστοιχούν στις τιμές 1 ή 0 αντίστοιχα με μέγεθος 1 byte. ** Επίσης, καλό είναι μια μεταβλητή να μην έχει το όνομα μιας συνάρτησης, γιατί τότε αυτή η συνάρτηση δεν θα μπορεί να χρησιμοποιηθεί μέχρι η μεταβλητή να καθαρίσει με clear από τη μνήμη. Ο σχετικός έλεγχος μπορεί να γίνει με την εντολή which <όνομα> ή με help <όνομα> (π.χ.which float ή help float), οπότε η απάντηση "not found" δηλώνει ότι το <όνομα> δεν χρησιμοποιείται για όνομα συνάρτησης.

Βασικά στοιχεία προγραμματισμού 27 Μετατροπή μεταβλητών σε άλλους τύπους Αν δεν οριστούν διαφορετικά, το MATLAB αποθηκεύει στη μνήμη του υπολογιστή όλες τις αριθμητικές μεταβλητές ως double. Στα απλά προγράμματα δεν χρειάζεται μετατροπή σε άλλο τύπο, παρά μόνο (α) σε περιπτώσεις υπερβολικής κατανάλωσης της διαθέσιμης μνήμης, ή (β) σε περιπτώσεις απαίτησης συγκεκριμένων τύπων μεταβλητών στα ορίσματα εισόδου ή εξόδου μιας συνάρτησης. Η μετατροπή μιας μεταβλητής σε άλλο τύπο γίνεται με τις συναρτήσεις μετατροπής (βλέπε προηγούμενο πίνακα). Παραδείγματα: x = single(x); Α = int8(200); B = int16(a); Ο έλεγχος του τύπου μιας μεταβλητής μπορεί να γίνει με την εντολή: whos μεταβλητή. Στις περιπτώσεις μεταβλητών άλλου τύπου εκτός από double, χρειάζεται προσοχή στα εξής: Πράξη αριθμού με λογική μεταβλητή ή αριθμού με χαρακτήρα δίνει double. Πράξη μεταξύ single και double δίνει single. Οι ακέραιοι μπορούν να κάνουν πράξεις μόνο με ακέραιο ίδιου τύπου ή με double, και τότε δίνουν ακέραιο ίδιου τύπου. Π.χ. η πράξη x=int8(15)+3.7 δίνει αποτέλεσμα x=19, όπου η x είναι τύπου int8. Υπέρβαση ορίων τύπου μεταβλητής Σε περίπτωση προσπάθειας υπέρβασης της ελάχιστης ή της μέγιστης επιτρεπόμενης τιμής του τύπου μιας αριθμητικής μεταβλητής, τότε η μεταβλητή παίρνει ακριβώς αυτήν την ελάχιστη ή μέγιστη τιμή. Παράδειγμα: Οι ακέραιες μεταβλητές uint8 (unsigned integer 8-bits) παίρνουν τιμές από 0 έως 255. Aν a = uint8(200) (δηλαδή η a είναι ίση με 200, καταλαμβάνοντας 8-bits) τότε η εντολή a = a + 60 δίνει στο a την τιμή 255 (τη μέγιστη τιμή του uint8), ενώ η a = a 300 δίνει στο a την τιμή 0 (την ελάχιστη τιμή του uint8). Η ελάχιστη και μέγιστη θετική τιμή κινητής υποδιαστολής βρίσκεται με τις συναρτήσεις: realmin('single'), realmin('double') Η ελάχιστη και μέγιστη τιμή των ακεραίων βρίσκεται με τις συναρτήσεις: intmin('int8'), intmin('int16'), intmin('int32'), intmin('int64') intmax('int8'), intmax('int16'), intmax('int32'), intmax('int64') intmin('uint8'), intmin('uint16'), intmin('uint32'), intmin('uint64') intmax('uint8'), intmax('uint16'), intmax('uint32'), intmax('uint64') Ειδικές μεταβλητές Το MATLAB διαθέτει κάποιες μεταβλητές που έχουν ειδικές προκαθορισμένες τιμές: ans προσωρινή μεταβλητή με το αποτέλεσμα της πιο πρόσφατης πράξης, αν δεν έχει ανατεθεί σε άλλη συγκεκριμένη μεταβλητή. Inf άπειρο (Infinity): το αποτέλεσμα της διαίρεσης 1/0. NaN αόριστο (Not a Number): το αποτέλεσμα της διαίρεσης 0/0. pi 3. 14159265358979 (το π με ακρίβεια 14 δεκαδικών ψηφίων). i, j η φανταστική μονάδα ( 1 ), για χρήση σε μιγαδικούς αριθμούς. realmax ο μεγαλύτερος θετικός αριθμός κινητής υποδιαστολής. realmin ο μικρότερος θετικός αριθμός κινητής υποδιαστολής. eps η ακρίβεια των δεκαδικών ψηφίων των αριθμών κινητής υποδιαστολής. Στις ειδικές αυτές μεταβλητές μπορούν να ανατεθούν και άλλες τιμές μέσα σε ένα πρόγραμμα (για παράδειγμα οι i, j χρησιμοποιούνται συνήθως ως δείκτες στην εντολή for). Στην περίπτωση αυτή η εντολή clear τις επαναφέρει στις αρχικές ειδικές τιμές τους.

28 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 4.3 Τελεστές και Πράξεις Οι τελεστές είναι σύμβολα που παριστάνουν πράξεις ή συναρτήσεις. Η έννοια της πράξης έχει εδώ γενικότερη έννοια, και σημαίνει την επεξεργασία των τιμών κάποιων μεταβλητών σύμφωνα με ορισμένους κανόνες και την εξαγωγή ενός αποτελέσματος. Αριθμητικές πράξεις / Αριθμητικοί τελεστές Οι αριθμητικές πράξεις λειτουργούν ως συναρτήσεις, με είσοδο δύο αριθμητικές μεταβλητές και έξοδο μια αριθμητική τιμή. Οι αριθμητικές πράξεις με τους τελεστές τους είναι: Αριθμητική πράξη Τελεστής Αποτέλεσμα Παράδειγμα Αποτέλεσμα Πρόσθεση + Αριθμός 1+2 3 Αφαίρεση - Αριθμός 1-2 -1 Πολλαπλασιασμός * Αριθμός 3*4 12 Διαίρεση / Αριθμός 3/4 0.75 Ύψωση σε δύναμη ^ Αριθμός 3^4 81 Υπάρχουν μερικές εξαιρέσεις απ τα γενικώς προφανή αποτελέσματα των αριθμητικών πράξεων: - Η διαίρεση ακεραίων μεταβλητών έχει ως αποτέλεσμα πάντα ακέραιο (με στρογγυλοποίηση στον πλησιέστερο). Π.χ. η πράξη int8(5)/int8(6) έχει ως αποτέλεσμα 1. Άλλα παραδείγματα: int8(10)/int8(3) 3, int8(5)/int8(2) 3, int8(1)/int8(3) 0. - Για την εύρεση των ριζών των αρνητικών αριθμών πρέπει να χρησιμοποιούνται οι συναρτήσεις sqrt (τετραγωνική ρίζα) και nthroot (νιοστή ρίζα), αντί για ύψωση σε δύναμη. Π.χ. sqrt(-4) και nthroot(-8,3), αντί για (-4)^0.5 και (-8)^(1/3). Η προτεραιότητα των αριθμητικών πράξεων είναι (από τη μεγαλύτερη προς τη μικρότερη): ^ : Ύψωση σε δύναμη. - : Αλλαγή προσήμου *, / : Πολλαπλασιασμός και διαίρεση (ίδια προτεραιότητα). +, - : Πρόσθεση και αφαίρεση (ίδια προτεραιότητα). Για αλλαγή στη σειρά προτεραιότητας, χρησιμοποιούμε παρενθέσεις ( ). Σε τελεστές με ίδια προτεραιότητα, οι πράξεις γίνονται από αριστερά προς τα δεξιά. Π.χ.: 2*3^2= 18, (2*3)^2=36, -3^2=-9, (-3)^2=9, 2^-2+1=1.25, 2^-(2+1)= 0.125 Συγκριτικές πράξεις / Συγκριτικοί (σχεσιακοί) τελεστές Οι συγκριτικές πράξεις λειτουργούν ως συναρτήσεις, με είσοδο δύο αριθμητικές μεταβλητές και έξοδο μια λογική τιμή (true ή false, 1 ή 0), ανάλογα με το αποτέλεσμα της σύγκρισης. Οι συγκριτικές πράξεις με τους τελεστές τους είναι: Συγκριτική πράξη Τελεστής Αποτέλεσμα Παράδειγμα Αποτέλεσμα Σύγκριση ισότητας == true ή false 5==9 0 Σύγκριση ανισότητας ~= true ή false 5~=9 1 Σύγκριση για μεγαλύτερο > true ή false 5>9 0 Σύγκριση για μικρότερο < true ή false 5<9 1 Σύγκριση για μεγαλύτερο ή ίσο >= true ή false 5>=9 0 Σύγκριση για μικρότερο ή ίσο <= true ή false 5<=9 1 Οι συγκριτικές πράξεις διαφέρουν από τις αριθμητικές μόνο ως προς είδος του αποτελέσματος κατά τα άλλα, γίνονται παρόμοια. Π.χ. Μετά την εντολή a = 1+2, η μεταβλητή a έχει την αριθμητική τιμή 3. Παρομοίως, μετά την εντολή a = 1>2, η μεταβλητή a έχει τη λογική τιμή 0 (ή false), ως αποτέλεσμα της συγκριτικής πράξης 1>2. Σε συνδυασμό τελεστών σύγκρισης, η προτεραιότητα είναι από αριστερά προς τα δεξιά, εκτός αν χρησιμοποιηθούν παρενθέσεις ( ).

Βασικά στοιχεία προγραμματισμού 29 Λογικές πράξεις / Λογικοί τελεστές Οι λογικές πράξεις λειτουργούν ως συναρτήσεις, με είσοδο λογικές μεταβλητές και έξοδο μια λογική τιμή (true ή false, 1 ή 0), ανάλογα με το αποτέλεσμα της λογικής πράξης. Οι λογικές πράξεις είναι οι εξής: Πράξη and (τελεστές: & ή &&) Το αποτέλεσμα είναι 1 αν και οι δύο είσοδοι είναι 1, και 0 σε κάθε άλλη περίπτωση. Η διαφορά των δύο τελεστών είναι ότι με τον && (που στο MATLAB λέγεται short-circuit AND), αν η 1η είσοδος είναι ψευδής, δεν εξετάζεται η 2η (αφού δεν είναι α- ναγκαίο). Έτσι, επιταχύνεται η ροή του προγράμματος. Πίνακας αληθείας and A B A & B 0 0 0 0 1 0 1 0 0 1 1 1 Πράξη or (τελεστές: ή ) Το αποτέλεσμα είναι 1 αν μία τουλάχιστον είσοδος είναι 0, και 0 αν και οι δύο είσοδοι είναι 0. Η διαφορά των δύο τελεστών είναι ότι με τον (που στο MATLAB λέγεται short-circuit OR), αν η 1η είσοδος είναι αληθής, δεν εξετάζεται η 2η (αφού δεν είναι αναγκαίο). Έτσι, επιταχύνεται η ροή του προγράμματος. Πίνακας αληθείας or A B A B 0 0 0 0 1 1 1 0 1 1 1 1 Πράξη not (τελεστής: ~) Η πράξη NOT έχει μόνο μία είσοδο, και ως έξοδο το α- ντίθετό της (δηλαδή η NOT αντιστρέφει την είσοδό της): Το αποτέλεσμα είναι 1 αν η είσοδος είναι 0 και αντιστρόφως. Πίνακας αληθείας not A ~A 0 1 1 0 Προτεραιότητα λογικών πράξεων 1. not (~) 2. and (& ή &&) 3. or ( ή ) Για αλλαγή στη σειρά προτεραιότητας, χρησιμοποιούμε παρενθέσεις ( ). Σε τελεστές με ίδια προτεραιότητα, οι πράξεις γίνονται από αριστερά προς τα δεξιά. Σημειώσεις: 1. Εκτός από το short-circuit, μια ακόμη διαφορά των τελεστών & και από τους && και είναι ότι οι πρώτοι (& και ) εφαρμόζονται απ ευθείας και σε πίνακες (ίδιων διαστάσεων), εξετάζοντάς τους στοιχείο-προς-στοιχείο και παράγοντας ένα νέο πίνακα (ίδιων διαστάσεων) με τα λογικά αποτελέσματα στις αντίστοιχες θέσεις. 2. Η λογική πράξη XOR (exclusive OR) μπορεί να εφαρμοστεί με τη συνάρτηση xor (π.χ. xor(a,b)). 4.4 Συνοπτική παρουσίαση τελεστών και ειδικών χαρακτήρων του MATLAB: ops Λίστα με τους τελεστές και τους ειδκούς χαρακτήρες του MATLAB εμφανίζεται στο Command Window με την εντολή help ops (ή doc ops, στο παράθυρο της Βοήθειας).

30 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Ερωτήσεις 4.1 Ποια είναι τα τρία βασικά στοιχεία που χρησιμοποιούνται κατά τη συγγραφή ενός προγράμματος; 4.2 Να αναφέρετε τα βασικά είδη μεταβλητών με μερικά παραδείγματα από κάθε είδος. 4.3 Να αναφερθούν τα βασικά είδη των τελεστών με παραδείγματα από κάθε είδος. 4.4 Να αναφερθούν τις 3 βασικές εντολές στον προγραμματισμό καθώς και την αντιστοιχία τους με τα βασικά στοιχεία ενός αλγορίθμου. 4.5 Ποιοι είναι οι περιορισμοί για το όνομα μιας μεταβλητής στο MATLAB; 4.6 Να σημειωθούν ποια από τα παρακάτω ονόματα μεταβλητών στο MATLAB είναι σωστά [Σ] και ποια λανθασμένα [Λ]: [ ] hello [ ] x1 [ ] x_1 [ ] 1_x [ ] for [ ] MyV [ ] iloveu [ ] abc [ ] if [ ] _y2 [ ] 12a [ ] b1c 4.7 Πόσο χώρο στη μνήμη του υπολογιστή καταλαμβάνει μια μεταβλητή χαρακτήρα στο MATLAB, και κατά συνέπεια πόσες διαφορετικές μεταβλητές χαρακτήρα είναι διαθέσιμες; 4.8 Να σημειωθούν οι σωστές [Σ] και οι λανθασμένες [Λ] προτάσεις. Στις μεταβλητές χαρακτήρα στο MATLAB: [ ] μπορούν να αποθηκευτούν μόνο γράμματα (πεζά και κεφαλαία) [ ] μπορούν να αποθηκευτούν γράμματα και σύμβολα αλλά όχι αριθμητικά ψηφία [ ] μπορούν να αποθηκευτούν μόνο λατινικά γράμματα, ψηφία καθώς και το σύμβολο της κάτω παύλας ( _, underscore) [ ] μπορούν να αποθηκευτούν μέχρι 256 διαφορετικοί χαρακτήρες 4.9 Ποια είναι τα είδη των ακέραιων μεταβλητών στο MATLAB; Να γραφτεί (α) ο χώρος στη μνήμη που καταλαμβάνει κάθε είδος, (β) το πλήθος των διαφορετικών τιμών ακεραίων που μπορούν να αποθηκευτούν σε κάθε είδος και (γ) η μέγιστη και η ελάχιστη τιμή κάθε είδους. 4.10 Ποια είναι τα είδη των μεταβλητών κινητής υποδιαστολής στο MATLAB; Να γραφτεί (α) ο χώρος στη μνήμη που καταλαμβάνει κάθε είδος, (β) η ακρίβεια των δεκαδικών ψηφίων κάθε είδους και (γ) κατά προσέγγιση η μέγιστη και η ελάχιστη τιμή κάθε είδους ως δύναμη του 10. 4.11 Πόσο χώρο στη μνήμη του υπολογιστή καταλαμβάνει μια λογική μεταβλητή; Ασκήσεις 4.12 Να γραφούν οι τιμές των παρακάτω μεταβλητών μετά την εκτέλεση των παρακάτω α- ριθμητικών πράξεων: α) x = 16^1/2 β) y = 16^0.5 γ) z = 10/2*5 δ) a = 10+2*5 4.13 Να γραφούν οι τιμές των παρακάτω μεταβλητών μετά την εκτέλεση των παρακάτω α- ριθμητικών πράξεων: α) x = int8(4)/int8(2); β) y = int8(5)/int8(2); γ) z = int8(5)/int8(3); δ) r = int8(5.7)/int8(4);

Βασικά στοιχεία προγραμματισμού 31 ε) s = int8(0.9)/int8(2); στ) t = int8(0.3)/int8(3); 4.14 Να γραφούν οι τιμές των μεταβλητών a, b, c, d, x, y μετά την εκτέλεση της παρακάτω συνεχόμενης σειράς εντολών: a = 100; x = a/2; b = int8(a); c = b + 300; d = a + 300; a = b 300; y = a/2; 4.15 Να γραφούν οι τιμές των παρακάτω μεταβλητών (a, b, x, y, z, i, pi, ans,) μετά την εκτέλεση των εντολών: α) a = 100/0; β) b = 0/0; γ) x = realmax + 1; δ) y = -realmin realmax; δ) z = -realmax 1; ε) i = 1; clear i; στ) pi = 5; clear pi; ζ) 3+2; ans = ans + 1; 4.16 Να γραφούν οι τιμές των παρακάτω λογικών μεταβλητών μετά την εκτέλεση των παρακάτω συγκριτικών πράξεων: α) x = 4<5 β) y = 4==5 γ) z = 4>=5 δ) r = 4<=5 ε) s = 4>5 στ) t = 4~=5 4.17 Να γραφούν οι τιμές των παρακάτω λογικών μεταβλητών μετά την εκτέλεση των παρακάτω λογικών πράξεων: α) x = ~ (1 & 0) β) y = (~ 1) & 0 γ) z = ~ 1 & 0 δ) r = (1 0) & 0 ε) s = 1 (0 & 0) στ) t = 1 0 & 0 4.18 Να γραφούν οι τιμές των παρακάτω λογικών μεταβλητών μετά την εκτέλεση των παρακάτω συγκριτικών και λογικών πράξεων: α) x = 5>3 & 1<2 β) y = 1==2 3>=1 γ) z = 3~=4 2==3 δ) r = 3<=4 & ~(1~=2) ε) s = ~(4>1) στ) a = 5; t = a>0 & a<3 a>4 & a<10 ζ) u = 9==int8(9.1) η) v = 9.1==int8(9.1) & 9.1==9.1 θ) w = int8(9.9)==10 9.1==9.1 4.19 Παράδειγμα: Έστω x ο βαθμός ενός φοιτητή. Επιθυμούμε η λογική μεταβλητή r να λάβει τιμή true αν ο βαθμός είναι μικρότερος του 5, και false στην αντίθετη περίπτωση. Απάντηση: r = x<5

32 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Σύμφωνα με το παραπάνω απλό παράδειγμα, να αποδοθεί η τιμή true σε μια λογική μεταβλητή της επιλογής σας, α) αν ο βαθμός x του φοιτητή είναι άριστα (δηλαδή τουλάχιστον ίσος με 8.5). β) αν η τιμή v μιας εργαστηριακής εξέτασης ενός ασθενούς είναι τουλάχιστον ίση με 2.5 και μικρότερη του 3.0. γ) αν η τιμή ind ενός κλινικού εργαστηριακού δείκτη είναι εντός της περιοχής τιμών 4 και 17 (ελάχιστη και μέγιστη επιτρεπόμενη τιμή αντίστοιχα). δ) αν η τιμή ind του ανωτέρω εργαστηριακού δείκτη είναι εκτός της περιοχής τιμών 4 και 17. ε) αν η τιμή ind του δείκτη είναι θετική και εκτός της περιοχής [4, 17], με μέγιστη τιμή το 100. 4.20 Να γραφούν οι μεταβλητές που υπάρχουν στο workspace του MATLAB μετά την εκτέλεση των παρακάτω εντολών στις δύο περιπτώσεις (α) και (β). Επίσης να γραφτούν τι τύπου είναι οι μεταβλητές αυτές και ποιες είναι οι τιμές τους. (α) clear; x = 5; y = int8(x) + 2; z = int8(x) + 200; x + 3; (β) clear; pi = 7; x = pi + 3; clear; x = pi + 3; Σημείωση: η εντολή clear καθαρίζει τη μνήμη από τις μεταβλητές.

5 Βασικές εντολές 5.1 Γενικά Διαχωρισμός εντολών Οι εντολές ενός προγράμματος στο MATLAB χωρίζονται με έναν από τους εξής τρόπους: Με ελληνικό ερωτηματικό «;» Με κόμμα «,» Με αλλαγή γραμμής (δηλαδή πατώντας Enter στο πληκτρολόγιο). Οι παραπάνω τρόποι είναι λειτουργικά ισοδύναμοι. Στην περίπτωση που απουσιάζει το ελληνικό ερωτηματικό «;», τότε αν τεθεί ή αλλάξει η τιμή κάποιας μεταβλητής γίνεται ταυτόχρονα και απεικόνισή της στην οθόνη (δηλαδή στο Command Window). Αυτή η λειτουργία είναι πολύ χρήσιμη για τον εύκολο και γρήγορο έλεγχο τιμών και αποτελεσμάτων, καθώς και για ανεύρεση σφαλμάτων κατά τη διαδικασία της αποσφαλμάτωσης (debugging). Παραδείγματα x = 4 x = y = -3.1; Αποτελέσματα 4 a = x + 1, b = 2; a = c = a + b c = 5 7 Συνέχιση εντολής στην επόμενη σειρά Αν στο τέλος μιας γραμμής γραφτούν 3 τελείες «...», τότε η εντολή συνεχίζεται στην επόμενη γραμμή. Παράδειγμα: y = a*x^4 + b*x^3*y + c*x^2*y^2 +... d*x*y^3 + e*y^4 + f; Εσοχές (indent) Οι εντολές που είναι «εσωτερικές» μιας εντολής διακλάδωσης της ροής του προγράμματος ή ενός επαναληπτικού βρόχου συνιστάται να τοποθετούνται με εσοχή 2-4 χαρακτήρων (με χρήση του πλήκτρου κενού διαστήματος (space) ή με χρήση του πλήκτρου TAB στο πληκτρολόγιο). Αν και αυτό δεν είναι τυπικά υποχρεωτικό, είναι σχεδόν απαραίτητο για τον εύκολο οπτικό έλεγχο της λειτουργίας του κώδικα του προγράμματος. Παράδειγμα: if a~=0 x = b/a; disp(x); Σχόλια Συνήθως σε κάθε πρόγραμμα ο προγραμματιστής προσθέτει σχόλια, δηλαδή κείμενο το οποίο δεν λαμβάνεται υπ όψιν από τον υπολογιστή και προστίθεται μόνο για καλύτερη κατανόηση του προγράμματος από τον προγραμματιστή. Στο MATLAB οτιδήποτε βρίσκεται μετά από το σύμβολο «%» στην ίδια γραμμή του κώδικα του προγράμματος, δεν λαμβάνεται υπ όψιν κατά την εκτέλεση του προγράμματος. Παράδειγμα: % Edo dinontai ta stoixeia tou asthenous w = input('input patient s weight'); % Eisagogi barous asthenous h = input('input patient s height'); % Eisagogi ipsous asthenous

34 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 5.2 Εντολή ανάθεσης Για την ανάθεση μιας τιμής σε μια μεταβλητή χρησιμοποιείται ως τελεστής το σύμβολο της ισότητας (=), π.χ. x = 4. Εδώ, το σύμβολο της ισότητας δεν έχει καθόλου την έννοια που έχει στα μαθηματικά, αλλά σημαίνει ότι σε μια θέση μνήμης του υπολογιστή (που σχετίζεται με ένα όνομα μεταβλητής, π.χ. το x), αποθηκεύεται μια συγκεκριμένη τιμή (π.χ. το 4). Σε μια μεταβλητή μπορούν να ανατεθούν (α) τιμές αριθμών, (β) χαρακτήρες (μέσα σε 'μονά' εισαγωγικά), (γ) αποτελέσματα παραστάσεων. Οι παραστάσεις περιέχουν πράξεις με αριθμούς, μεταβλητές ή συναρτήσεις. Ακόμη, μια παράσταση μπορεί να περιέχει και την ίδια τη μεταβλητή στην οποία πρόκειται να γίνει η ανάθεση. Τότε, οι πράξεις γίνονται με την αρχική τιμή της μεταβλητής, και μετά γίνεται αντικατάσταση της τιμής της μεταβλητής με το αποτέλεσμα της παράστασης. Παραδείγματα: α) Ανάθεση αριθμού: μεταβλητή = αριθμός Π.χ.: x = 4 β) Ανάθεση χαρακτήρα: μεταβλητή = 'χαρακτήρας' Π.χ.: c = 'A' γ) Ανάθεση αποτελέσματος πράξεων: μεταβλητή = παράσταση με πράξεις Π.χ.: y = -2*x + 4 δ) Ανάθεση αποτελέσματος πράξεων με αντικατάσταση της τιμής της μεταβλητής: Π.χ.: x = 2*x Στην τελευταία περίπτωση έχουμε αλλαγή της τιμής μιας μεταβλητής, χρησιμοποιώντας μια παράσταση στην οποία περιέχεται και η ίδια η μεταβλητή. Αυτό σημαίνει ότι στο δεξί μέρος του συμβόλου «=» γίνονται οι πράξεις με την αρχική τιμή της μεταβλητής, και στη συνέχεια το αποτέλεσμα αποθηκεύεται στην ίδια μεταβλητή, που αποκτά τώρα τη νέα τιμή. Η παλαιά τιμή δεν μπορεί να ανακτηθεί, καθώς η νέα τιμή εγγράφεται στην ίδια θέση μνήμης. Παρατήρηση: Η περίπτωση (δ) είναι κατάλληλη για να γίνει κατανοητή η διαφορά μεταξύ του συμβόλου «=» στα μαθηματικά (σύμβολο της ισότητας, που δηλώνει ότι δύο ποσότητες είναι ίσες) με το σύμβολο «=» στον προγραμματισμό (που είναι το σύμβολο της εντολής της ανάθεσης, που δηλώνει ότι σε μια θέση μνήμης, που συμβολίζεται με το όνομα της μεταβλητής στο αριστερό μέρος, αποθηκεύεται η τιμή της παράστασης στο δεξί μέρος). Σημείωση: Αν μια εντολή ανάθεσης λήγει με κόμμα (,) ή με αλλαγή γραμμής ( Enter), τότε γίνεται ταυτόχρονα και απεικόνιση του αποτελέσματος στην οθόνη (δηλαδή στο Command Window). Αν η εντολή ανάθεσης λήγει με ελληνικό ερωτηματικό (;), τότε το αποτέλεσμα δεν εμφανίζεται. Αυτό πρόκειται για ένα ιδιαίτερο χαρακτηριστικό του MATLAB. Παραδείγματα % Ανάθεση αριθμών x = -3.1; t = 12; y = 4 % Ανάθεση χαρακτήρων char1 = 'A', char2 = '!'; char3 = 'h'; % Ανάθεση παράστασης z = x + 2*y 3 % Ανάθεση παράστασης με αντικατάσταση z = z + 1 Αποτελέσματα y = 4 char1 = A z = -5.2 z = -4.2

Βασικές εντολές 35 5.3 Εντολές μορφοποίησης του Command Window Ακολουθούν μερικές εντολές που αφορούν στην εμφάνιση του Command Window: clc Καθαρισμός του Command Window. format 1ο είδος σύνταξης: με παράμετρο loose ή compact format loose format compact Οι εκτυπώσεις στο Command Window αφήνουν (loose) ή δεν αφήνουν (compact) κενές γραμμές ανάμεσά τους. Παράδειγμα format loose x = 5 Αποτέλεσμα x = 5 format compact x = 5 x = 5 2ο είδος σύνταξης: με παράμετρο long ή short format long Εμφάνιση αριθμών κινητής υποδιαστολής στο Command Window με το πλήρες πλήθος δεκαδικών ψηφίων (15 δεκαδικά ψηφία για μεταβλητές τύπου double και 7 για single). format short Εμφάνιση αριθμών κινητής υποδιαστολής στο Command Window με 4 δεκαδικά ψηφία. * Παράδειγμα format long x = pi y = single(x) Αποτέλεσμα x = y = 3.141592653589793 3.1415927 format short x = pi x = 3.1416 Προσοχή: Με την εντολή αυτή αλλάζει μόνο το πλήθος των δεκαδικών ψηφίων που εμφανίζονται, και δεν επηρεάζονται καθόλου οι τιμές των μεταβλητών. * Η εντολή format short/long συνδυάζεται και με τις παραμέτρους g ή e, με αποτέλεσμα απεικόνιση χωρίς τα μη σημαντικά μηδενικά ψηφία (π.χ. η format short g δίνει 1.3 αντί για 1.3000) ή απεικόνιση σε εκθετική μορφή (π.χ. η format short e δίνει ως απεικόνιση 1.25e-002 αντί για 0.0125, δηλαδή ένα ψηφίο αριστερά της υποδιαστολής και μετά ένας αριθμός που είναι ο εκθέτης του 10).

36 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 5.4 Εντολές μεταβλητών Ακολουθούν παραδείγματα εντολών για χειρισμό μεταβλητών (βλ. και 15.4): clear <μεταβλητή> clear all Καθαρισμός μιας μεταβλητής ή όλων (all) των μεταβλητών απ τη μνήμη. who και whos Εμφάνιση των μεταβλητών του workspace, με πληροφορίες (whos) ή χωρίς (who). Σημείωση: Ο τύπος και το είδος μιας μεταβλητής μπορεί να ελεγχθεί πιο ειδικά και με τις συναρτήσεις ischar, isnumeric, isinteger, isfloat, isfinite, isinf, isnan, isvector, isscalar, class. Στις εντολές is*, το αποτέλεσμα είναι true ή false (λογικό 1 ή 0). rem <υπόλοιπο> = rem(<διαιρετέος>, <διαιρέτης>) Υπόλοιπο ακέραιης διαίρεσης. Παράδειγμα r = rem(45, 2) r = Αποτέλεσμα Η συνάρτηση rem είναι χρήσιμη για τον έλεγχο του εάν ένας αριθμός είναι άρτιος ή περιττός, διότι rem(άρτιος,2)=0 και rem(περιττός,2)=1. 1 round <στρογγυλοποιημένη_μεταβλητή> = round(<μεταβλητή>) Στρογγυλοποίηση στον πλησιέστερο ακέραιο (το 0.5 στρογγυλοποιείται προς τα «πάνω», δηλαδή προς τον αμέσως μεγαλύτερο ακέραιο κατ απόλυτη τιμή). Παράδειγμα y = round(-3.5) y = Αποτέλεσμα -4 Στρογγυλοποίηση γίνεται και με τις συναρτήσεις fix, floor και ceil, με τη διαφορά ότι η στρογγυλοποίηση γίνεται προς το 0, προς το ή προς το + αντίστοιχα. Η fix μπορεί να χρησιμοποιηθεί σε συνδυασμό με τη rem για να βρεθούν το πηλίκο και το υπόλοιπο διαίρεσης ακεραίων. q = fix(17/5) q = r = rem(17,5) r = 3 2 rand <μεταβλητή> = rand Παραγωγή ενός «τυχαίου» * αριθμού από 0 έως 1. Παράδειγμα x = rand x = Αποτέλεσμα 0.8147 * Οι αριθμοί που παράγονται από τη rand λέγονται ψευδοτυχαίοι, καθώς δημιουργούνται με χρήση αλγορίθμου. Οι αλγόριθμοι που χρησιμοποιεί το MATLAB παράγουν κάθε φορά έναν από 2 32 αριθμούς, που εμφανίζονται με ίδια σειρά σε κάθε εκκίνηση του MATLAB (βλ. επίσης 9.12 και 15.4).

Βασικές εντολές 37 5.5 Εντολές εισόδου δεδομένων από τo πληκτρολόγιο Για είσοδο δεδομένων (αριθμών ή χαρακτήρων) από το πληκτρολόγιο χρησιμοποιείται η εντολή input: Σύνταξη της εντολής input: <μεταβλητή> = input('μήνυμα κειμένου') Εισαγωγή αριθμού από το πληκτρολόγιο. Ο αριθμός που εισάγεται αποθηκεύεται στη μεταβλητή. Το 'μήνυμα κειμένου' είναι απλά για διευκόλυνση του χρήστη (όπου μπορεί να περιέχεται και ο ειδικός χαρακτήρας αλλαγής γραμμής \n). Π.χ. x = input('give me a number:'); <μεταβλητή> = input('μήνυμα κειμένου', 's') Εισαγωγή σειράς χαρακτήρων από το πληκτρολόγιο (απαιτείται η παράμετρος 's'). * Η σειρά χαρακτήρων που εισάγεται αποθηκεύεται στη μεταβλητή. Ως σειρά χαρακτήρων (συμβολοσειρά, string) εννοείται σειρά γραμμάτων, συμβόλων ή αριθμητικών ψηφίων (τα τελευταία αντιμετωπίζονται ως σύμβολα, δηλαδή χωρίς την αριθμητική τους αξία). Π.χ. Name = input('give me your name:','s'); Προσοχή: Μια μεταβλητή πρέπει να εισάγεται ως αριθμητική μόνο όταν έχει νόημα ο ποσοτικός χαρακτήρας της (δηλαδή όταν μπορεί να υφίσταται ποσοτικές συγκρίσεις τύπου «μεγαλύτερο» ή «μικρότερο» ή όταν έχουν νόημα οι συνήθεις αριθμητικές πράξεις με αυτήν). Σε αντίθετη περίπτωση, η μεταβλητή πρέπει να αντιμετωπίζεται ως χαρακτήρας ή ως σειρά χαρακτήρων. Για παράδειγμα, ένας αριθμός τηλεφώνου πρέπει να αντιμετωπίζεται ως σειρά χαρακτήρων (και να εισάγεται με παράμετρο 's'). Παραδείγματα x = input('what is your age? '); Αποτελέσματα What is your age? (και αναμονή για εισαγωγή αριθμού, π.χ.:) What is your age? 18 (και μετά Enter) N = input('what is your name? ','s'); What is your name? (και αναμονή για εισαγωγή συμβολοσειράς, π.χ.) What is your name? John (και Enter) * Αλφαριθμητικοί χαρακτήρες μπορούν να εισαχθούν και με την πρώτο τρόπο σύνταξης της input (χωρίς 's'), αλλά τότε οι χαρακτήρες πρέπει να τοποθετηθούν μέσα σε μονά εισαγωγικά (' '). Π.χ.: N = input('what is your name? ','s'); >> What is your name? 'John' (και Enter)

38 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 5.6 Εντολές εξόδου αποτελεσμάτων στην οθόνη (στο Command Window) Η έξοδος των αποτελεσμάτων στην οθόνη (δηλαδή στο Command Window) στο MATLAB γίνεται με τις εντολές disp και fprintf: Σύνταξη της εντολής disp: disp(<μεταβλητή>) ή disp('κείμενο') Απεικόνιση (α) της τιμής μιας μεταβλητής ή (β) κειμένου, δηλαδή σειράς χαρακτήρων. Η σειρά χαρακτήρων μπαίνει πάντα ανάμεσα σε 'μονά' εισαγωγικά (διαφορετικά θα θεωρηθεί όνομα μεταβλητής), εκτός αν είναι αποθηκευμένη σε όνομα μεταβλητής. Υπενθυμίζεται ότι εναλλακτικός τρόπος στο MATLAB για την απεικόνιση της τιμής μιας μεταβλητής είναι απλά η χρήση της μεταβλητής χωρίς ελληνικό ερωτηματικό στο τέλος. Παράδειγμα Αποτέλεσμα x = 4 + 1 x = Απεικόνιση του ονόματος της μεταβλητής (x) 5 μαζί με το αποτέλεσμα (5) x x = Απεικόνιση του ονόματος της μεταβλητής (x) 5 μαζί με την τιμή της (5) disp(x) 5 Απεικόνιση της τιμής της μεταβλητής disp(2*x-17) -7 Απεικόνιση του αποτελέσματος disp('x') x Απεικόνιση του χαρακτήρα 'x' disp('hello') Hello Απεικόνιση της σειράς χαρακτήρων 'Hello' Σύνταξη της εντολής fprintf: fprintf('παράσταση', <μεταβλητές>) Απεικόνιση κειμένου, που μπορεί να περιέχει (προαιρετικά) και τιμές μεταβλητών. Η 'παράσταση' μπορεί να περιέχει (μέσα σε 'μονά' εισαγωγικά): κείμενο ειδικούς χαρακτήρες μορφής, που δηλώνουν σε ποια μορφή θα εκτυπωθούν οι τιμές των μεταβλητών (αν υπάρχουν) και που μπαίνουν στην 'παράσταση', στη θέση και με τη σειρά όπου θέλουμε να εκτυπωθούν οι μεταβλητές. Οι βασικότεροι είναι: %c = χαρακτήρας %s = σειρά χαρακτήρων (συμβολοσειρά, string, character array) %d = ακέραιος (με βάση το δεκαδικό -decimal- σύστημα αρίθμησης) %f = κινητής υποδιαστολής, με 6 δεκαδικά ψηφία ακριβώς. %X.Yf = κινητής υποδιαστολής, με X χαρακτήρες τουλάχιστον (συνολικά, μαζί με την υποδιαστολή και το πρόσημο) και με Y δεκαδικά ψηφία ακριβώς. %.Yf = κινητής υποδιαστολής, με Y δεκαδικά ψηφία ακριβώς. %e = κινητής υποδιαστολής, σε εκθετική μορφή (π.χ. 0.0314 3.14e-002) %g = κινητής υποδιαστολής, στην πιο συμπαγή μορφή από τις %f ή %e. %.Yg = κινητής υποδιαστολής, με Y σημαντικά ψηφία (π.χ. %.2g: 0.0314 0.031). ειδικούς χαρακτήρες θέσης, που δηλώνουν κάποια ειδική λειτουργία για τη θέση όπου θα γίνει η εκτύπωση του κειμένου. Οι βασικότεροι είναι: \n = αλλαγή γραμμής (new line) \t = στηλοθέτης (tab) χρησιμεύει συνήθως για στοίχιση σε στήλες \b = σβήσιμο του προηγούμενου χαρακτήρα (backspace) Επειδή επιτελούν ειδικές λειτουργίες μέσα στην παράσταση, οι χαρακτήρες ', %, \ δεν μπορούν να απεικονιστούν. Αν αυτό απαιτείται, πρέπει να γραφτούν διπλοί ('', %%, \\). Μετά από μια εντολή fprintf, η επόμενη θέση εκτύπωσης είναι δεξιά του τελευταίου χαρακτήρα της 'παράστασης' (εκτός αν η 'παράσταση' λήγει σε \n).

Βασικές εντολές 39 Παραδείγματα age = 25; fprintf('i''m %d years old', age); h = 1.80; w = 75; fprintf('height=%.2f, weight=%.0f', h, w); x = 3/4; fprintf('success = %.0f%%',100*x); Αποτελέσματα I'm 25 years old Height=1.80, weight=75 Success = 75% w1 = 2; w2 = 75; fprintf('cat is: %2dkg\nMan is: %dkg', w1, w2); name = 'John'; letter = 'J'; fprintf('1st letter of %s is %c', name, letter); fprintf('hi'); fprintf('lovely'); fprintf('hi\n'); fprintf('lovely') fprintf('hi'); fprintf('\n'); fprintf('lovely'); Cat is: 2kg Man is: 75kg 1st letter of John is J Hilovely Hi Lovely Hi lovely Οι ειδικοί χαρακτήρες μορφής μπορούν να χρησιμοποιηθούν και για απεικόνιση μιας μεταβλητής σε μορφή άλλου τύπου (με εξαίρεση την περίπτωση μετατροπής αριθμού κινητής υ- ποδιαστολής σε ακέραιο). Η απεικόνιση σε άλλη μορφή γίνεται μόνο κατά την εκτύπωση και δεν επηρεάζει την τιμή της μεταβλητής. Παραδείγματα: Παραδείγματα Αποτελέσματα Σκοπός fprintf('%c',65); fprintf('%d','a'); fprintf('%.2f',-3); fprintf('%8.2f',-3); A 65-3.00-3.00 Απεικόνιση αριθμού ως χαρακτήρα (με τον ASCII ή Unicode χαρακτήρα) Απεικόνιση χαρακτήρα με τη μορφή α- ριθμού (σε ASCII ή Unicode) Απεικόνιση ακεραίου ως αριθμού κινητής υποδιαστολής με 2 μηδενικά Απεικόνιση ακεραίου ως αριθμού κινητής υποδιαστολής με 2 μηδενικά και συνολικό μήκος 8 θέσεις (μαζί με το πρόσημο και μαζί με τα δεκαδικά) Σημείωση: Εκτός από την οθόνη, η fprintf μπορεί να εξάγει τα αποτελέσματά της και σε αρχείο αποθηκεύοντάς τα σε μόνιμο μαγνητικό μέσο (π.χ. στο σκληρό δίσκο), αλλά αυτή η περίπτωση εξετάζεται αργότερα, στα περί αρχείων (βλ. 13.3).

40 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Ερωτήσεις 5.1 Να σημειωθεί αν οι παρακάτω ομάδες εντολών είναι σωστές [Σ] ή λανθασμένες [Λ]: [ ] x = 4; [ ] x = 4 y = 2*x - 5; y = -2*x - 5 [ ] x = 4, y = 2*x - 5 [ ] x = 4 y = -2*x - 5; [ ] x = 4, y = -2*x - 5; [ ] x = 4, y = -2*x - 5 [ ] x = 4, y = -2*x - 5, [ ] x = 4; y = -2*x - 5; [ ] x = 4 y = -2*x - 5; [ ] x = 4 y = -2*x - 5 5.2 Να περιγραφεί συνοπτικά η διαφορά των εντολών x = a και x = 'a'. Είναι δυνατόν να είναι γνωστός ο τύπος της μεταβλητής x σε κάθε μία από τις δύο περιπτώσεις; 5.3 Να σημειωθεί αν οι παρακάτω εντολές είναι σωστές [Σ] ή λανθασμένες [Λ]: [ ] x = 4; [ ] 4 = x; [ ] x = '4'; [ ] '4' = x; [ ] x = a; [ ] a = x; [ ] x = 'a'; [ ] 'a' = x; [ ] y = x + 2; [ ] x = x + 2; Ασκήσεις 5.4 Να συμπληρωθούν κατάλληλα οι παρακάτω γραμμές εντολών ώστε να είναι ορθές: b = 7.5 Sxolio: Edw dinetai o bathmos enos foititi y = 3*x + 4*x^2 0.2*x^3 + 12*x^4 6.1*x^5 + 8*x^6 x^7 + 3*x^8 z = 2 x + 3 z 5.5 Δίνονται οι παρακάτω εντολές προγράμματος: a = 5; b = 6; c = (a+b)/2; fprintf('η μέση τιμή των και είναι ', a, b, c); Να συμπληρωθεί η εντολή fprintf, ώστε να τυπωθεί στο Command Window το ε- ξής: Η μέση τιμή των 5 και 6 είναι 5.5. 5.6 Να συμπληρωθεί η ακόλουθη εντολή fprintf, ώστε η τετραγωνική ρίζα της μεταβλητής x (που είναι 1/ 2 x x 0.5 x ) να τυπώνεται με δύο δεκαδικά ψηφία: x = 5; fprintf('the square root of is ', x, x^0.5); 5.7 Δίνονται οι παρακάτω εντολές ενός προγράμματος: a = input( ); fprintf(' ', ); Να συμπληρωθούν οι προηγούμενες εντολές input και fprintf, ώστε μετά την ε-

Βασικές εντολές 41 κτέλεσή τους να φαίνονται στο Command Window τα εξής (αν υποθέσουμε ότι στην εντολή input δώσουμε τον αριθμό 7 από το πληκτρολόγιο): Give me a number: 7 x^2 = 49 5.8 Δίνονται οι παρακάτω εντολές ενός προγράμματος: x = input( ); y = input( ); fprintf(' ',,, ); Να συμπληρωθούν οι προηγούμενες εντολές input και fprintf, ώστε μετά την ε- κτέλεσή τους να φαίνονται στο Command Window τα εξής*: Give me a number: 4 Give me another number: 3 4^3 = 64 *Υποθέτουμε ότι στις δύο εντολές input δώσαμε τους αριθμούς 4 και 3 από το πληκτρολόγιο. 5.9 Δίνονται οι παρακάτω εντολές ενός προγράμματος: a = 'X-ray'; b = 'Ultrasound'; c = 'CT scan'; fprintf(,a,b,c); s = input( ); Να συμπληρωθούν οι προηγούμενες εντολές input και fprintf, ώστε μετά την ε- κτέλεσή τους να φαίνονται στο Command Window τα εξής: * MENU * 1. X-ray 2. Ultrasound 3. CT scan Select: _ 5.10 Δίνονται οι παρακάτω εντολές προγράμματος: name = input( ); age = input( ); fprintf(, name); fprintf(, age); Να συμπληρωθούν οι εντολές input και fprintf, ώστε μετά την εκτέλεσή τους να φαίνονται στο Command Window τα εξής: Patient name: Papadopoulos Patient age : 64 Patient Papadopoulos: Age: 64 *Υποθέτουμε ότι στις δύο εντολές input δώσαμε τη συμβολοσειρά Papadopoulos και τον αριθμό 64 από το πληκτρολόγιο αντίστοιχα. 5.11 Δίνονται οι παρακάτω εντολές προγράμματος: d = 8.5; r = 0.125; fprintf(, d, r); Να συμπληρωθεί η εντολή fprintf, ώστε να τυπωθεί στο Command Window το ε- ξής: Το ποσοστό των σπουδαστών με βαθμό άνω του 8.5 είναι 12.5%. 5.12 Δίνονται οι παρακάτω εντολές προγράμματος: x = 'B'; fprintf('τhe ASCII number of character is.', x, x); Να συμπληρωθεί η εντολή fprintf, ώστε να τυπωθεί στο Command Window το ε- ξής: Τhe ASCII number of character 'B' is 66.

6 Εντολές διακλάδωσης της ροής του προγράμματος Ένα από τα βασικά στοιχεία στον προγραμματισμό είναι η δυνατότητα διακλάδωσης της ροής του προγράμματος σε διαφορετική κατεύθυνση, ανάλογα με το αν ικανοποιείται κάποια συνθήκη ή όχι. Οι βασικές εντολές επιλογής (δηλαδή επιλογής εκτέλεσης διαφορετικής ομάδας εντολών, αναλόγως της αλήθειας μιας συνθήκης) είναι η if και η switch. 6.1 Εντολή επιλογής IF Σύνταξη της εντολής if (και των παραλλαγών της if-else και if-elseif-else): Σύνταξη if: Διακλάδωση: if <συνθήκη> <εντολές> Οι εντολές που βρίσκονται ανάμεσα στο if και στο εκτελούνται μόνο αν η συνθήκη είναι αληθής. Το πρόγραμμα συνεχίζεται στην επόμενη εντολή μετά το. Σύνταξη if - else: Διακλάδωση με εναλλακτική επιλογή: if <συνθήκη> <εντολές1> else <εντολές2> Αν ικανοποιείται η συνθήκη εκτελούνται οι εντολές1, αλλιώς εκτελούνται οι εντολές2. Σύνταξη if - elseif - else: Πολλαπλή διακλάδωση: if <συνθήκη1> <εντολές1> elseif <συνθήκη2> <εντολές2> elseif <συνθήκη3> <εντολές3>... else <εντολές> Αν ικανοποιείται η συνθήκη1 εκτελούνται οι εντολές1, αλλιώς αν ικανοποιείται η συνθήκη2 εκτελούνται οι εντολές2, κ.ο.κ. Αν δεν ικανοποιείται καμία από τις συνθήκες, εκτελούνται οι εντολές του else (αν υπάρχει). Αν αληθεύουν περισσότερες από μία συνθήκες, εκτελούνται μόνο οι εντολές της πρώτης από αυτές. Σημείωση: Η συνθήκη σε ένα βρόχο επιλογής μπορεί να είναι είτε απλή είτε σύνθετη, οπότε χρησιμοποιούνται οι αντίστοιχοι τελεστές, π.χ. & (AND) ή (OR).

Εντολές διακλάδωσης της ροής ενός προγράμματος 43 Παραδείγματα %%%%%%% if example %%%%%%% a = input('nominator? '); b = input('denominator? '); if b~=0 x = a/b Αποτελέσματα Nominator? 10 Denominator? 2 x = 5 if b==0 & a~=0 disp('infinity'); if b==0 & a==0 disp('no specific number'); % Τα δύο τελευταία if θα μπορούσαν % να αντικατασταθούν από: if b==0 if a~=0 disp('infinity'); if a==0 disp('no specific number'); %%%%%%% if-else example %%%%%%% a = input('nominator? '); b = input('denominator? '); if b~=0 x = a/b else disp('warning! Denominator is zero!'); Nominator? 5 Denominator? 0 Warning! Denominator is zero! %%%%%%% if-elseif-else example %%%%%%% disp('1. New patient'); disp('2. Edit a patient'); disp('3. Display patients'); disp('press any other key to exit'); s = input('select: '); 1. New patient 2. Edit a patient 3. Display patients Press any other key to exit Select: 0 Bye bye if s==1 disp('add a new patient'); elseif s==2 disp('edit an existing patient'); elseif s==3 disp('display all patients'); else disp('bye bye');

44 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 6.2 Εντολή επιλογής SWITCH Η εντολή switch προσφέρει έναν απλό τρόπο επιλογής της ομάδας εντολών που θα ε- κτελεστούν, ανάλογα με την τιμή μιας μεταβλητής. Η διαφορά της switch από την if είναι ότι με τη switch μπορούμε να επιλέξουμε τιμές μεταβλητών μόνο από διακριτό σύνολο τιμών, ενώ με την if μπορούμε να επιλέξουμε τιμές μεταβλητών είτε από διακριτό σύνολο τιμών (αν χρησιμοποιηθεί συνθήκη ισότητας) είτε από συνεχές σύνολο τιμών (αν χρησιμοποιηθεί συνθήκη ανισότητας). Σύνταξη της εντολής switch-case: switch μεταβλητή case <τιμή1> <εντολές1> case <τιμή2> <εντολές2>... otherwise <εντολές> Αν η μεταβλητή έχει την τιμή1 εκτελούνται οι εντολές1, αλλιώς αν έχει την τιμή2 εκτελούνται οι εντολές2, κ.ο.κ. Αν η μεταβλητή δεν έχει καμία από αυτές τις τιμές, εκτελούνται οι εντολές του otherwise (αν υπάρχει). Η μεταβλητή μπορεί να είναι είτε απλή αριθμητική μεταβλητή είτε συμβολοσειρά (string). Μια συνήθης χρήση της switch είναι στην υλοποίηση ενός μενού επιλογών. Σημείωση: Το switch-case μπορεί πάντα να αντικατασταθεί από μια ακολουθία ifelseif-else (όπου οι συνθήκες είναι συνθήκες ισότητας μεταξύ της μεταβλητής και των διαφόρων τιμών της) αλλά το αντίστροφο δεν μπορεί να γίνει πάντα. Παράδειγμα disp('1. New patient'); disp('2. Edit a patient'); disp('3. Display patients'); disp('press any other key to exit'); disp(' '); % Για μια κενή σειρά s = input('select: '); disp(' '); % Για μια κενή σειρά switch s case 1 disp('add a new patient'); case 2 disp('edit an existing patient'); case 3 disp('display all patients'); otherwise disp('bye bye'); Αποτέλεσμα 1. New patient 2. Edit a patient 3. Display patients Press any other key to exit Select: 1 Add a new patient 6.3 Συνοπτική παρουσίαση εντολών προγραμματισμού του MATLAB: lang Λίστα με τις εντολές προγραμματισμού του MATLAB εμφανίζεται στο Command Window με την εντολή help lang (ή doc lang, στο παράθυρο της Βοήθειας).

Εντολές διακλάδωσης της ροής ενός προγράμματος 45 Ερωτήσεις 6.1 Ποια είναι η διαφορά των εντολών επιλογής if και switch, και κατά συνέπεια ποια από τις δύο εντολές είναι γενικότερη; 6.2 α) Η if μπορεί πάντα να αντικαταστήσει μια switch. Να δοθεί ένα παράδειγμα. β) Η switch δεν μπορεί πάντα να αντικαταστήσει μια if. Να δοθεί ένα παράδειγμα. Ασκήσεις 6.3 Γράψτε ένα πρόγραμμα το οποίο διαβάζει από το πληκτρολόγιο την τιμή του αιματοκρίτη ενός ασθενούς και ακολούθως υπολογίζει και εμφανίζει στο Command Window την απαραίτητη δοσολογία ενός φαρμάκου σύμφωνα με τους κανόνες: - Εάν ο αιματοκρίτης > 45 τότε δεν πρέπει να ληφθεί καθόλου φάρμακο - Εάν 40 αιματοκρίτης 45 τότε θα πρέπει να ληφθούν 10 mg φαρμάκου - Εάν αιματοκρίτης < 40 τότε θα πρέπει να ληφθούν 100 mg φαρμάκου 6.4 Να γραφτεί πρόγραμμα το οποίο να τυπώνει με κατάλληλο μήνυμα με fprintf στο Command Window τον μεγαλύτερο από 2 αριθμούς οι οποίοι θα εισάγονται από το πληκτρολόγιο, όπως στο παράδειγμα: Dwse enan ari8mo: 6 Dwse allo enan ari8mo: 3 O megalyteros einai o 6! Σημείωση: Αν οι αριθμοί είναι ίσοι, θα τυπώνεται κατάλληλο μήνυμα, π.χ.: Oi dyo ari8moi einai isoi. 6.5 Γράψτε ένα πρόγραμμα το οποίο να διαβάζει από το πληκτρολόγιο την τιμή της συγκέντρωσης γλυκόζης (G) στο αίμα ενός ασθενούς που πάσχει από διαβήτη και ακολούθως να υπολογίζει και να εμφανίζει στο Command Window την ποσότητα ινσουλίνης (I) που θα πρέπει να λάβει ο ασθενής, σύμφωνα με τους κανόνες: - Αν G 15, τότε I=1000+50 (G-10) ( G 15)/20 - Αν 15<G 30, τότε I 1500 e G/10 I 4000 1 e - Αν G>30, τότε 6.6 Να γραφτεί πρόγραμμα το οποίο να υπολογίζει και να τυπώνει στο Command Window με χρήση της fprintf τις δύο ρίζες ενός δευτεροβάθμιου τριωνύμου. Οι συντελεστές του τριωνύμου πρέπει να εισάγονται από το πληκτρολόγιο. Στην περίπτωση οι οι ρίζες δεν είναι πραγματικές, πρέπει να τυπώνεται κατάλληλο μήνυμα. 6.7 Να γραφτεί πρόγραμμα στο οποίο να εισάγεται ο βαθμός πτυχίου ενός σπουδαστή από το πληκτρολόγιο και να τυπώνεται κατάλληλο μήνυμα στο Command Window: Βαθμός < 0 ή Βαθμός > 10: Μήνυμα: Lan8asmeni ba8mologia 0 Βαθμός < 5: Μήνυμα: Apotyxwn 5.0 Βαθμός < 6.5: Μήνυμα: Kalws 6.5 Βαθμός < 8.5: Μήνυμα: Lian Kalws 8.5 Βαθμός 10: Μήνυμα: Arista 6.8 Να γράψετε τι ακριβώς θα τυπωθεί θα τυπωθεί στο Command Window σε κάθε μία από τις δύο επόμενες περιπτώσεις: (α) (b) x = 9; x = 9; if x>=8.5 if x>=8.5 disp('arista'); disp('arista'); elseif x>=6.5 disp('lian kalws'); if x>=6.5 disp('lian kalws');

46 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 6.9 Να βρεθεί η τιμή της μεταβλητής message μετά την εκτέλεση των παρακάτω διαδοχικών εντολών, στις περιπτώσεις (α) και (β): (α) (b) x = 9; x = 9; if x>=5 if x>=5 message = 'Epityxws'; message = 'Epityxws'; elseif x>=8.5 message = 'Arista'; if x>=8.5 message = 'Arista'; 6.10 Να γίνει μετατροπή του τρόπου διακλάδωσης της ροής του παρακάτω προγράμματος με χρήση switch, αντί για if: x = input('select: ); if x==1 disp('add new patient'); elseif x==2 disp('display all patients'); elseif x==0 disp('exit'); else disp('error'); 6.11 Να γίνει μετατροπή του τρόπου διακλάδωσης της ροής του παρακάτω προγράμματος με χρήση if, αντί για switch: NumberOfFeet = input('posa podia eixe to ar8ropodo? ); switch NumberOfFeet case 6 disp('entomo'); case 8 disp('araxni'); otherwise disp('polypodo');

7 Επαναληπτικοί βρόχοι Το τρίτο βασικό στοιχείο ενός αλγορίθμου, και κατά συνέπεια και του προγράμματος που τον υλοποιεί, είναι η δυνατότητα επανάληψης μιας ομάδας εντολών (τα άλλα δύο βασικά στοιχεία είναι η ανάθεση και η επιλογή). Οι βασικές εντολές δημιουργίας επαναληπτικών βρόχων είναι η for και η while. Η διαφορά τους είναι ότι η for προκαλεί εκτέλεση μιας ομάδας εντολών για συγκεκριμένο αριθμό επαναλήψεων, ενώ με τη while η ομάδα εντολών εκτελείται επαναληπτικά συνεχώς όσο ικανοποιείται μια συγκεκριμένη συνθήκη. 7.1 Εντολή επανάληψης FOR Βασική σύνταξη της εντολής for: for δείκτης = <αρχική_τιμή> : <τελική_τιμή> <εντολές> Μια μεταβλητή που χρησιμοποιείται ως δείκτης παίρνει την αρχική_τιμή και οι <εντολές> εκτελούνται για πρώτη φορά. Μετά ο δείκτης αυξάνεται κάθε φορά κατά ένα (1) και οι <εντολές> επαναλαμβάνονται για όσο ο δείκτης βρίσκεται ανάμεσα στην αρχική_ και στην τελική_τιμή. Σύνταξη της εντολής for για οποιοδήποτε βήμα: for δείκτης = <αρχική_τιμή> : <βήμα> : <τελική_τιμή> <εντολές> Εδώ ο δείκτης μεταβάλλεται κάθε φορά κατά το βήμα και οι εντολές επαναλαμβάνονται για όσο ο δείκτης βρίσκεται ανάμεσα στην αρχική_ και στην τελική_τιμή. Το βήμα μπορεί να είναι θετικό ή αρνητικό, ακέραιος ή κινητής υποδιαστολής. Εάν το βήμα παραλείπεται, θεωρείται ίσο με τη μονάδα (όπως στον πρώτο τρόπο σύνταξης). Παραδείγματα % Θετικό βήμα (ίσο με 1, αν παραλείπεται) for i=1:3 disp('hello'); Αποτελέσματα Hello Hello Hello % Αρνητικό βήμα for i=4:-2:1 disp(i); 4 2 % Δεκαδικό βήμα for i=2:0.4:3 fprintf('%.1f, ',i); 2.0, 2.4, 2.8, % Εύρεση αθροίσματος από το 1 έως το 100 s = 0; % Μηδενισμός μεταβλητής-αθροιστή for i=1:100 s = s + i; s s = 5050

48 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 7.2 Εντολή επανάληψης WHILE Η while είναι πολύ βασική εντολή επανάληψης. Με τη while ο αριθμός των επαναλήψεων δεν είναι συγκεκριμένος, όπως με τη for, αλλά ο βρόχος επαναλαμβάνεται συνεχώς όσο ικανοποιείται μια συγκεκριμένη συνθήκη. Σύνταξη της εντολής while: while <συνθήκη> <εντολές>... Οι εντολές εκτελούνται επαναληπτικά και συνεχώς για όσο ικανοποιείται η συνθήκη. Σημείωση: Ένας επαναληπτικός βρόχος for μπορεί πάντα να αντικατασταθεί από κατάλληλο βρόχο while, αλλά το αντίστροφο δεν είναι πάντα δυνατόν. Παραδείγματα % Επαναληπτική προτροπή για πίεση του πλήκτρου 0 x = input('press 0, then <enter>: '); while x~=0 x = input('press 0, then <enter>: '); disp('thanks!'); % Παράδειγμα αντικατάστασης του for από while disp('loop "for":') for i=1:5 disp(i); disp('loop "while":') i = 1; while i<=5 disp(i); i = i + 1; Αποτελέσματα Press 0, then <enter>: 4 Press 0, then <enter>: 2 Press 0, then <enter>: 7 Press 0, then <enter>: 1 Press 0, then <enter>: 0 Thanks! loop "for": 1 2 3 4 5 loop "while": 1 2 3 4 5 Ο πραγματικός ρόλος της συνθήκης στις εντολές if και while Στην πραγματικότητα, στη θέση της συνθήκης στις εντολές if και while πρέπει να υπάρχει μια λογική τιμή (1 ή 0, true ή false). Αυτό στην πράξη επιτυγχάνεται με μια συνθήκη, η οποία έχει ως αποτέλεσμα μια τέτοια λογική τιμή. Π.χ.1: Οι εντολές while true, <εντολές>; ή while 1, <εντολές>; προκαλούν ατέρμονη επανάληψη (infinite loop) των εσωτερικών εντολών, ενώ οι εντολές while false, <εντολές>; ή while 0, <εντολές>; δεν προκαλούν καμία επανάληψη. Π.χ.2: Η εντολή rem(x,y) δίνει το υπόλοιπο της διαίρεσης x/y. Με το παρακάτω παράδειγμα μπορούμε να ελέγξουμε αν ο αριθμός που εισάγεται είναι άρτιος: n = input('input an integer: '); ypoloipo = rem(n,2); if ~ypoloipo fprintf('o ari8mos %d einai artios',n);

Επαναληπτικοί βρόχοι 49 7.3 Εντολή διακοπής επαναληπτικού βρόχου: BREAK Σύνταξη της εντολής break: break Η break προκαλεί την άμεση έξοδο από ένα επαναληπτικό βρόχο (for ή while). Παράδειγμα for x=-2:2 if x==0 break fprintf('x = %d, 1/x = %.1f\n',x,1/x); Αποτέλεσμα x = -2, 1/x = -0.5 x = -1, 1/x = -1.0 >> 7.4 Εντολή μετάβασης στην επόμενη επανάληψη βρόχου: CONTINUE Σύνταξη της εντολής continue: continue Η continue προκαλεί την άμεση μετάβαση στην επόμενη επανάληψη ενός επαναληπτικού βρόχο (for ή while). Παράδειγμα for x=-2:2 if x==0 continue fprintf('x = %d, 1/x = %.1f\n',x,1/x); Αποτέλεσμα x = -2, 1/x = -0.5 x = -1, 1/x = -1.0 x = 1, 1/x = 1.0 x = 2, 1/x = 0.5 >> 7.5 Συνοπτική παρουσίαση εντολών προγραμματισμού του MATLAB: lang Λίστα με τις εντολές προγραμματισμού του MATLAB εμφανίζεται στο Command Window με την εντολή help lang (ή doc lang, στο παράθυρο της Βοήθειας).

50 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 7.6 Μεταβλητές συγκεκριμένης χρήσης Στους βρόχους επανάληψης και επιλογής εμφανίζονται συχνά μεταβλητές με συγκεκριμένη χρήση. Οι συνηθέστερες τέτοιου είδους χρήσεις μεταβλητών είναι οι εξής: Δείκτης (index): Χρησιμοποιείται στους βρόχους for για τον έλεγχο της έναρξης και του τερματισμού των διαδοχικών επαναλήψεων. Δεν συμμετέχει πάντοτε στις εσωτερικές εντολές του βρόχου, ενώ σχεδόν ποτέ δεν πρέπει να μεταβάλλεται από εντολές στο εσωτερικό του βρόχου. Παράδειγμα Αποτέλεσμα % Δείκτης (i) for i=1:4 disp(i); 1 2 3 4 Μετρητής (counter): Χρησιμοποιείται στους βρόχους επανάληψης (for και while) για τη μέτρηση του αριθμού των επαναλήψεων. Ο μετρητής πρέπει να μηδενίζεται πριν από την είσοδο στο βρόχο. Παράδειγμα % Μετρητής (n) n = 0; for i=1:1000 if rem(i,7)==0 n = n + 1; fprintf('yparxoun %d pollaplasia toy 7 apo 1 ews 1000', n); Αποτέλεσμα Yparxoun 142 pollaplasia toy 7 apo 1 ews 1000 Αθροιστής (adder): Χρησιμοποιείται στους βρόχους επανάληψης (for και while) για την εύρεση ενός αθροίσματος. Ο αθροιστής πρέπει να μηδενίζεται πριν απ την είσοδο στο βρόχο. Παράδειγμα % Αθροιστής (s) s = 0; for i=1:100 s = s + i; disp(s); Αποτέλεσμα 5050 Σημείωση: Μεταβλητή με παρόμοια χρήση μπορεί να χρησιμοποιηθεί και για την εύρεση ενός γινομένου, αλλά προφανώς τότε η αρχική της τιμή δεν είναι το 0, αλλά το 1.

Επαναληπτικοί βρόχοι 51 Ένδειξη ή «σημαία» (flag): Χρησιμοποιείται ως ένδειξη για τον έλεγχο της εκτέλεσης μιας εντολής ή όχι. Πολλές φορές πρόκειται για λογική μεταβλητή, ή απλά μια μεταβλητή με δύο τιμές ( flag up, flag down ). Συχνά παίρνει μια αρχική τιμή στην αρχή του προγράμματος,, και συνήθως η κατάστασή της αλλάζει με την ικανοποίηση μιας συνθήκης, ώστε αυτό να γίνει γνωστό αργότερα στο πρόγραμμα. Δεν χρησιμοποιείται αναγκαστικά σε βρόχους. Παραδείγματα % Flag "displayresults" % Εύρεση του αθροίσματος από 1 έως 100 displayresults = 1; s = 0; for i=1:100 s = s + i; if displayresults==1 fprintf('sum from 1 to 100: %d\n',n); % Flag "primefound" % Εύρεση του 1ου πρώτου αριθμού μετά από % ένα συγκεκριμένο αριθμό (θα χρησιμοποιηθεί % η συνάρτηση του MATLAB "isprime", η οποία % ελέγχει αν ένας αριθμός είναι πρώτος ή όχι). primefound = 0; n = 1000; while primefound==0 n = n + 1; if isprime(n)==1 primefound = 1; if primefound==1 fprintf(1st prime after 1000: %d',n); Αποτελέσματα Sum from 1 to 100: 5050 1st prime after 1000: 1009

52 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 7.7 Βασικά παραδείγματα εφαρμογής εντολών επιλογής και επανάληψης Παρακάτω περιγράφονται, μέσω παραδειγμάτων, οι πιο βασικές εφαρμογές αλγορίθμων στους οποίους χρησιμοποιούνται εντολές επιλογής και επανάληψης, δηλαδή (α) εύρεση α- θροίσματος και μέσης τιμής (β) εύρεση μέγιστης και ελάχιστης τιμής, (γ) απαρίθμηση, και (δ) έλεγχος εγκυρότητας κατά την εισαγωγή τιμών: α) Εύρεση αθροίσματος και μέσης τιμής Πρόβλημα: Να γραφτεί πρόγραμμα στο οποίο να γίνεται εισαγωγή από το πληκτρολόγιο 100 βαθμών σπουδαστών και να τυπώνεται η μέση τιμή τους. Λύση: Πρόγραμμα s = 0; % Αρχικοποίηση αθροιστή for i=1:100 x = input('ba8mos? '); s = s + x; mo = s/100; fprintf('mesos oros = %.1f\n', mo); Αποτέλεσμα Ba8mos? 8 Ba8mos? 6.5 Ba8mos? 7... Ba8mos? 6 Mesos oros = 7.2 β) Εύρεση μέγιστης (ή ελάχιστης) τιμής Πρόβλημα: Να γραφτεί πρόγραμμα στο οποίο να βρίσκονται και να τυπώνονται η μέγιστη από 365 τιμές θερμοκρασίας (μία για κάθε μέρα του έτους) που εισάγονται από το πληκτρολόγιο. Επίσης πρέπει να τυπώνεται και ο αριθμός της ημέρας στην οποία βρέθηκε η μέγιστη θερμοκρασία. Λύση: Πρόγραμμα for i=1:365 fprintf('temperature for day %d: ', i); T = input(''); if i==1 MaxT = T; % Αρχικοποίηση της μεταβλητής της μέγιστης θερμοκρασίας if T > MaxT MaxT = T; DayOfMaxT = i; End fprintf('maximum temperature is %d, in day %d\n', MaxT, DayOfMaxT); Αποτέλεσμα Temperature for day 1: 21 Temperature for day 2: 18 Temperature for day 3: 19... Temperature for day 3: 16 Maximum temperature is 37, in day 209 Σημείωση: Για εύρεση της ελάχιστης τιμής, πρέπει να αλλάξει η φορά της ανισότητας.

Επαναληπτικοί βρόχοι 53 γ) Απαρίθμηση Πρόβλημα: Να γραφτεί πρόγραμμα στο οποίο να γίνεται εισαγωγή από το πληκτρολόγιο 100 τιμών βάρους και ύψους για ισάριθμους ασθενείς. Το πρόγραμμα πρέπει να υπολογίζει και να τυπώνει το Δείκτη Σωματικού Βάρους κάθε ασθενούς και στο τέλος να τυπώνει το πλήθος των ασθενών που έχουν κανονικό βάρος (βλ. παρακάτω πίνακα). Σημείωση: Ο Δείκτης Σωματικού Βάρους (Body Mass Index, BMI) είναι ένας στατιστικός δείκτης για την εκτίμηση της παχυσαρκίας σε ενήλικες και ισούται με το πηλίκο του βάρους του ατόμου (σε kg) προς το τετράγωνο του ύψους του (σε m): Βάρος (kg) BMI = Ύψος (m) 2 Οι κατηγορίες του BMI είναι (http://www.nhlbisupport.com/bmi/): Λιπόβαρος: BMI< 18.5 Κανονικό βάρος: 18.5 BMI < 25 Υπέρβαρος: 25 BMI < 30 Παχύσαρκος: BMI 30 Λύση: Πρόγραμμα n = 0; % Αρχικοποίηση μετρητή for i=1:100 fprintf('\npatient %d:\n', i); weight = input('weight(kg)? '); height = input('height(m)? '); bmi = weight/height^2; if bmi>=18.5 & bmi<25 n = n + 1; fprintf('bmi = %.1f', bmi); fprintf('number of patients with normal BMI: %d\n', n); Αποτέλεσμα Patient 1: Weight(kg)? 82 Height(m)? 1.70 BMI = 28.4 Patient 2: Weight(kg)? 75 Height(m)? 1.72 BMI = 25.4... Patient 100: Weight(kg)? 96 Height(m)? 1.80 BMI = 29.6 Number of patients with normal BMI: 67

54 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB δ) Έλεγχος εγκυρότητας κατά την εισαγωγή τιμών Πρόβλημα: Να γραφτεί πρόγραμμα στο οποίο (α) να γίνεται εισαγωγή από το πληκτρολόγιο 100 βαθμών σπουδαστών και (β) στο τέλος να απεικονίζεται ο μέγιστος βαθμός. Στο πρόγραμμα πρέπει να γίνεται επανάληψη της εισαγωγής του βαθμού, σε περίπτωση που αυτός δεν είναι έγκυρος (πρέπει: 0 βαθμός 10). Λύση: Πρόγραμμα for i=1:100 fprintf('ba8mos %d? ',i); x = input(''); while x<0 x>10 fprintf('la8os eisagwgi. Ba8mos %d? ',i); x = input(''); if i==1, MaxBa8mos = x; % Αρχικοποίηση μεταβλητής μικρότερου βαθμού if x>maxba8mos MaxBa8mos = x; fprintf('megalyteros ba8mos: %d\n', MaxBa8mos); Αποτέλεσμα Ba8mos 1? 9 Ba8mos 2? 7 Ba8mos 3? 11 La8os eisagwgi. Ba8mos 3? 1 Ba8mos 4? 8... Ba8mos 100? 8 Megalyteros ba8mos: 9

Επαναληπτικοί βρόχοι 55 Ερωτήσεις 7.1 Ποια είναι η διαφορά των εντολών επιλογής for και while, και κατά συνέπεια ποια από τις δύο εντολές είναι γενικότερη; 7.2 α) Η while μπορεί πάντα να αντικαταστήσει μια for. Να δοθεί ένα παράδειγμα. β) Η for δεν μπορεί πάντα να αντικαταστήσει μια while. Να δοθεί ένα παράδειγμα. 7.3 Να γράψετε τι θα τυπωθεί στο Command Window μετά την εκτέλεση των παρακάτω εντολών σε κάθε μία από τις δύο περιπτώσεις: (α) (b) for i=0:2:10 for i=1:2:10 x = i^2; x = i^2; disp(x); disp(x); Ασκήσεις 7.4 Να γραφτεί πρόγραμμα στο οποίο (α) θα υπολογίζεται το άθροισμα των πρώτων Ν θετικών ακεραίων (το Ν θα εισάγεται από το πληκτρολόγιο) και (β) το αποτέλεσμα θα τυπώνεται στο Command Window με χρήση της fprintf. 7.5 Να γραφτεί πρόγραμμα το οποίο να υπολογίζει το Ν! (Ν παραγοντικό), δηλαδή το γινόμενο 1 2 N (το Ν θα εισάγεται από το πληκτρολόγιο, και το αποτέλεσμα θα τυπώνεται στο Command Window με χρήση της fprintf). 7.6 Να γραφτεί πρόγραμμα το οποίο να υπολογίζει τη μέση τιμή Ν αριθμών οι οποίοι θα εισάγονται από το πληκτρολόγιο (το Ν θα εισάγεται επίσης από το πληκτρολόγιο). 7.7 Να γραφτεί πρόγραμμα το οποίο να υπολογίζει τη μέγιστη και την ελάχιστη τιμή Ν α- ριθμών οι οποίοι θα εισάγονται από το πληκτρολόγιο (το Ν θα εισάγεται επίσης από το πληκτρολόγιο). 7.8 Να γραφτεί πρόγραμμα στο οποίο (α) να γίνεται εισαγωγή από το πληκτρολόγιο 100 βαθμών σπουδαστών και (β) να υπολογίζεται και να τυπώνεται η μέση τιμή μόνο των προβιβάσιμων βαθμών (μεγαλύτερων ή ίσων του 5). 7.9 Να γραφτεί πρόγραμμα το οποίο να τυπώνει στο Command Window έναν πίνακα αντιστοιχιών μεταξύ θερμοκρασιών Κελσίου και Φαρενάιτ σε δύο στήλες: Στην πρώτη στήλη θα βρίσκονται οι θερμοκρασίες σε βαθμούς Κελσίου από 0 έως 100 ανά 5 βαθμούς, και στη δεύτερη στήλη θα βρίσκονται οι αντίστοιχες θερμοκρασίες σε Φαρενάιτ. 9 Η σχέση των κλιμάκων θερμοκρασιών Κελσίου και Φαρενάιτ είναι: T T 32. 7.10 Σύμφωνα με το μύθο, ο σοφός βραχμάνος Σίσσα ζήτησε ως αμοιβή για την εφεύρεση ενός νέου παιχνιδιού με 64 τετράγωνα, που του είχε παραγγείλει ο Ινδός βασιλιάς Μπαλχάιτ, 1 κόκκο στάρι για το πρώτο τετράγωνο, 2 για το δεύτερο, 4 για το τρίτο, 8 για το τέταρτο, κ.ο.κ., διπλασιάζοντας έτσι μέχρι και το τελευταίο. Να κατασκευάσετε ένα πρόγραμμα που να υπολογίζει και να απεικονίζει (α) το σύνολο των κόκκων σταριού που θα έπαιρνε ως αμοιβή ο σοφός και (β) το βάρος του σταριού που θα προέκυπτε (σε τόνους), αν δεχθούμε ότι κάθε κόκκος σταριού ζυγίζει 0.0648 γραμμάρια. 7.11 Να γραφτεί πρόγραμμα το οποίο να τυπώνει στο Command Window το μεγαλύτερο α- κέραιο του οποίου το τετράγωνο είναι μικρότερο του 1000. 7.12 Να γραφτεί πρόγραμμα το οποίο να καταγράφει το πλήθος των θετικών (P) και το πλήθος των αρνητικών (N) αριθμών που εισάγονται από το πληκτρολόγιο. Η εισαγωγή και F 5 C

56 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB καταγραφή των αριθμών θα συνεχίζεται μέχρι να εισαχθεί ο αριθμός 0, και τότε οι α- ριθμοί P και N θα τυπώνονται στο Command Window με κατάλληλο μήνυμα. 7.13 Να γραφτεί πρόγραμμα στο οποίο να γίνεται συνεχώς εισαγωγή βαθμών σπουδαστών από το πληκτρολόγιο. Εάν ο βαθμός είναι προβιβάσιμος (μεγαλύτερος ή ίσος του 5), τότε πρέπει να τυπώνεται το μήνυμα Pass, αλλιώς πρέπει να τυπώνεται Not pass. Η διαδικασία θα διακόπτεται όταν εισαχθεί κάποιος αρνητικός αριθμός (π.χ. -1). Στη συνέχεια, πρέπει να τυπώνεται η μέση τιμή των βαθμών που εισήχθησαν. 7.14 Να γραφτεί πρόγραμμα με το οποίο να απεικονίζονται στο Command Window όλοι οι αριθμοί της σειράς Fibonacci που δεν υπερβαίνουν το 100 (στη σειρά Fibonacci, κάθε αριθμός είναι ίσος με το άθροισμα των δύο προηγούμενών του: 0 1 1 2 3 5 8 13 21 34 ). 7.15 Να γίνει μετατροπή του τρόπου διακλάδωσης της ροής του παρακάτω προγράμματος με χρήση βρόχου while, αντί του βρόχου for (να παρατηρηθεί επίσης η τελική τιμή της μεταβλητής i σε κάθε μία από τις περιπτώσεις, που απεικονίζεται με την disp της τελευταίας γραμμής): for i=1:100 disp(i^2); disp(i); 7.16 Να γίνει μετατροπή του τρόπου διακλάδωσης της ροής του παρακάτω προγράμματος με χρήση βρόχου for, αντί του βρόχου while (να παρατηρηθεί επίσης η τελική τιμή της μεταβλητής n σε κάθε μία από τις περιπτώσεις, που απεικονίζεται με την disp της τελευταίας γραμμής): n = 100; while n>0 n = n 4; disp(n^0.5); disp(n);

8 Πίνακες Στις προηγούμενες ενότητες περιγράφηκαν τα βασικά περί προγραμματισμού καθώς και μια εισαγωγή στο περιβάλλον του MATLAB. Παρόλο που με τα ελάχιστα βασικά στοιχεία που ήδη δόθηκαν (1. απλές μεταβλητές αριθμών και χαρακτήρων, 2. τελεστές αριθμητικών, συγκριτικών και λογικών πράξεων, και 3. εντολές ανάθεσης, επιλογής και επανάληψης) μπορεί θεωρητικά να γραφτούν προγράμματα που επιλύουν οποιοδήποτε πρόβλημα, στην πραγματικότητα υπάρχουν πολύ περισσότερα στοιχεία σε κάθε γλώσσα προγραμματισμού που κάνουν ευκολότερη και συνεκτικότερη την υλοποίηση των σύνθετων αλγορίθμων. 8.1 Γενικά για τους πίνακες Στα μαθηματικά (στο πεδίο της γραμμικής άλγεβρας) ως πίνακα εννοούμε μια ορθογώνια διάταξη αριθμών σε γραμμές και στήλες. Στον προγραμματισμό, στους πίνακες μπορούν να αποθηκευτούν και άλλοι τύποι μεταβλητών (όχι μόνο αριθμοί), π.χ. χαρακτήρες. Πίνακας (matrix, array) ονομάζεται μια ομάδα μεταβλητών ίδιου τύπου με ένα κοινό ό- νομα. Στοιχεία του πίνακα λέγονται οι επιμέρους απλές μεταβλητές που ανήκουν στον πίνακα. Δείκτες ενός στοιχείου του πίνακα λέγονται οι θετικοί διαδοχικοί ακέραιοι (ένας ή περισσότεροι, αναλόγως του πλήθους των διαστάσεων του πίνακα) που δείχνουν τη θέση του στοιχείου στον πίνακα. Οι συνήθεις πίνακες είναι δύο διαστάσεων (δισδιάστατοι πίνακες). Αναφερόμενοι σε έ- ναν πίνακα Μ Ν, εννοούμε έναν πίνακα με Μ γραμμές και Ν στήλες. Ως ειδικές περιπτώσεις πινάκων μπορούμε να θεωρήσουμε τους απλούς αριθμούς (πίνακες 1 1), που λέγονται και βαθμωτά μεγέθη, καθώς και τους πίνακες μιας γραμμής (1 Ν) ή μιας στήλης (Μ 1) που λέγονται μονοδιάστατοι πίνακες (vectors, διανύσματα). Επεκτείνοντας την έννοια του πίνακα, έχουμε πίνακες τριών ή και περισσοτέρων διαστάσεων (πολυδιάστατοι πίνακες). Το πλήθος των διαστάσεων ενός πίνακα λέγεται διαστατικότητα (dimensionality). Το πλήθος των στοιχείων ενός πίνακα ονομάζεται μέγεθος του πίνακα και ισούται με το γινόμενο των διαστάσεών του. Η προσπέλαση όλων των στοιχείων ενός πίνακα διαδοχικά λέγεται σάρωση του πίνακα. 4-2.1 7 35 Πίνακας μιας διάστασης Πίνακας δύο διαστάσεων Πίνακας τριών διαστάσεων

58 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 8.2 Μονοδιάστατοι πίνακες Ένας πίνακας μιας διάστασης μπορεί να είναι πίνακας-γραμμή ή πίνακας-στήλη, ανάλογα με το πώς διατάσσονται τα στοιχεία του. Το πλήθος των στοιχείων ενός μονοδιάστατου πίνακα λέγεται και μήκος του πίνακα. Κάθε στοιχείο ενός μονοδιάστατου πίνακα χαρακτηρίζεται από το όνομα του πίνακα και από τον δείκτη του στοιχείου, που παίρνει τιμές από 1 έως το μήκος του πίνακα..χ. Αν Α είναι ο μονοδιάστατος πίνακας μήκους 5: 4 3 1 7 6, τότε Α(2)=3. Ανάθεση τιμών σε μονοδιάστατο πίνακα: Η ανάθεση των τιμών ενός μονοδιάστατου πίνακα γίνεται απ ευθείας μέσα σε αγκύλες [...], ως εξής: Σε πίνακα-γραμμή, τα στοιχεία χωρίζονται μεταξύ τους με κόμμα (,) ή κενό διάστημα, π.χ. A = [8 7 5] ή A = [8,7,5]. Σε πίνακα-στήλη, τα στοιχεία χωρίζονται με ελληνικό ερωτηματικό (;) ή αλλαγή γραμμής (με Enter), π.χ. B = [-1;0;4]. Αναφορά σε στοιχείο μονοδιάστατου πίνακα: Σε ένα στοιχείο του πίνακα αναφερόμαστε με το όνομα του πίνακα και σε παρένθεση το δείκτη του στοιχείου: όνομα(δείκτης) Σάρωση μονοδιάστατου πίνακα: Γίνεται με ένα επαναληπτικό βρόχο, όπως τύπου for. Παραδείγματα % Ορισμοί πινάκων A = [8 7 5 9 10] % Πίνακας-γραμμή B = [-1;0;4] % Πίνακας-στήλη C = [12-3] % Πίνακας-στήλη % Αντικατάσταση στοιχείων πίνακα A(2) = 9; A(3) = -7 % Πράξεις με στοιχεία πινάκων x = 2*A(5) B(3) + 1 % Αρχικοποίηση πίνακα με σάρωση και % μηδενισμό των στοιχείων του for i=1:5 B(i) = 0; disp(b); % Εύρεση μέσης τιμής στοιχείων πίνακα s = 0; for i=1:5 s = s + A(i); m = s / 5 % Άθροισμα πινάκων στοιχείο-προς-στοιχείο A = [ 8 7 5 9 10]; B = [-1 0 4 3-6]; for i=1:5 C(i) = A(i) + B(i); C Αποτελέσματα A = 8 7 5 9 10 B = -1 0 4 C = 12-3 A = x = m = C = 8 9-7 9 10 17 0 0 0 0 0 5.8 7 7 9 12 4

Πίνακες 59 8.3 Δισδιάστατοι πίνακες Ανάθεση τιμών σε δισδιάστατο πίνακα: Οι τιμές τοποθετούνται μέσα σε αγκύλες [...]. Τα στοιχεία της ίδιας γραμμής χωρίζονται με κόμμα (,) ή κενό διάστημα (space). Οι γραμμές χωρίζονται μεταξύ τους με ελληνικό ερωτηματικό (;) ή με αλλαγή γραμμής ( Enter): όνομα = [α11, α12, α13 ; α21, α22, α23] ή όνομα = [α11 α12 α13 α21 α22 α23] Αναφορά σε στοιχείο δισδιάστατου πίνακα: Οι δείκτες είναι δύο, μπαίνουν σε παρένθεση και χωρίζονται με κόμμα: Ο πρώτος δείκτης αναφέρεται στη γραμμή στην οποία ανήκει το στοιχείο και ο δεύτερος στη στήλη: όνομα(δείκτης_γραμμής, δείκτης_στήλης). Π.χ. Το στοιχείο που ανήκει στην τρίτη γραμμή και δεύτερη στήλη ενός πίνακα Α είναι το Α(3,2). Αποθήκευση πίνακα στη μνήμη: Η αποθήκευση ενός πίνακα στη μνήμη γίνεται σε συνεχόμενες θέσεις (διευθύνσεις) μνήμης. Αρχικά αποθηκεύονται πληροφορίες σχετικά με τις διαστάσεις του πίνακα και τον τύπο των μεταβλητών (περιοχή header). Στη συνέχεια αποθηκεύονται οι τιμές των στοιχείων του πίνακα (περιοχή data). Στο MATLAB (καθώς και στη γλώσσα Fortran, σε αντίθεση όμως με τη γλώσσα C και τις περισσότερες γλώσσες προγραμματισμού) η αποθήκευση των στοιχείων γίνεται. «κατά στήλες»: Πρώτα τα στοιχεία της 1 ης στήλης, στη συνέχεια τα στοιχεία της 2 ης στήλης κ.ο.κ.. *. Για παράδειγμα, έστω ο πίνακας: α α α α A= α α α α 11 12 21 22 31 32 41 42 Η αποθήκευση των στοιχείων του πίνακα στη μνήμη γίνεται στο MATLAB κατά στήλες, σε συνεχόμενες θέσεις μνήμης: α 11 α 21 α 31 α 41 α 12 α 22 α 32 α 42 Ταχεία σάρωση πίνακα: Επειδή στο MATLAB οι πίνακες αποθηκεύονται κατά στήλες σε συνεχόμενες διευθύνσεις στη μνήμη του υπολογιστή, η σάρωσή τους γίνεται ταχύτερα κατά στήλες παρά κατά γραμμές. Αυτό συμβαίνει διότι οι σύγχρονοι επεξεργαστές, όταν ζητηθεί από τη μνήμη RAM μια μεταβλητή, αποθηκεύουν μαζί με αυτήν και τις επόμενες διαδοχικές θέσεις σε μια μικρή μνήμη γρήγορης προσπέλασης που λέγεται cache. Έτσι, όταν ζητηθεί η μεταβλητή της επόμενης θέσης, αυτή θα διαβαστεί από την μνήμη cache και όχι από τη RAM. Έτσι, στη σάρωση κατά στήλες (α 11, α 21, α 31, ) γίνονται λιγότερα αιτήματα προς τη μνήμη RAM σε σχέση με τη σάρωση κατά γραμμές (α 11, α 12, α 21, α 22, α 31, α 32, ). α α α α A= α α α α 11 12 21 22 31 32 41 42 α α α α A= α α α α 11 12 21 22 31 32 41 42 κ.λ.π. α 11 α 21 α 31 α 41 α 12 α 22 α 32 α 42 α 11 α 21 α 31 α 41 α 12 α 22 α 32 α 42 * Γενικεύοντας σε πίνακες οποιασδήποτε διάστασης, η αποθήκευση ενός πίνακα στο MATLAB γίνεται έτσι ώστε να αυξάνεται πρώτος ο δείκτης που βρίσκεται πιο αριστερά, και τελευταίος αυτός που είναι πιο δεξιά.

60 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Παραδείγματα Αποτελέσματα Παράδειγμα 1: α) Εισαγωγή στοιχείων σε δισδιάστατο πίνακα από το πληκτρολόγιο: Στο παράδειγμα εισάγονται από το πληκτρολόγιο 5 βαθμοί για 2 μαθητές σε έναν πίνακα 2x5 (2 γραμμών και 5 στηλών). % Εισαγωγή 5 βαθμών 2 μαθητών % από το πληκτρολόγιο (5 βαθμοί ανά γραμμή) for i=1:2 for j=1:5 D(i,j) = input('degree? '); Degree? 8 Degree? 9 Degree? 5... Έστω ότι εισήχθησαν οι βαθμοί: D D = 8 9 5 9 6 7 6 4 7 6 β) Εύρεση του μέσου όρου των βαθμών του 2 ου μαθητή (2 η γραμμή του πίνακα): s = 0; % Αρχικοποίηση αθροιστή for j=1:5 s = s + D(2,j); m = s/5 Παράδειγμα 2: Σάρωση κατά γραμμές και μετά κατά στήλες για ανάδειξη της διαφοράς χρόνου. Θα γίνει χρήση των εντολών tic (έναρξη χρονόμετρου) και toc (λήξη χρονόμετρου και απεικόνιση του χρόνου που πέρασε στο Command Window): clc; clear all; L = 1000; % Πλήθος γραμμών M = 1000; % Πλήθος στηλών A = rand(l,m); % Δημιουργία πίνακα A 1000x1000 με τυχαίους αριθμούς m = 6 % Σάρωση κατά γραμμές tic % Έναρξη χρονόμετρου s = 0; for i=1:l for j=1:m s = s + A(i,j); toc % Λήξη χρονόμετρου % Σάρωση κατά στήλες tic % Έναρξη χρονόμετρου s = 0; for j=1:m for i=1:l s = s + A(i,j); toc % Λήξη χρονόμετρου >> Elapsed time is 0.016636 seconds. >> Elapsed time is 0.010100 seconds.

Πίνακες 61 8.4 Συναρτήσεις πινάκων Ακολουθούν μερικές χρήσιμες συναρτήσεις (εντολές) για χειρισμό πινάκων στο MATLAB: length length(πίνακας) Δίνει το μέγεθος της μεγαλύτερης διάστασης του πίνακα. Χρησιμοποιείται συνήθως στους μονοδιάστατους πίνακες, γιατί δίνει απ ευθείας το πλήθος των στοιχείων τους. Παραδείγματα A = [-1 4 7 1 2 5]; B = [4-1 3 0 7 8]; length(a), length(b) Αποτελέσματα ans = 6 ans = 3 % Εύρεση μέσης τιμής μονοδιάστατου πίνακα A = [-1 4 7 1 2 5]; s = 0; for i=1:length(a) s = s + A(i); m = s / length(a) m = 3 % Εύρεση μέγιστης τιμής μονοδιάστατου πίνακα A = [-1 4 7 1 2 5]; Max = A(1); for i=1:length(a) if A(i)>Max, Max = A(i); disp(max); 7 size size(πίνακας) Δίνει το μέγεθος των διαστάσεων του πίνακα (σε μορφή μονοδιάστατου πίνακαγραμμής). Σε πίνακες δύο διαστάσεων, η πρώτη αντιστοιχεί στις γραμμές και η δεύτερη στις στήλες. Π.χ. αν ο πίνακας A έχει 2 γραμμές και 3 στήλες, τότε η size(a) έχει ως αποτέλεσμα τον πίνακα [2 3]. ή size(πίνακας,n) Δίνει το μέγεθος της n-οστής διάστασης του πίνακα. Για παράδειγμα, σε έναν πίνακα Α δύο διαστάσεων, η size(a,1) δίνει το πλήθος των γραμμών και η size(a,2) δίνει το πλήθος των στηλών. Συνήθεις χρήσεις της size είναι η αυτόματη εύρεση της τελικής τιμής των βρόχων for κατά τη σάρωση ενός πίνακα, καθώς και η γρήγορη εύρεση του πλήθους των στοιχείων του πίνακα (ισούται με το γινόμενο των διαστάσεών του, π.χ. size(a,1)* size(a,2)). Παραδείγματα Αποτελέσματα A = [4-1 3;0 7 8] A = 4-1 3 0 7 8

62 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB % Εύρεση διαστάσεων και αποθήκευση σε πίνακα dimensions = size(a) dimensions = 2 3 % Εύρεση πλήθους στοιχείων του A με τη size n = size(a,1)*size(a,2) % Εύρεση πλήθους στοιχείων του A με σάρωση n = 0; for i=1:size(a,1) for j=1:size(a,2) n = n + 1; n n = n = 6 6 % Εύρεση της μέσης τιμής του πίνακα Α s = 0; for i=1:size(a,1) for j=1:size(a,2) s = s + A(i,j); m = s / (size(a,1)*size(a,2)) % Εύρεση μέγιστης και ελάχιστης τιμής πίνακα Min = A(1,1); Max = A(1,1); for i=1:size(a,1) for j=1:size(a,2) if A(i,j)>Max, Max = A(i,j); if A(i,j)<Min, Min = A(i,j); Min, Max m = Min = Max = 3.5-1 8 det ορίζουσα = det(πίνακας) Δίνει την ορίζουσα ενός τετράγωνου πίνακα (με ίσο αριθμό γραμμών και στηλών). inv αντίστροφος = inv(πίνακας) Δίνει τον αντίστροφο ενός τετράγωνου πίνακα. Αντίστροφος ενός πίνακα λέγεται αυτός που αν πολλαπλασιαστεί με τον αρχικό πίνακα έχει ως αποτέλεσμα το μοναδιαίο πίνακα (δηλαδή έναν πίνακα που έχει στην κύρια διαγώνιο μονάδες και παντού αλλού μηδενικά): A*B = I ή A*A -1 = I Παραδείγματα Αποτελέσματα >> A = [-1 0 7 8] >> B = inv(a) >> D = det(a) A = B = D = -1 0 7 8-1 0 0.875 0.125-8

Πίνακες 63 Παράδειγμα: Επίλυση συστήματος γραμμικών εξισώσεων (βλ. και παράδειγμα 9.10): Έστω το σύστημα γραμμικών εξισώσεων: 2x 1 + 3x 1 = 6 4x 2 + 9x 2 = 15 Επίλυση του συστήματος με ορίζουσες: 2 3 6 3 2 6 Αν D= η ορίζουσα συστήματος και D= 1, D= 2 οι ορίζουσες των x 1, x 2, 4 9 15 9 4 15 τότε: x1 = και x1 =. Εύρεση της λύσης με τη βοήθεια του MATLAB: D = [2 3 4 9]; D1 = [ 6 3 15 9]; D2 = [2 6 4 15]; Αποτελέσματα: x1 = 1.5 x1 = det(d1)/det(d) x2 = det(d2)/det(d) x2 = 1 8.5 Σύγκριση ισότητας πινάκων Δυο πίνακες είναι ίσοι όταν έχουν ίσες διαστάσεις και τα αντίστοιχα στοιχεία τους είναι ίσα ένα προς ένα. Η σύγκριση ισότητας δύο πινάκων μπορεί να γίνει με συγγραφή κατάλληλου προγράμματος όπου να γίνεται απ ευθείας σύγκριση των διαστάσεων των πινάκων και στη συνέχεια των αντίστοιχων στοιχείων τους. Παράδειγμα Αποτέλεσμα equalityflag = 1; % μεταβλητή ελέγχου ισότητας % Έλεγχος ισότητας διαστάεων if size(a,1)~= size(b,1) size(a,2)~=size(b,2) equalityflag = 0; % Έλεγχος ισότητας στοιχείων if equalityflag==1 for i=1:size(a,1) for j=1:size(a,2) if A(i,j)~=B(i,j), equalityflag = 0; if equalityflag==1 disp('a is equal to B'); else disp('a is not equal to B'); A is not equal to B 8.6 Συνοπτική παρουσίαση απλών εντολών χειρισμού πινάκων του MATLAB: elmat Λίστα με τις απλές εντολές χειρισμού πινάκων του MATLAB εμφανίζεται στο Command Window με την εντολή help elmat (ή doc elmat, στο παράθυρο της Βοήθειας).

64 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Ερωτήσεις 8.1 Τι ονομάζουμε (α) πίνακα, (β) στοιχεία πίνακα, (γ) δείκτες πίνακα, (δ) διαστατικότητα πίνακα, (ε) μέγεθος πίνακα, (στ) σάρωση πίνακα; 8.2 α) Πώς αποθηκεύονται τα στοιχεία ενός πίνακα στη μνήμη του υπολογιστή; Να δοθεί παράδειγμα για δισδιάστατο πίνακα. β) Πώς πρέπει να σαρωθεί ένας πίνακας, ώστε η σάρωση να γίνει ταχύτερα; Γιατί; 8.3 α) Τι αποτέλεσμα δίνει η εντολή (συνάρτηση) length σε μονοδιάστατο, και τι σε δισδιάστατο πίνακα; β) Τι αποτέλεσμα δίνει η εντολή (συνάρτηση) size σε μονοδιάστατο, και τι σε δισδιάστατο πίνακα; γ) Να γραφτεί κατάλληλη γραμμή κώδικα, για την εύρεση του πλήθους των στοιχείων: (i) μονοδιάστατου πίνακα: (ii) δισδιάστατου πίνακα: 8.4 Να συμπληρωθούν τα κενά ( ) ώστε ο πίνακας Α να σαρώνεται με τον ταχύτερο τρόπο: for =1:size(A, ) for =1:size(A, ) s = s + A(i,j) Ασκήσεις 8.5 Δίνεται ο μονοδιάστατος πίνακας Α = [3, 0, -5, 2, 7, 12, 4, 1]. Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB με το οποίο: α) Να υπολογίζεται το άθροισμα και η μέση τιμή των στοιχείων του πίνακα Α. β) Οι ανωτέρω τιμές να τυπώνονται στο Command Window με κατάλληλη χρήση της εντολής fprintf (το άθροισμα ως ακέραιος και η μέση τιμή με 2 δεκαδικά ψηφία) π.χ.: "Sum=23, Mean=3.29". 8.6 Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB στο οποίο: α) να ζητούνται από το πληκτρολόγιο το πλήθος στοιχείων ενός μονοδιάστατου πίνακα, β) να εισάγονται από το πληκτρολόγιο τα στοιχεία του πίνακα, γ) να υπολογίζεται η μέγιστη και η ελάχιστη τιμή των στοιχείων του πίνακα. 8.7 Δίνεται ο μονοδιάστατος πίνακας Α = [3, 2, 2, 5, 3, 2, 3, 4, 6, 5, 4, 3, 3, 5, 4, 2]. Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB στο οποίο κάθε στοιχείο του πίνακα να αντικαθίσταται από τη μέση τιμή του εαυτού του και των δύο γειτονικών του (εξομάλυνση (smoothing) με τοπικό μέσο τριών σημείων). Για το πρώτο και το τελευταίο στοιχείο, να βρίσκεται η μέση τιμή του στοιχείου με το δεύτερο και το προτελευταίο αντίστοιχα. 8.8 Δίνεται ο δισδιάστατος πίνακας Α = [3, 0, -5, 2; 7, 12, 4, 1; -1, 3, 7, 0]. Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB το οποίο να υπολογίζει τη μέση τιμή των στοιχείων του πίνακα Α. Μετά τον υπολογισμό, η μέση τιμή πρέπει να τυπώνεται με ένα δεκαδικό ψηφίο, με κατάλληλη χρήση της εντολής fprintf. 8.9 Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB στο οποίο: α) να ζητούνται από το πληκτρολόγιο το πλήθος των γραμμών και των στηλών ενός δισδιάστατου πίνακα Α, β) να εισάγονται από το πληκτρολόγιο τα στοιχεία του πίνακα Α και γ) να υπολογίζεται η μέγιστη και η ελάχιστη τιμή των στοιχείων του Α.

Πίνακες 65 8.10 Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB το οποίο να αποθηκεύει τις τιμές των στοιχείων της κύριας διαγωνίου ενός τετράγωνου πίνακα Α (δηλ. ενός δισδιάστατου πίνακα με ίδιο πλήθος γραμμών και στηλών) σε ένα νέο μονοδιάστατο πίνακα Β. Για ε- φαρμογή να χρησιμοποιήσετε πίνακα Α της επιλογής σας. 8.11 Δίνεται ο δισδιάστατος πίνακας Α = [3, 0, -5, 2; 7, 12, 4, 1; -1, 3, 7, 0]. Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB στο οποίο: α) να βρίσκεται η μέση τιμή της 2 ης γραμμής του πίνακα. β) να βρίσκεται η μέγιστη τιμή των στηλών 3 και 4 του πίνακα. 8.12 Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB στο οποίο: (α) να ορίζεται δισδιάστατος πίνακας της επιλογής σας και (β) να καταμετράται το πλήθος των θετικών, των αρνητικών και των μηδενικών στοιχείων του πίνακα, τα οποία στο τέλος να τυπώνονται στο Command Window με κατάλληλη εντολή fprintf. 8.13 Δίνεται ο δισδιάστατος πίνακας Α = [3, -2, -5, 2; 7, -7, 0, 1; -1, 0, 7, -4]. Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB με το οποίο να αντικαθίστανται τα αρνητικά στοιχεία του πίνακα με τον αριθμό -1 και τα θετικά με τον αριθμό 1. 8.14 Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB στο οποίο: α) Αρχικά πρέπει να ζητούνται από το πληκτρολόγιο οι βαθμοί 5 μαθημάτων για 3 σπουδαστές, οι οποίοι να αποθηκεύονται σε έναν δισδιάστατο πίνακα Α του οποίου κάθε γραμμή θα περιέχει τους βαθμούς κάθε σπουδαστή. β) Στη συνέχεια, οι βαθμοί των σπουδαστών που «πέρασαν» το μάθημα (βαθμός 5) πρέπει να αποθηκεύονται σε ένα νέο μονοδιάστατο πίνακα Β. γ) Τέλος, πρέπει να υπολογίζεται το ποσοστό των σπουδαστών που «πέρασαν» το μάθημα και να τυπώνεται με κατάλληλη χρήση της εντολής fprintf, όπως στο παράδειγμα: To pososto twn spoydastwn poy perasan to ma8ima itan 80%. 8.15 Η σχέση μεταξύ των θερμοκρασιών σε βαθμούς Κελσίου και Φαρενάιτ είναι η εξής: 9 F C 32, όπου C η θερμοκρασία σε βαθμούς Κελσίου και F σε Φαρενάιτ. 5 Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB στο οποίο: α) Να δημιουργηθεί ένας δισδιάστατος πίνακας Α του οποίου η πρώτη στήλη θα περιέχει βαθμούς θερμοκρασίας από 0 έως 100 ανά 5 βαθμούς Κελσίου (0, 5, 10, 15,, 100), ενώ η δεύτερη στήλη θα περιέχει τους αντίστοιχους βαθμούς σε Φαρενάιτ (32, 41, 50,, 212). β) Να υπολογιστεί η μέση τιμή των θερμοκρασιών σε βαθμούς Κελσίου και Φαρενάιτ του πίνακα Α οι οποίες να αποθηκευτούν σε ένα μονοδιάστατο πίνακα Β. γ) Να απεικονιστούν στο Command Window (i) ο πίνακας Α με disp, και (ii) οι τιμές του πίνακα Β με fprintf ώστε να εμφανίζεται το παρακάτω μήνυμα: Mean temperature is 50 Celcius or 122 Fahrenheit.

9 Ιδιαίτερος χειρισμός των πινάκων στο MATLAB Το MATLAB (MATrix LABoratory) έχει ιδιαίτερες και πολύ ισχυρές εγγενείς δυνατότητες χειρισμού πινάκων, που κάνει τον κώδικα συνεκτικό, σαφή και πολύ αποδοτικό. 9.1 Τελεστής «'» Ο τελεστής «'» δίπλα στον πίνακα δίνει τον ανάστροφό του (transpose: γραμμές ως στήλες και αντιστρόφως). Παραδείγματα Αποτελέσματα a = [2 5]' b = a' a = b = 2 5 2 5 9.2 Τελεστής «:» Στο MATLAB ο τελεστής «:» σημαίνει ένα από τα εξής, αναλόγως της θέσης του: Ομάδα αριθμών μεταξύ ορίων. Π.χ. Α=[5:9] σημαίνει Α=[5 6 7 8 9]. Όλα τα στοιχεία (όταν χρησιμοποιείται στη θέση του δείκτη των γραμμών ή των στηλών) Π.χ.: Α(2,:)=όλα τα στοιχεία της 2 ης γραμμής, A(:,:) = όλα τα στοιχεία. Μετατροπή σε πίνακα-στήλη (πρώτα η 1 η στήλη, μετά η 2 η κ.ο.κ.). Π.χ.: Α(:) Παραδείγματα Αποτελέσματα % Χρήση του τελεστή «:» για δημιουργία πίνακα A = [1:2:10 ; 2:2:10] A = % Χρήση του τελεστή «:» για επιλογή υποπεριοχής πίνακα 1 3 5 7 9 2 4 6 8 10 B = A(2,1:3) C = A(:,3) D = A(2,:) E = A(1:2, 3:4) B = C = D = E = 2 4 6 5 6 2 4 6 8 10 5 7 6 8 % Χρήση του τελεστή «:» για μετατροπή πίνακα 2 διαστάσεων σε πίνακα-στήλη: % Μετατροπή σε πίνακα-στήλη F = E(:) % Αντικατάσταση όλων των τιμών πίνακα χωρίς αλλαγή των διαστάσεών του. E(:) = 0; F = E = 5 6 7 8 0 0 0 0

Ιδιαίτερος χειρισμός των πινάκων στο MATLAB 67 9.3 Αναφορά στα στοιχεία πίνακα με μοναδικό δείκτη Είναι δυνατή η αναφορά σε ένα στοιχείο ενός οποιουδήποτε πίνακα με ένα μοναδικό δείκτη, ανεξάρτητα από το αν ο πίνακας είναι μονοδιάστατος, δισδιάστατος κλπ. Αυτό γίνεται γιατί το MATLAB αποθηκεύει τον πίνακα σε συνεχόμενες διευθύνσεις μνήμης, που αποτελείται από τις στήλες του πίνακα, τη μία κάτω από την άλλη. Αυτό γίνεται φανερό με τη μετατροπή του πίνακα σε πίνακα-στήλη με τον τελεστή «:»: Παράδειγμα G = [1 2 3 4 5 6] G(:) G(2) G(3) Αποτελέσματα G = 1 2 3 4 5 6 ans = 1 4 2 5 3 6 ans = 4 ans = 2 9.4 Χρήση του ως τελικού δείκτη Η δεσμευμένη λέξη, όταν χρησιμοποιείται σε πίνακα., εννοεί τον τελευταίο δείκτη. Στα επόμενα παραδείγματα θεωρούνται γνωστοί οι πίνακες της παραγράφου 9.2. Παραδείγματα Αποτελέσματα x = A(1,3:) x = 5 7 9 y = G(2:-1) y = 4 2 5 3 Z = G() z = 6 filename = 'brain.bmp'; ext = filename(-3:) ext =.bmp 9.5 Δημιουργία πινάκων με χρήση άλλων πινάκων Στο MATLAB μπορούν να δημιουργηθούν πίνακες με άμεση χρήση άλλων πινάκων: Παραδείγματα % Άμεση ανάθεση ολόκληρου πίνακα L = G Αποτελέσματα L = 1 2 3 4 5 6 % Ορισμός με χρήση πίνακα M = [L ; 7 8 9] M = 1 2 3 4 5 6 7 8 9

68 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 9.6 Εύρεση στοιχείων πίνακα υπό συνθήκες. Συνάρτηση find Η εύρεση των στοιχείων ενός πίνακα που υπακούουν σε μια συνθήκη γίνεται με δύο τρόπους: - Χρήση της συνθήκης στον πίνακα, με αποτέλεσμα ένα πίνακα ίδιων διαστάσεων, με λογικές τιμές 1 ή 0 (true ή false), ανάλογα με το αν το κάθε στοιχείο ικανοποιεί τη συνθήκη Π.χ.: Έστω ages = [23 44 50 18 25 34]. Τότε η ages>30 δίνει [0 1 1 0 0 1]. - Χρήση της συνάρτησης find, η οποία επιστρέφει αποτέλεσμα τους δείκτες του πίνακα που ικανοποιούν τη συνθήκη. Π.χ.: Έστω ages = [23 44 50 18 25 34]. Τότε η find(ages>30) δίνει [2 3 6]. Στη συνέχεια, αν το αποτέλεσμα κάποιου από τους δύο παραπάνω τρόπους εφαρμοστεί στον πίνακα (ή και σε άλλον), παίρνουμε τις τιμές αυτού του πίνακα που αντιστοιχούν στους δείκτες που ικανοποιούν τη συνθήκη στον αρχικό πίνακα. Π.χ.: Έστω ages = [23 44 50 18 25 34] και weights = [72 80 75 78 68 86]. Τότε: ages(ages>30) [44 50 34] ages(find(ages>30)) [44 50 34] weights(ages>30) [80 75 86] weights(find(ages>30)) [80 75 86] find γραμμικοί_δείκτες = find(λογική συνθήκη σε πίνακα) Επιστρέφονται οι γραμμικοί δείκτες του πίνακα (δηλαδή οι δείκτες που αναφέρονται στον πίνακα ως μοναδική στήλη, βλ. 9.3), για τα οποία αληθεύει η συνθήκη. ή [γραμμές, στήλες] = find(λογική συνθήκη σε πίνακα) Επιστρέφονται οι δείκτες των γραμμών και των στηλών των στοιχείων του πίνακα για τα οποία αληθεύει η συνθήκη. Παραδείγματα Αποτελέσματα A = [ 1-3 5 7 2 4 6 8-1 4 7-10]; index = find(a<0) [i,j] = find(a<0) ages = [23 44 50 18 25 34] weights = [72 80 75 78 68 86] weights(find(ages>30)) ages(find(ages>30)) index = 3 4 12 ans = 3 1 1 2 3 4 ages = 23 44 50 18 25 34 weights = 72 80 75 78 68 86 ans = 80 75 86 ans = 44 50 34

Ιδιαίτερος χειρισμός των πινάκων στο MATLAB 69 9.7 Σύγκριση πινάκων και των στοιχείων τους Το MATLAB διαθέτει συναρτήσεις για έλεγχο τόσο της ισότητας δύο πινάκων όσο και για τον έλεγχο της σχέσης των αντίστοιχων στοιχείων τους ένα προς ένα. a) Σύγκριση ισότητας πινάκων: Συνάρτηση isequal H συνάρτηση isequal δίνει με αποτέλεσμα λογικό 1 (true) ή 0 (false), αναλόγως με το αν 2 ή περισσότεροι πίνακες είναι ίσοι ή όχι. Σύνταξη: isequal(a, B, C,...). β) Σύγκριση πινάκων στοιχείο προς στοιχείο Οι σχεσιακοί τελεστές (==, ~=, <, >, <=, >=) μπορούν να εφαρμοστούν σε δύο πίνακες ίσων διαστάσεων, με αποτέλεσμα ένα πίνακα ίδιων επίσης διαστάσεων που σε κάθε θέση του έχει μια λογική μεταβλητή (1 ή 0), ανάλογα με το αν η σχέση ανάμεσα στα αντίστοιχα στοιχεία είναι αληθής ή όχι. Π.χ. [3 4 1] < [5 6 7] [1 1 0] γ) Έλεγχος αληθείας σχέσεων στοιχείων πινάκων: όλων (all) ή τουλάχιστον ενός (any) Η συνάρτηση all δέχεται ως είσοδο μια σχέση μεταξύ δύο πινάκων (==, ~=, <, >, <=, >=) και δίνει ως αποτέλεσμα λογικό 1 (true) αν η σχέση αληθεύει για όλα τα αντίστοιχα στοιχεία των δύο πινάκων. Παρόμοια, η συνάρτηση any δίνει αποτέλεσμα λογικό 1 αν η σχέση αληθεύει για τουλάχιστον ένα οποιοδήποτε ζεύγος στοιχείων των δύο πινάκων. Σημ: Οι συναρτήσεις all και any εφαρμόζονται με τον παραπάνω τρόπο σε δύο μονοδιάστατους πίνακες. Σε δισδιάστατους πίνακες, η εφαρμογή γίνεται κατά ζεύγη στηλών, παράγοντας έναν πίνακα γραμμή. Παράδειγμα Αποτελέσματα % Έστω ΟΙ πίνακες: A = [1 2 3] B = [0 2 3] A = B = 1 2 3 1 2 0 % α) Σύγκριση ισότητας πινάκων: isequal(a,b) ans = 0 % β) Σύγκριση πινάκων στοιχείο προς στοιχείο: A==B A>B % γ) Έλεγχος αληθείας όλων ή μιας τουλάχιστον σχέσης all(a>b) any(a>b) ans = 1 1 0 ans = 0 0 1 ans = 0 ans = 1

70 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 9.8 Συναρτήσεις ταξινόμησης πίνακα Ακολουθεί περιγραφή συναρτήσεων ταξινόμησης των στοιχείων ενός πίνακα: sort Y = sort(x) Αύξουσα ταξινόμηση κάθε στήλης (ξεχωριστά) του πίνακα X. Y = sort(x,n,'asc') ή Y = sort(x,n,'desc') Αύξουσα ('asc') ή φθίνουσα ταξινόμηση του πίνακα X κατά τη διάσταση n. [Y Ι] = sort( ) Επιστροφή του ταξινομημένου πίνακα στον Y και των αρχικών δεικτών στον Ι. sortrows Υ = sortrows(x) Ταξινόμηση των γραμμών του πίνακα X σύμφωνα με τις τιμές της πρώτης στήλης. Υ = sortrows(x,c) Ταξινόμηση των γραμμών του πίνακα X σύμφωνα με τις τιμές της στήλης C. Αν C>0, η ταξινόμηση είναι αύξουσα, αν C<0, η ταξινόμηση είναι φθίνουσα. Αν ο C είναι πίνακας-γραμμή, γίνεται ταξινόμηση πρώτα ως προς το πρώτο στοιχείο του C, μετά ως προς το δεύτερο κλπ. [Y Ι] = sortrows( ) Επιστροφή του ταξινομημένου πίνακα στον Y και των αρχικών δεικτών στον Ι. Παραδείγματα Αποτελέσματα A = [7 5-6;4-2 3] A = B = sort(a) B = 7 5-6 4-2 3 4-2 -6 7 5 3 [B I] = sort(a) B = I = B = sortrows(a) B = [B I] = sortrows(a) B = I = B = sortrows(a,-2) B = 4-2 -6 7 5 3 2 2 1 1 1 2 4-2 3 7 5-6 4-2 3 7 5-6 2 1 7 5-6 4-2 3

Ιδιαίτερος χειρισμός των πινάκων στο MATLAB 71 9.9 Συναρτήσεις και τελεστές χειρισμού πινάκων Ακολουθούν χρήσιμες συναρτήσεις και τελεστές του ΜATLAB για χειρισμό πινάκων: ' (μονό εισαγωγικό: τελεστής ανάστροφου πίνακα) ανάστροφος = πίνακας' Δημιουργία του ανάστροφου (transpose) του πίνακα (γραμμές ως στήλες και αντιστρόφως), π.χ. B = A' : Σημαίνει (α) ομάδα αριθμών ή (β) όλα τα στοιχεία μιας διάστασης ή (γ) μετατροπή σε στήλη Παραδείγματα (βλ. και 9.4): i / A(2,3:6) A(2:5,3:4) ii / A(2,:) A(:,3:4) iii / A(:) (τελευταίος δείκτης) Παράδειγμα (βλ και 9.1): A(2,3:) reshape πίνακαςpq = reshape(πίνακαςmn,p,q) Μετασχηματίζει έναν m n πίνακα σε p q, αρκεί να ισχύει m n=p q (π.χ. από 2 6 σε 3 4). repmat πίνακας2 = repmat(πίνακας1,m,n) Δημιουργία του πίνακα2 που αποτελείται από m n επαναλήψεις του πίνακα1. fliplr πίνακας2 = fliplr(πίνακας1) Δημιουργία του κατοπτρικού δεξιά-αριστερά ενός πίνακα. flipud πίνακας2 = flipud(πίνακας1) Δημιουργία του κατοπτρικού άνω-κάτω ενός πίνακα. rot90 πίνακας2 = rot90(πίνακας1) Περιστροφή πίνακα κατά 90 αριστερόστροφα. tril πίνακας2 = tril(πίνακας1) Δημιουργία του πίνακα2 με το κάτω αριστερά τριγωνικό τμήμα του πίνακα1. triu πίνακας2 = triu(πίνακας1) Δημιουργία του πίνακα2 με το άνω δεξιά τριγωνικό τμήμα του πίνακα1. diag πίνακαςστήλη = diag(πίνακας) Δημιουργία πίνακα-στήλη με την κύρια διαγώνιο του πίνακα. ή πίνακας = diag(μονοδιάστατοςπίνακας) Δημιουργία πίνακα που έχει ως κύρια διαγώνιο ένα μονοδιάστατο πίνακα.

72 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Παραδείγματα Αποτελέσματα >> A = [1 2 3 4 5 6 7 8 9-1 -2-3] A = 1 2 3 4 5 6 7 8 9-1 -2-3 >> A' ans = 1 4 7-1 2 5 8-2 3 6 9-3 >> repmat(a,1,2) ans = 1 2 3 1 2 3 4 5 6 4 5 6 7 8 9 7 8 9-1 -2-3 -1-2 -3 >> reshape(a,2,6) ans = 1 7 2 8 3 9 4-1 5-2 6-3 >> fliplr(a) ans = 3 2 1 6 5 4 9 8 7-3 -2-1 >> flipud(a) ans = -1-2 -3 7 8 9 4 5 6 1 2 3 >> rot90(a) ans = 3 6 9-3 2 5 8-2 1 4 7-1 >> tril(a) ans = 1 0 0 4 5 0 7 8 9-1 -2-3 >> triu(a) ans = 1 2 3 0 5 6 0 0 9 0 0 0 >> diag(a) ans = 1 5 9 >> diag([-4 12 7]) ans = -4 0 0 0 12 0 0 0 7

Ιδιαίτερος χειρισμός των πινάκων στο MATLAB 73 9.10 Αλγεβρικές πράξεις πινάκων Οι αριθμητικές πράξεις μπορούν να γίνουν στο MATLAB κατ ευθείαν ανάμεσα σε ολόκληρους πίνακες. Ο πολλαπλασιασμός, η ύψωση σε δύναμη και η διαίρεση πινάκων γίνονται με τους γνωστούς αλγεβρικούς τρόπους, (από το μαθηματικό πεδίο της γραμμικής άλγεβρας): Πράξεις πίνακα με αριθμό (+, -, *, /) Η πράξη γίνεται στοιχείο προς στοιχείο με τον αριθμό. A = [10 20 30] B = A+2 C = A-4 D = 2*A E = A/2 % προσοχή, όχι 2/A A = 10 20 30 B = 12 22 32 C = 6 16 26 D = 20 40 60 E = 5 10 15 Πρόσθεση και αφαίρεση πινάκων (+, -) Οι πίνακες πρέπει να έχουν ίδιες διαστάσεις και η πράξη γίνεται στοιχείο προς στοιχείο. A = [1 2 3;4 5 6] B = -A; C = A + B A = C = 1 2 3 4 5 6 0 0 0 0 0 0 Πολλαπλασιασμός πινάκων (A*B) Αν ο Α είναι m n, τότε ο Β πρέπει να είναι n k, και τότε το γινόμενό τους είναι m k. A = [1 2 3;4 5 6]; B = [3-4 ;-1 6 ; 2 0]; C = A * B C = 7 8 19 14 Ύψωση πίνακα σε δύναμη (^) Ο πίνακας πρέπει να είναι τετράγωνος. Όταν η δύναμη είναι θετικός ακέραιος, η ύψωση πίνακα σε δύναμη είναι ισοδύναμη με τον πολλαπλασιασμό του πίνακα με τον εαυτό του. Όταν η δύναμη είναι -1, το αποτέλεσμα είναι ο αντίστροφος του πίνακα (ισοδύναμο με χρήση της inv). A = [1 2;0 5]; % Ύψωση στο τετράγωνο B = A^2 % Εύρεση αντιστρόφου (ισοδύναμο με inv) C = Α^(-1) Διαίρεση πινάκων (A/B) B = C = 1 12 0 25 1-0.4 0 0.2 Είναι ισοδύναμη με τον πολλαπλασιασμό του Α με τον αντίστροφο του Β (A*inv(B)), π.χ. η λύση του συστήματος X B =A είναι η X=A/B. Ο αντίστροφος του B (που ορίζεται μόνο αν ο πίνακας είναι τετράγωνος) βρίσκεται με τη συνάρτηση inv, είτε με ύψωση στη δύναμη -1. A = [1 2;3 4;5 6]; B = [3-4 ;-1 6]; D = A / B D = 0.57143 0.71429 1.5714 1.7143 2.5714 2.7143

74 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Αντίστροφη διαίρεση πινάκων (A\B) Είναι ισοδύναμη με τον πολλαπλασιασμό του αντίστροφου του Α με τον Β (inv(a)*b), αλλά είναι ταχύτερη και μεγαλύτερης ακρίβειας, γιατί χρησιμοποιείται διαφορετική μέθοδος διαίρεσης, χωρίς ενδιάμεση εύρεση του αντιστρόφου του Α. Είναι η συνιστώμενη μέθοδος για λύση του συστήματος A X=B, δηλ. X=A\B. Παράδειγμα: Έστω το σύστημα γραμμικών εξισώσεων (βλ. και παράδειγμα 8.4): 2x 1 + 3x 1 = 6 4x 2 + 9x 2 = 15 Επίλυση συστήματος με χρήση πινάκων: Το σύστημα μπορεί να γραφτεί σε μορφή πινάκων ως: 2 3 AX = B, όπου A=, 6 x1 B= και X= 4 9 15 x 2 Πολλαπλασιάζοντας από αριστερά με A -1, η λύση του συστήματος είναι η: X = A -1 B Εύρεση της λύσης με τη βοήθεια του MATLAB: A = [2 3 4 9]; B = [6 15]; Χ = inv(a)*b % ή Χ = A^(-1)*B % ή Χ = A\B % (συνιστώμενη μέθοδος) X = 1.5 1 9.11 Στοιχείο-προς-στοιχείο πολλαπλασιαστικές πράξεις πινάκων στο MATLAB Στο MATLAB είναι δυνατή η απ ευθείας στοιχείο-προς-στοιχείο εκτέλεση πολλαπλασιασμού, ύψωσης σε δύναμη και διαίρεσης μεταξύ πινάκων. Οι τελεστές που χρησιμοποιούνται είναι οι ίδιοι με των αντίστοιχων αλγεβρικών πράξεων, μαζί με μια τελεία (.*.^./) Πολλαπλασιασμός, Ύψωση σε δύναμη, και Διαίρεση στοιχείο-προς-στοιχείο (.*.^./) Η πράξη γίνεται ανάμεσα στους πίνακες, στοιχείο προς στοιχείο. A = [1 2 3;4 5 6]; B = -A; C = -1-4 -9-16 -25-36 C = A.* B D = A./ B E = A.^ 2 D = E = -1-1 -1-1 -1-1 1 4 9 16 25 36

Ιδιαίτερος χειρισμός των πινάκων στο MATLAB 75 9.12 Δημιουργία ειδικών πινάκων Το ΜATLAB διαθέτει συναρτήσεις που παράγουν με απλό τρόπο χρήσιμους πίνακες: zeros <πίνακας> = zeros(m,n) Δημιουργία μηδενικού πίνακα m n. Χρησιμοποιείται συχνά και για αρχική δέσμευση του πίνακα στη μνήμη (pre-allocation), για αύξηση της ταχύτητας σάρωσης. ones <πίνακας> = ones(m,n) Δημιουργία πίνακα m n με όλα τα στοιχεία ίσα με τη μονάδα. eye <πίνακας> = eye(m) Δημιουργία μοναδιαίου πίνακα m m (δηλαδή τετράγωνου πίνακα με τα στοιχεία της κύριας διαγωνίου του ίσα με τη μονάδα και παντού αλλού μηδέν). rand, randn, randi <πίνακας> = rand(m,n) <πίνακας> = randn(m,n) <πίνακας> = randi([a b],m,n) Δίνει πίνακα m n με τυχαίους αριθμούς, είτε ομοιόμορφης κατανομής από 0 έως 1 (rand), είτε κανονικής κατανομής με μέση τιμή 0 και τυπική απόκλιση 1 (randn), είτε ακέραιους από a έως και b (randi). Oι αριθμοί που παράγονται από τις rand, randn, randi είναι ψευδοτυχαίοι, δηλαδή δημιουργούνται από συγκεκριμένο αλγόριθμο και επαναλαμβάνονται με περίοδο που (στο MATLAB) είναι 2 32. Σε κάθε εκκίνηση του MATLAB, οι ψευδοτυχαίοι αριθμοί ξεκινούν από το ίδιο σημείο. Αν απαιτείται παραγωγή διαφορετικού ψευδοτυχαίου κατά την εκκίνηση του MATLAB, η rand/randn πρέπει να τεθεί σε άλλη αρχική κατάσταση, με την εντολή: rand('state',n), όπου n ένας ακέραιος από 0 έως 2 32-1. magic <πίνακας> = magic(ν) Δημιουργία «μαγικού τετραγώνου» Ν Ν (τετράγωνος πίνακας με όλους τους ακέραιους από 1 έως Ν^2 και με ίσο άθροισμα σε κάθε γραμμή, στήλη και διαγώνιο. linspace <πίνακας_γραμμή> = linspace(a,b,n) Δημιουργία πίνακα-γραμμής με n ακεραίους από a έως b που ισαπέχουν. Παραδείγματα Αποτελέσματα A = zeros(2,3) A = B = ones(1,4) B = I = eye(2) I = 0 0 0 0 0 0 1 1 1 1 1 0 0 1 R = rand(2,3) R = 0.13889 0.19872 0.27219 0.20277 0.60379 0.19881

76 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB % Αρχικοποίηση του rand από διαφορετική κατάσταση κάθε φορά: rand('state',sum(100*clock)); % Παραγωγή τυχαίων ακέραιων από 1 έως n n = 75; R = ceil(n*rand(100,1)); % Παραγωγή τυχαίων αριθμών από a έως b a = 10; b = 50; x = a + (b-a) * rand(5); % Παραγωγή 5 ακεραίων από 0 έως 100 % που ισαπέχουν linspace(0,100,5) ans = 0 25 50 75 100 % Παραγωγή «μαγικών» τετραγώνων % (με ίδιο άθροισμα γραμμών, στηλών % και διαγωνίων) A = magic(3) A = 8 1 6 3 5 7 4 9 2 9.13 Συναρτήσεις εύρεσης συγκεντρωτικών μεγεθών από τα στοιχεία ενός πίνακα Το MATLAB διαθέτει μεγάλο πλήθος έτοιμων συναρτήσεων για υπολογισμό συγκεντρωτικών και στατιστικών μεγεθών από τα στοιχεία ενός πίνακα (βλ. και κεφ. 15). Π.χ.: min(a), max(a): Ελάχιστη τιμή, Μέγιστη τιμή sum(a), prod(a): Άθροισμα, Γινόμενο mean(a), std(a): Μέση τιμή, Τυπική απόκλιση Οι παραπάνω συναρτήσεις εφαρμόζονται στα στοιχεία ενός πίνακα (A) ως εξής: Αν ο πίνακας είναι μονοδιάστατος, τότε η συνάρτηση εφαρμόζεται σε όλα τα στοιχεία του (π.χ. sum([3 1 5]) 9, min([3 1 5]) 1). Αν ο πίνακας είναι δύο διαστάσεων, τότε η συνάρτηση εφαρμόζεται σε κάθε στήλη του πίνακα ξεχωριστά, και τα αποτελέσματα εξάγονται σε έναν πίνακα-γραμμή: Παράδειγμα A = [1 5 3 4 2 6] Αποτέλεσμα A = 1 5 3 4 2 6 B = min(a) C = sum(a) B = C = 1 2 3 5 7 9 Για να εφαρμοστούν οι συναρτήσεις αυτές σε όλα τα στοιχεία ενός δισδιάστατου πίνακα, πρέπει αυτός να μετατραπεί πρώτα σε μονοδιάστατο (π.χ. με χρήση του τελεστή «:» που μετατρέπει έναν πίνακα σε πίνακα-στήλη, βλ. και 9.2). Π.χ: D = sum(a(:)) D = 21

Ιδιαίτερος χειρισμός των πινάκων στο MATLAB 77 9.14 Αραιοί (sparse) πίνακες Όταν το πλήθος των μηδενικών στοιχείων σε έναν πίνακα είναι μεγάλο (π.χ. άνω του 75%) γίνεται σημαντική εξοικονόμηση μνήμης όταν ο πίνακας μετατραπεί σε αραιό (sparse). Οι αραιοί πίνακες δεν είναι διαφορετικοί, απλώς αλλάζει ο τρόπος αποθήκευσής τους στη μνήμη: Συγκεκριμένα, αποθηκεύονται μόνο τα μη μηδενικά στοιχεία με τους αντίστοιχους δείκτες τους. Οι πράξεις με τους αραιούς πίνακες γίνονται όπως και με τους κοινούς (πλήρεις). Μετατροπή πίνακα σε αραιό (δηλαδή, αλλαγή του τρόπου αποθήκευσης στη μνήμη, με αποθήκευση μόνο των μη μηδενικών στοιχείων του πίνακα και των αντίστοιχων δεικτών τους): Υ = sparse(x) Μετατροπή του πίνακα X στον αραιό πίνακα Υ. Π.χ.: >> X = [0 0 0 8 ; 0 0 0 0 ; 0 12 0 0] X = 0 0 0 8 0 0 0 0 0 12 0 0 >> Υ = sparse(x) whos Y = (3,2) 12 (1,4) 8 Name Size Bytes Class Attributes X 4x3 96 double Υ 4x3 64 double sparse X = full(y) Μετατροπή του αραιού πίνακα Y στον πλήρη X. Δημιουργία αραιού πίνακα εξ αρχής (η δυνατότητα μετατροπής ενός πλήρους πίνακα σε αραιό ίσως να μην λύνει πάντα ένα πρόβλημα μνήμης, γιατί μπορεί ο πλήρης πίνακας να μην μπορεί καν να δημιουργηθεί λόγω μεγέθους): Υ = sparse(i,j,s,m,n), όπου i = πίνακας με τους δείκτες των γραμμών των μη μηδενικών στοιχείων (ή ο δείκτης μόνο μιας γραμμής, αν δεν υπάρχουν μη μηδενικά στοιχεία σε άλλες). j = πίνακας με τους δείκτες των στηλών των μη μηδενικών στοιχείων (ή ο δείκτης μόνο μιας στήλης, αν δεν υπάρχουν μη μηδενικά στοιχεία σε άλλες). s = πίνακας με τις τιμές των μη μηδενικών στοιχείων (ή μόνο μια τιμή, αν είναι ίδια παντού). m,n = οι διαστάσεις του πίνακα (είναι προαιρετικές: αν λείπουν, λαμβάνονται ίσες με τους μεγαλύτερους δείκτες των i, j: m=max(i), n = max(j)). Π.χ.1: Δημιουργία του παραπάνω αραιού πίνακα Y εξ αρχής (χωρίς μετατροπή από τον Χ): >> i = [3 1]; >> j = [2 4]; >> s = [12 8]; >> S = sparse(i,j,s) >> full(s) S = (3,2) 12 (1,4) 8 ans = 0 0 0 8 0 0 0 0 0 12 0 0

78 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Π.χ.2: Δημιουργία αραιού πίνακα 3 4 με τα στοιχεία της 2 ης στήλης ίσα με -1: >> S = sparse(1:3,2,-1,3,4) >> full(s) S = (1,2) -1 (2,2) -1 (3,2) -1 ans = 0-1 0 0 0-1 0 0 0-1 0 0 Π.χ.3: Δημιουργία του μοναδιαίου πίνακα 3 3 (στοιχεία κύριας διαγωνίου = 1): >> S = sparse(1:3,1:3,1) S = (1,1) 1 (2,2) 1 (3,3) 1 >> full(s) Π.χ.4: Δημιουργία μηδενικού πίνακα 3 4: >> S = sparse([],[],0,3,4) ans = 1 0 0 0 1 0 0 0 1 S = All zero sparse: 3-by-4 >> full(s) ans = 0 0 0 0 0 0 0 0 0 0 0 0 Δημιουργία αραιού πίνακα με προδέσμευση επιπλέον στοιχείων (με σκοπό την ταχύτερη προσθήκη επιπλέον στοιχείων αργότερα): Υ = sparse(i,j,s,m,n,nzmax) Με τον τρόπο αυτό γίνεται προδέσμευση μνήμης για ταχύτερη προσθήκη επιπλέον στοιχείων αργότερα. Το nzmax πρέπει να είναι μεγαλύτερο από το πλήθος των μη μηδενικών στοιχείων (=length(s)). Το πλήθος των θέσεων που προδεσμεύονται είναι ίσο με τη διαφορά nzmax - length(s). Π.χ.1: Δημιουργία αραιού πίνακα N 3 με Ν μονάδες στη 2 η στήλη. Μετά, προσθήκη Ν τυχαίων στοιχείων. N = 100000; tic x = sparse(1:n,2,1,n,3); for i=1:n, x(i,3) = rand; ; toc Elapsed time is 28.259130 seconds. Π.χ.2: Το ίδιο παράδειγμα με προηγουμένως, αλλά με δέσμευση για 2*N στοιχεία (δηλαδή τα N υπάρχοντα στη 2 η στήλη, και τα N που πρόκειται να προστεθούν στην 3 η στήλη). Στην περίπτωση αυτή, οι θέσεις των N στοιχείων της 3 ης στήλης είναι προδεσμευμένες και η προσθήκη τους γίνεται πολύ ταχύτερα. N = 100000; tic x = sparse(1:n,2,1,n,3,2*n); for i=1:n, x(i,3) = rand; ; toc Elapsed time is 6.394125 seconds.

Ιδιαίτερος χειρισμός των πινάκων στο MATLAB 79 9.15 Συνοπτική παρουσίαση εντολών και συναρτήσεων πινάκων και διαδικασιών γραμμικής άλγεβρας με το σύστημα βοηθείας του MATLAB: elmat και matfun Λίστα με τις απλές εντολές χειρισμού πινάκων του MATLAB εμφανίζεται στο Command Window με την εντολή help elmat (ή doc elmat, στο παράθυρο της Βοήθειας). Επίσης, λίστα με περισσότερο προχωρημένες συναρτήσεις πινάκων και διαδικασίες γραμμικής άλγεβρας στο MATLAB εμφανίζεται στο Command Window με την εντολή help matfun (ή doc matfun, στο παράθυρο της Βοήθειας).

10 Συμβολοσειρές Οι συμβολοσειρές (πίνακες χαρακτήρων, σειρές χαρακτήρων, character arrays, strings) είναι ομάδες αλφαριθμητικών χαρακτήρων. Μια συμβολοσειρά είναι στην πραγματικότητα έ- νας πίνακας που τα στοιχεία του είναι μεταβλητές χαρακτήρα. Αν και οι πίνακες χαρακτήρων μπορούν να είναι πολλών διαστάσεων, συνήθως χρησιμοποιούνται οι μίας διάστασης. Στο εξής με τον όρο «συμβολοσειρές» θα εννοούμε τους μονοδιάστατους πίνακες χαρακτήρων. Επειδή οι συμβολοσειρές είναι πίνακες, εφαρμόζονται σ αυτές όλες οι συναρτήσεις των αριθμητικών πινάκων (π.χ. η length(s) δίνει το πλήθος των χαρακτήρων μιας μονοδιάστατης συμβολοσειράς S). Όμως, υπάρχουν και επιπλέον συναρτήσεις, με χρήση αποκλειστικά σε συμβολοσειρές (π.χ. η strcmp, για σύγκριση δύο συμβολοσειρών). 10.1 Ανάθεση τιμών συμβολοσειράς Η ανάθεση μιας συμβολοσειράς σε μια μεταβλητή μπορεί να γίνει ως ανάθεση μεμονωμένων χαρακτήρων σε έναν πίνακα, αλλά γίνεται και απλούστερα. Τα παρακάτω παραδείγματα παράγουν την ίδια συμβολοσειρά: S = ['H', 'e', 'l', 'l', 'o']; S = ['Hello']; S = 'Hello'; 10.2 Συναρτήσεις συμβολοσειρών strcat <συμβολοσειρά> = strcat(<συμβ1>, <συμβ2>, <συμβ3>,...) Συνένωση (concatenation) συμβολοσειρών με εξαφάνιση των κενών διαστημάτων στο τέλος τους. Για τη διατήρηση των κενών διαστημάτων τέλους, οι συμβολοσειρές πρέπει να συνενωθούν ως εξής: <συμβολοσειρά> = [<συμβ1>, <συμβ2>, <συμβ3>,...] Παραδείγματα S1 = 'John'; S2 = strcat('hello ', S1) S3 = ['Hello ', S1] Αποτελέσματα S2 = HelloJohn S3 = Hello John strcmp strcmp(<συμβολοσειρά1>, <συμβολοσειρά>) Σύγκριση συμβολοσειρών: Δίνει ως αποτέλεσμα λογικό 1 αν οι συμβολοσειρές είναι ίδιες και 0 αν όχι. Οι πεζοί χαρακτήρες θεωρούνται διαφορετικοί από τους κεφαλαίους. (Παρόμοια σύγκριση μπορεί να γίνει και με την isequal, βλ. 9.7). strcmpi strcmpi(<συμβολοσειρά1>, <συμβολοσειρά2>) Σύγκριση συμβολοσειρών χωρίς διαφορά πεζών-κεφαλαίων: Δίνει ως αποτέλεσμα λογικό 1 αν οι συμβολοσειρές είναι ίδιες και 0 αν όχι, όπου όμως η διαφορά πεζώνκεφαλαίων δεν λαμβάνεται υπ όψιν. Για το λόγο αυτό, η strcmpi είναι περισσότερο χρήσιμη σε περιπτώσεις όπως έρευνας σε βάση δεδομένων π.χ. με βάση το όνομα ενός ασθενούς, σε περιπτώσεις αλφαβητικής ταξινόμησης κλπ. Παραδείγματα Αποτελέσματα strcmp('face','face') ans = 0 strcmpi('face','face') ans = 1

Συμβολοσειρές 81 str2num <αριθμητική_μεταβλητή> = str2num('σειρά_χαρακτήρων') Μετατροπή της 'σειράς_χαρακτήρων' στην αριθμητική της αναπαράσταση, αν αυτό είναι δυνατόν. Η σειρά χαρακτήρων μπορεί να περιέχει τα ψηφία (0...9), την υποδιαστολή (.), το πρόσημο (+ ή -), τα σύμβολα των πράξεων (+, -, *, /) και τον τελεστή e (ύψωση σε δύναμη με βάση 10). num2str <μεταβλητή_συμβολοσειράς>= num2str(<αριθμητική_μεταβλητή>, 'μορφή') Μετατροπή της τιμής της αριθμητικής μεταβλητής σε συμβολοσειρά. Η 'μορφή' (αν υπάρχει) δηλώνει σε ποια μορφή θα μετατραπεί η αριθμητική μεταβλητή (%d, %f, %c, %s, κλπ, βλέπε στους ειδικούς χαρακτήρες μορφής της fprintf, 5.6). Παραδείγματα Αποτελέσματα x = str2num('2*11-5') x = 17 pi314 = num2str(pi,'%.2f') pi314 = 3.14 sprintf <συμβολοσειρά> = sprintf('παράσταση', <μεταβλητές>) Δημιουργία συμβολοσειράς με τη βοήθεια της 'παράστασης' και των μεταβλητών. H 'παράσταση' περιέχει κείμενο καθώς και προαιρετικά ειδικούς χαρακτήρες μορφής και θέσης (όπως ακριβώς και στην fprintf). Σημείωση 1: Αν η sprintf χρησιμοποιηθεί χωρίς ελληνικό ερωτηματικό στο τέλος, τότε έχει παρόμοια αποτελέσματα με τη συνάρτηση fprintf (ειδικά σε συνδυασμό με τη disp, δηλαδή disp(sprintf(...)). Σημείωση: Η διαφορά των sprintf και fprintf από την disp είναι ότι στη disp δεν «λειτουργούν» οι ειδικοί χαρακτήρες μορφής και θέσης των sprintf και fprintf (δηλαδή οι \n, %d, %f κλπ). Σημείωση 2: Η sprintf μπορεί να χρησιμοποιηθεί για την εύρεση του ASCII κωδικού (σε μορφή χαρακτήρων) ενός χαρακτήρα, και το αντίστροφο, ως εξής: <ASCII κωδικός σε μορφή χαρακτήρων> = sprintf('%d',<χαρακτήρας>) <χαρακτήρας> = sprintf('%c',<ακέραιος>) Το παραπάνω παράδειγμα δείχνει και την πραγματική λειτουργία των ειδικών χαρακτήρων μορφής (%c, %d, %f κλπ) που χρησιμοποιούνται στην 'παράσταση' των sprintf και fprintf, η οποία είναι η «μετατροπή» της μεταβλητής σε άλλη μορφή. Παράδειγμα: c = sprintf('%c',65); % Στη μεταβλητή c αποθηκεύεται ο χαρακτήρας 'Α' x = sprintf('%d','a'); % Στη μεταβλητή x αποθηκεύεται το string '65' Στη συνέχεια, με str2num(x) μπορεί να ληφθεί ο κωδικός ASCII σε αριθμητική μορφή. Παραδείγματα % Δημιουργία σύνθετης συμβολοσειράς name = 'John'; age = 40; phrase = sprintf('%s is %d years old',name,age) % Απεικόνιση των εκτυπώσιμων ASCII χαρακτήρων for i=32:126 fprintf('%d: %c\n',i,i); Αποτελέσματα phrase = John is 40 years old 32: 33:!... 65: Α 66: Β... 125: } 126: ~

82 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 10.3 Συνοπτική παρουσίαση συναρτήσεων συμβολοσειρών του MATLAB: strfun Λίστα με τις συναρτήσεις συμβολοσειρών του MATLAB εμφανίζεται στο Command Window με την εντολή help strfun (ή doc strfun, στο παράθυρο της Βοήθειας). Ερωτήσεις 10.1 Να αναφερθούν δύο τρόποι συνένωσης συμβολοσειρών μαζί με μία διαφορά μεταξύ τους. 10.2 Πρόκειται να γραφτεί ένα πρόγραμμα το οποίο, ανάμεσα στα άλλα, θα ανευρίσκει έ- ναν ασθενή, με βάση το επώνυμό του, από μια βάση δεδομένων ενός νοσοκομείου. Να αναφερθεί ποια από τις δύο συναρτήσεις, strcmp ή strcmpi, θα πρέπει να χρησιμοποιηθεί, και γιατί. 10.3 Να σημειωθούν στις αγκύλες με [Χ] όσες προτάσεις είναι σωστές: [ ] Οι συμβολοσειρές είναι πίνακες. [ ] Μια συμβολοσειρά δεν μπορεί να περιέχει τα σύμβολα \ και %. [ ] Στις συμβολοσειρές αποθηκεύονται χαρακτήρες (γράμματα a z, A Z και σύμβολα) αλλά όχι αριθμητικά ψηφία (0 9). [ ] Ο πρώτος χαρακτήρας μιας μονοδιάστατης συμβολοσειράς S είναι ο S(0). [ ] Ο τελευταίος χαρακτήρας μιας μονοδιάστατης συμβολοσειράς S είναι ο S(length(S)). [ ] Η εντολή (συνάρτηση) strcmp('patient',' #4') έχει ως αποτέλεσμα τη συνένωση των δύο συμβολοσειρών σε μία ('Patient #4'). [ ] Η εντολή (συνάρτηση) strcat χρησιμοποιείται για τη σύγκριση ισότητας δύο συμβολοσειρών. [ ] Η str2num δέχεται ως είσοδο αριθμητικές μεταβλητές. 10.4 Να σημειωθούν με [Σ] οι σωστές και με [Λ] οι λανθασμένες απαντήσεις (σωστές μπορεί να είναι μία, καμία, ή περισσότερες από μία απαντήσεις): α) Το πλήθος των στοιχείων μιας μονοδιάστασης συμβολοσειράς Α ισούται με: [ ] length(a) [ ] size(a) [ ] size(a,1) [ ] size(a,2) β) Ο δεύτερος χαρακτήρας μιας μονοδιάστατης συμβολοσειράς S είναι ο: [ ] S(1,2) [ ] S(2,1) [ ] S(2,2) γ) Έστω η συμβολοσειρά S = 'anna'. Η εντολή strcmpi(s,'anna') δίνει: [ ] 1 [ ] 0 [ ] true [ ] false [ ] Μήνυμα σφάλματος

Συμβολοσειρές 83 Ασκήσεις 10.5 Έστω οι εντολές: name = 'John'; w = 85; h = 182; Έστω ότι πρέπει, με βάση τις προηγούμενες μεταβλητές, να δημιουργηθεί η ακόλουθη σύνθετη συμβολοσειρά με όνομα message: message = 'Patient John weights 85kg and has height 1.82m' α) Να δημιουργηθεί η παραπάνω συμβολοσειρά με κατάλληλη χρήση της συνάρτησης sprintf : message = sprintf(' '); β) Να δημιουργηθεί η παραπάνω συμβολοσειρά με κατάλληλη χρήση αγκυλών ([ ])με σκοπό τη συνένωση επιμέρους συμβολοσειρών (απαιτείται και χρήση της συνάρτησης num2str): message = [ ]; 10.6 Να συμπληρωθούν οι παρακάτω εντολές, με τις οποίες ζητούνται από το πληκτρολόγιο το όνομα και η επέκταση ενός αρχείου, τα οποία στη συνέχεια συνενώνονται, χωρισμένα με τελεία (.), σε μία νέα συμβολοσειρά που να περιέχει το πλήρες όνομα του αρχείου. Η συνένωση γίνεται (α) με χρήση αγκυλών ([ ]) και (β) με τη συνάρτηση sprintf: name = input( ); % Π.χ. έστω ότι εισαχθεί 'brain' ext = input( ); % Π.χ. έστω ότι εισαχθεί 'jpg' % Π.χ. πρέπει να δημιουργηθεί το όνομα 'brain.bmp': filename = [ ]; filename = sprintf( ); 10.7 Έστω οι εντολές: path = 'c:\patientdata'; name = 'brain'; extension = 'jpg'; Έστω ότι πρέπει, με βάση τις προηγούμενες μεταβλητές, να δημιουργηθεί η ακόλουθη σύνθετη συμβολοσειρά με όνομα fullname: fullname = ' c:\patientdata\brain.jpg' α) Να δημιουργηθεί η παραπάνω συμβολοσειρά με κατάλληλη χρήση της συνάρτησης sprintf : message = sprintf(' '); β) Να δημιουργηθεί η παραπάνω συμβολοσειρά με κατάλληλη χρήση αγκυλών ([ ]) με σκοπό τη συνένωση επιμέρους συμβολοσειρών: message = [ ]; 10.8 Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB με το οποίο α) θα ζητείται με input το όνομά σας και θα αποθηκεύεται σε μια μεταβλητή β) θα αποθηκεύεται με sprintf σε μια νέα μεταβλητή το ακόλουθο μήνυμα: The name has ------- characters όπου στις τελίτσες ( ) βρίσκεται το όνομα που θα δίνετε από το πληκτρολόγιο και στις παυλίτσες (------) θα βρίσκεται το πλήθος των χαρακτήρων του ονόματος. γ) Η νέα αυτή μεταβλητή θα τυπώνεται με disp στην οθόνη. 10.9 Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB με το οποίο α) να ζητείται από το πληκτρολόγιο μια συμβολοσειρά μιας διάστασης και

84 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB β) στη συνέχεια οι χαρακτήρες της συμβολοσειράς να τυπώνονται ο ένας κάτω από τον άλλον με fprintf στο Command Window. 10.10 Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB στο οποίο α) να ζητείται από το πληκτρολόγιο μια συμβολοσειρά και β) στη συνέχεια να τυπώνονται με fprintf στο Command Window ο κωδικός ASCII του κάθε χαρακτήρα της συμβολοσειράς, ο ένας κάτω από τον άλλον. 10.11 Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB στο οποίο α) να ζητούνται από το πληκτρολόγιο δύο συμβολοσειρές, β) στη συνέχεια συμβολοσειρές να συγκρίνονται και γ) τέλος, να τυπώνεται με fprintf στο Command Window ένα από τα δύο παρακάτω μηνύματα: String <str1> is equal to string <str2> String <str1> is NOT equal to string <str2> αναλόγως αν με τη σύγκριση οι συμβολοσειρές προέκυψαν ίσες ή όχι (προσοχή: στη θέση των <str1> και <str2> πρέπει να βρίσκονται οι συμβολοσειρές που εισήχθησαν από το πληκτρολόγιο). 10.12 Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB μέσα στο οποίο να ζητούνται το ό- νομα και το επώνυμο ενός ασθενούς (με δύο διαδοχικές input) και στη συνέχεια να τυπώνεται στο Command Window με fprintf το μήνυμα: The name <Onoma> <Epwnymo> has initials <O>. <E>. (στη θέση των <Onoma> και <Epwnymo> πρέπει να βρίσκονται το όνομα και το επώνυμο του ασθενούς, όπως εισήχθησαν από το πληκτρολόγιο με τις δύο input, ενώ στη θέση των <O> και <E> πρέπει να βρίσκονται τα αρχικά του ονόματος και του επωνύμου). 10.13 Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB το οποίο να μετατρέπει τη θερμοκρασία από βαθμούς Κελσίου σε Φαρενάιτ και το αντίστροφο. Η θερμοκρασία πρέπει να δίνεται από το πληκτρολόγιο (input) μαζί με τις μονάδες της (π.χ. 100C ή 451F) και το πρόγραμμα πρέπει να αναγνωρίζει αυτόματα αν είναι Κελσίου ή Φαρενάιτ από τον τελευταίο χαρακτρήρα (C ή F) και να κάνει αυτόματα την κατάλληλη μετατροπή. 9 Η σχέση των κλιμάκων θερμοκρασιών Κελσίου και Φαρενάιτ είναι: TF 5 TC 32 Υπόδειξη: Η εισαγωγή της θερμοκρασίας με τη μονάδα της πρέπει να γίνεται ως συμβολοσειρά. Στη συνέχεια θα αναγνωρίζεται ο τελευταίος χαρακτήρας της (C ή F), ενώ το υπόλοιπο τμήμα της συμβολοσειράς θα μετατρέπεται με κατάλληλη συνάρτηση σε αριθμό. Τέλος, θα ακολουθεί η μετατροπή των μονάδων. 10.14 Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB το οποίο να καταμετρά τη συχνότητα εμφάνισης κάθε χαρακτήρα μιας πρότασης που θα δίνεται από το πληκτρολόγιο. Π.χ. το αποτέλεσμα της εκτέλεσης του προγράμματος θα μπορούσε να είναι ως εξής: Give me a sentence: The Beatles The following characters appear in the sentence "The Beatles": a 1 time b 1 time e 3 times h 1 time l 1 time s 1 time t 2 times

11.1 Γενικά: functions και scripts στο MATLAB 11 Συναρτήσεις Συναρτήσεις (functions) ονομάζονται αυτόνομα τμήματα κώδικα, ξεχωριστά από το κυρίως πρόγραμμα, που εκτελούν μια συγκεκριμένη λειτουργία. Για την εκτέλεση της λειτουργίας αυτής, οι συναρτήσεις μπορεί να απαιτούν κάποιες μεταβλητές ως είσοδο (ορίσματα εισόδου), και μπορεί να εξάγουν κάποιες άλλες μεταβλητές ως έξοδο (ορίσματα εξόδου). Για παράδειγμα, μπορεί να δημιουργηθεί μια συνάρτηση που να υπολογίζει της ρίζες ενός δευτεροβάθμιου τριωνύμου. Όπως ξέρουμε, για τη λειτουργία αυτή απαιτούνται οι συντελεστές του τριωνύμου (α, β, γ), με τη βοήθεια των οποίων υπολογίζονται οι δύο λύσεις (x 1, x 2 ). Έτσι, μπορεί να κατασκευαστεί μια συνάρτηση, η οποία να έχει ως ορίσματα εισόδου 3 μεταβλητές με ονόματα a, b, c και ως ορίσματα εξόδου 2 μεταβλητές με ονόματα x1 και x2. Οι συναρτήσεις δεν «τρέχουν» από μόνες τους, όπως τα απλά προγράμματα (που ονομάζονται scripts), αλλά «καλούνται» με το όνομά τους (α) από άλλα προγράμματα ή (β) από άλλες συναρτήσεις ή (γ) από το Command Window. Παράδειγμα δημιουργίας μιας απλής συνάρτησης: Ο παρακάτω κώδικας γράφεται στον Editor και αποθηκεύεται ως αρχείο MATLAB με όνομα addition.m. function c = addition(a,b) c = a + b; Εκτέλεση (κλήση) της συνάρτησης, π.χ. από το Command Window: >> x = addition(3,4) x = 7 >> y = addition(x,x^2) y = 56 Η μεγάλη διαφορά των συναρτήσεων (functions) από τα απλά τμήματα κώδικα (scripts) είναι ότι δημιουργούν το δικό τους χώρο μνήμης (workspace), που είναι εντελώς απομονωμένος από χώρο μνήμης του υπόλοιπου προγράμματος από το οποίο «καλούνται», με αποτέλεσμα να είναι πιο ξεκάθαρος ο τρόπος λειτουργίας τους και με μικρότερη πιθανότητα σφάλματος. Αυτό σημαίνει ότι μια συνάρτηση «γνωρίζει» μόνο τις μεταβλητές που ορίζονται μέσα σ αυτήν (τοπικές μεταβλητές), καθώς και αυτές που εισάγονται σ αυτήν ως ορίσματα εισόδου. Τα πλεονεκτήματα των συναρτήσεων είναι: Καλύτερη οργάνωση του κυρίως προγράμματος: Το κυρίως πρόγραμμα είναι μικρότερο σε μέγεθος, άρα περισσότερο κατανοητό και ευκολότερο στην αποσφαλμάτωση. Εύκολη χρήση του κώδικά τους: Ο κώδικας των συναρτήσεων γράφεται μόνο μια φορά, και μπορούν να κληθούν από το κυρίως πρόγραμμα πολλές φορές (και μάλιστα με διαφορετικές τιμές μεταβλητών εισόδου), με απλή αναφορά του ονόματός τους, χωρίς να επαναλαμβάνεται συνεχώς ο ίδιος κώδικας μέσα στο κυρίως πρόγραμμα. Εύκολη αποσφαλμάτωση του κυρίως προγράμματος: Σε περίπτωση που χρειαστεί να μεταβληθεί ή να διορθωθεί ο κώδικας μιας συνάρτησης, αυτό γίνεται μόνο μια φορά, στη θέση όπου ορίζεται η συνάρτηση. Χρήση από άλλα προγράμματα: Οι συναρτήσεις μπορούν να κληθούν από πολλά διαφορετικά προγράμματα. για το λόγο αυτό μπορούν να δημιουργηθούν ομάδες συναρτήσεων που εκτελούν λειτουργίες ενός θεματικού πεδίου (π.χ. ομάδες συναρτήσεων στατιστικής ανάλυσης, ή επεξεργασίας εικόνας, κλπ). Κάθε τέτοιο σύνολο συναρτήσεων στο MATLAB έχει το ιδιαίτερο όνομα toolbox (βλ. παράγρ. 3.2).

86 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 11.2 Τοπικές μεταβλητές Οι μεταβλητές που τυχόν οριστούν μέσα σε μία συνάρτηση λέγονται τοπικές μεταβλητές (local variables) και δημιουργούνται μόνο κατά την κλήση της συνάρτησης, ενώ διαγράφονται όταν τελειώσει η εκτέλεσή της. Οι τοπικές μεταβλητές μπορούν να έχουν ακόμα και ίδιο όνομα με μεταβλητές του προγράμματος από το οποίο καλούνται, ενώ στην πραγματικότητα είναι εντελώς διαφορετικές μεταβλητές. Στην περίπτωση αυτή δεν δημιουργείται κανένα πρόβλημα, λόγω του ξεχωριστού χώρου μνήμης στον οποίο εκτελείται κάθε συνάρτηση. 11.3 Δημιουργία συνάρτησης Μια συνάρτηση χαρακτηρίζεται από το όνομά της και από τα ορίσματα εισόδου και εξόδου. Στο MATLAB, μια συνάρτηση μπορεί να έχει (ένα ή περισσότερα) ορίσματα εισόδου ή και εξόδου, ή να μην έχει. Η πρώτη γραμμή του κώδικα μιας συνάρτησης αρχίζει υποχρεωτικά από τη λέξη function, και ακολουθεί το όνομά της (μαζί με τα τυχόν ορίσματα εισόδου και εξόδου, αν έχει). Τα ορίσματα εισόδου μπαίνουν εντός παρεθέσεων και χωρίζονται με κόμμα, π.χ. (a,b,c). Τα ορίσματα εξόδου μπαίνουν μέσα σε αγκύλες, και χωρίζονται επίσης με κόμμα, π.χ. [x1,x2]. Αν υπάρχει μόνο ένα όρισμα εξόδου, οι αγκύλες μπορεί να παραλειφθούν. Γενικά: function [μεταβλητές εξόδου] = function_name(μεταβλητές εισόδου) ( ακολουθεί ο κώδικας της συνάρτησης ) Μια συνάρτηση γράφεται στον Editor και αποθηκεύεται κανονικά όπως κάθε άλλο πρόγραμμα στο MATLAB, ως αρχείο επέκτασης.m. Για να μην γίνεται σύγχυση, καλό είναι το όνομα του αρχείου στο οποίο αποθηκεύεται μια συνάρτηση να είναι ίδιο με το όνομα της συνάρτησης. Τα ονόματα των ορισμάτων ειδόσου και εξόδου, τα ονόματα των συναρτήσεων, καθώς και τα ονόματα των αρχείων των συναρτήσεων, πρέπει να ακολουθούν τους κανόνες των ονομάτων των μεταβλητών (βλ. 4.2), δηλαδή πρέπει να αρχίζουν από γράμμα (του λατινικού αλφαβήτου) και μπορεί να περιέχουν μόνο γράμματα, αριθμούς καθώς και την κάτω παύλα (_, underscore). Παράδειγμα δημιουργίας συνάρτησης: Έστω ότι πρέπει να δημιουργηθεί μια συνάρτηση που να δέχεται ως είσοδο μια τιμή θερμοκρασίας σε βαθμούς Κελσίου και να εξάγει την αντίστοιχη τιμή θερμοκρασίας σε Φαρενάιτ. Για τη δημιουργία της, γράφεται ο παρακάτω κώδικας στον Editor, και αποθηκεύεται με όνομα Celcius2Fahrenheit.m. function F = Celcius2Fahrenheit(C) F = (9/5)*C + 32; Στο παράδειγμα αυτό, το όνομα της συνάρτησης είναι Celcius2Fahrenheit, η μεταβλητή C είναι το όρισμα εισόδου της συνάρτησης, και η μεταβλητή F είναι το όρισμα εξόδου.

Συναρτήσεις 87 11.4 Κλήση συνάρτησης Η κλήση (δηλαδή η εκτέλεση) μιας συνάρτησης γίνεται με το όνομα του αρχείου της. Γενικά: [μεταβλητές εξόδου] = function_name(μεταβλητές εισόδου); Παράδειγμα: Το επόμενο πρόγραμμα (που γράφεται στον Editor και αποθηκεύεται με οποιοδήποτε όνομα) καλεί τη συνάρτηση Celcius2Fahrenheit, που έχει δημιουργηθεί στο προηγούμενο παράδειγμα. TC = input('give temperature in Celcius: '); TF = Celcius2Fahrenheit(TC); fprintf('%.1f Celcius = %.1f Fahrenheit', TC, TF); Επεξήγηση του παραπάνω παραδείγματος: Αρχικά, ζητείται από το χρήστη με input η εισαγωγή μιας τιμής θερμοκρασίας σε βαθμούς Κελσίου, σε μια μεταβλητή με όνομα TC. Στη συνέχεια, καλείται η συνάρτηση Celcius2Fahrenheit, με είσοδο τη μεταβλητη TC και έξοδο τη μεταβλητή με όνομα TF. Τέλος, το αποτέλεσμα τυπώνεται με κατάλληλο μήνυμα με χρήση fprintf στο Command Window. 11.5 Έξοδος από συνάρτηση (εντολή return) Στην περίπτωση που είναι επιθυμητή η έξοδος από τη συνάρτηση πριν από το τέλος της, μπορεί να χρησιμοποιηθεί η εντολή return. Η εντολή return μπορεί επίσης να χρησιμοποιηθεί και για τον πρόωρο τερματισμό ενός script. 11.6 Υποσυναρτήσεις Μέσα σε μια συνάρτηση μπορούν να δημιουργηθούν και άλλες συναρτήσεις, υποβοηθητικές για τη λειτουργία της, που λέγονται υποσυναρτήσεις. Ο ορισμός των υποσυναρτήσεων γίνεται μετά το τέλος της κύριας συνάρτησης, με οποιαδήποτε σειρά. Μια υποσυνάρτηση μπορεί να κληθεί μόνο από την κύρια συνάρτηση του αρχείου μέσα στο οποίο ορίζεται, ή από άλλη υποσυνάρτηση του ίδιου αρχείου, ανεξαρτήτως θέσης. 11.7 Σειρά αναζήτησης μιας συνάρτησης από το MATLAB Γενικά, όταν κληθεί μια συνάρτηση, το MATLAB την αναζητά: πρώτα στο πρόγραμμα/συνάρτηση από το οποίο καλείται (ελέγχει δηλαδή πρώτα αν είναι υποσυνάρτηση), μετά στο Current Directory / Current Folder και τέλος στους φακέλους του Path, με τη σειρά που αυτοί έχουν δηλωθεί εκεί (βλ. παράγρ. 3.2). Το Path βρίσκεται από το μενού του MATLAB: File > Set Path

88 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 11.8 Δομή ενός αρχείου συνάρτησης Συνοψίζοντας τα προηγούμενα, η δομή ενός αρχείου συνάρτησης είναι όπως παρακάτω: Αρχείο: main_function.m function [output] = main_function(input) % Κώδικας κύριας συνάρτησης function [output] = subfunction1(input) % Κώδικας υποσυνάρτησης 1 function [output] = subfunction2(input) % Κώδικας υποσυνάρτησης 2 1o παράδειγμα: Αρχείο συνάρτησης με υποσυναρτήσεις: Αν είναι επιθυμητό το πρόγραμμα να είναι αυτόνομο, και να μην απαιτεί άλλα αρχεία για την εκτέλεσή του, τότε οι συναρτήσεις που θα χρησιμοποιηθούν πρέπει να οριστούν μέσα στο κυρίως πρόγραμμα (υποσυναρτήσεις). Όμως, στην περίπτωση αυτή το πρόγραμμα πρέπει α- ναγκαστικά να είναι κι αυτό συνάρτηση. Έτσι, συνήθως δίνεται ένα αυθαίρετο όνομα συνάρτησης στην 1 η γραμμή του κυρίως προγράμματος, για παράδειγμα function main. function main % Το πρόγραμμα αυτό καλεί τις συναρτήσεις bmicalculation και % bmimessage, που ορίζονται ως υποσυναρτήσεις μέσα στο πρόγραμμα. %%% MAIN PROGRAM %%% clc; clear all; weight = input('input patient's weight: '); % Είσοδος βάρους ασθενούς height = input('input patient's height: '); % Είσοδος ύψους ασθενούς bmi = bmicalculation(weight,height); % Υπολογισμός bmi message = bmimessage(bmi); % Υπολογισμός μηνύματος disp(message); % Εκτύπωση μηνύματος %%% SUBFUNCTIONS %%% Αρχείο κύριας συνάρτησης: main.m function bmi = bmicalculation(weight,height) bmi = weight/height^2; function message = bmimessage(bmi) if bmi<18 message = 'Underweight'; elseif bmi>=18 & bmi<25 message = 'Normal weight'; elseif bmi>=25 & bmi<30 message = 'Overweight'; else message = 'Obesity';

Συναρτήσεις 89 2o παράδειγμα: Συναρτήσεις ως ξεχωριστά αρχεία που καλούνται από το κυρίως πρόγραμμα: Στην περίπτωση αυτή οι συναρτήσεις μπορούν να κληθούν με το όνομά τους από οποιοδήποτε πρόγραμμα, είτε αυτό είναι script είτε άλλη συνάρτηση. Το μειονέκτημα είναι ότι το κυρίως πρόγραμμα δεν είναι ενιαίο αρχείο (χρειάζεται και τα αρχεία των συναρτήσεων). Μια συνάρτηση που είναι ξεχωριστό αρχείο καλείται με το όνομα του αρχείου στο οποίο αποθηκεύεται. Για το λόγο αυτό καλό είναι τα ονόματα των αρχείων των συναρτήσεων να είναι ίδια με τα ονόματα των συναρτήσεων, όπως φαίνεται και παρακάτω: Αρχείο κυρίως προγράμματος: bmiprogram.m % Το πρόγραμμα αυτό καλεί τις συναρτήσεις bmicalculation και % bmimessage, που ορίζονται εξωτερικά, ως αυτόνομα αρχεία. clc; clear all; weight = input('input patient's weight: '); height = input('input patient's height: '); bmi = bmicalculation(weight,height); message = bmimessage(bmi); disp(message); Στο παραπάνω κυρίως πρόγραμμα καλούνται οι συναρτήσεις bmicalculation και bmimessage που ορίζονται παρακάτω και που αποθηκεύονται ως ξεχωριστά αρχεία. Το κυρίως πρόγραμμα αναζητά τις συναρτήσεις στο δίσκο, με το όνομα του αρχείου τους (bmicalculation.m και bmimessage.m), πρώτα στο φάκελο του Current Directory / Current Folder και μετά (αν δεν βρεθούν εκεί) στους φακέλους του Path. Αρχείο συνάρτησης: bmicalculation.m function bmi = bmicalculation(weight, height) % Υπολογισμός Δείκτη Σωματικού Βάρους (Body Mass Index). bmi = weight/height^2; function message = bmimessage(bmi) % Μήνυμα σχετικά με το Δείκτη Σωματικού Βάρους (Body Mass Index). if bmi<18 message = 'Underweight'; elseif bmi>=18 & bmi<25 message = 'Normal weight'; elseif bmi>=25 & bmi<30 message = 'Overweight'; else message = 'Obesity'; Αρχείο συνάρτησης: bmimessage.m

90 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 11.9 Εμφωλευμένες συναρτήσεις (nested functions) Στο MATLAB είναι δυνατόν να οριστούν συναρτήσεις στο εσωτερικό άλλων συναρτήσεων (όχι μετά το τέλος τους, όπως οι υποσυναρτήσεις). Οι εσωτερικά οριζόμενες συναρτήσεις ονομάζονται εμφωλευμένες (nested) και ο ορισμός τους τελειώνει με. Τότε, πρέπει να τελειώνει με και ο ορισμός κάθε άλλης συνάρτησης (και της κύριας). Οι εμφωλευμένες συναρτήσεις μπορούν να οριστούν σε οποιοδήποτε σημείο (εκτός από το εσωτερικό βρόχων επιλογής ή επανάληψης), ακόμη και μέσα σε άλλες εμφωλευμένες συναρτήσεις. Ένα σημαντικό χαρακτηριστικό τους είναι ότι «γνωρίζουν» όσες μεταβλητές οριστούν στη συνάρτηση μέσα στην οποία εμφωλεύονται (χωρίς οι μεταβλητές αυτές να ανήκουν στα ορίσματα εισόδου τους). Η χρήση τους συστήνεται μόνο σε ειδικές και συγκεκριμένες περιπτώσεις (π.χ. χρήση λιγότερων ορισμάτων εισόδου για κατανάλωση λιγότερης μνήμης επίσης βλ. σχόλια 8, 16 του http://blogs.mathworks.com/loren/2008/01/16/nested-functions-and-variable-scope/, καθώς και σχόλια 7, 15 για πλεονεκτήματα των εμφωλευμένων ή σχόλια 10, 11, 14 για μειονεκτήματα ). Η κλήση μιας εμφωλευμένης συνάρτησης μπορεί να γίνει από οποιοδήποτε σημείο έξω από την εμφωλευμένη συνάρτηση (είτε πριν, είτε μετά από τον ορισμό της). Όμως, έξω από μια εμφωλευμένη συνάρτηση δεν είναι δυνατή η κλήση άλλων εμφωλευμένων που ορίζονται εντός της εμφωλευμένης (βλ. http://www.mathworks.com/help/techdoc/matlab_prog/f4-39683.html). Ακολουθεί παράδειγμα συνάρτησης με εμφωλευμένη συνάρτηση: function main % Η bmicalculation είναι υποσυνάρτηση της κύριας συνάρτησης main, διότι % ορίζεται μετά το τέλος της. % Η bmimessage είναι εμφωλευμένη συνάρτηση της main, διότι ορίζεται % στο εσωτερικό της. % Παρατηρούμε ότι η μεταβλητή bmi ορίζεται στην main και γίνεται γνωστή % στην εμφωλευμένη της (bmimessage) χωρίς να αποτελεί όρισμα εισόδου % σ αυτήν (εξάλλου η bmimessage δεν έχει ορίσματα εισόδου). % Κάθε συνάρτηση (κύρια, υποσυνάρτηση, εμφωλευμένη) τελειώνει με. Αρχείο κύριας συνάρτησης: main.m % Κώδικας κύριας συνάρτησης. n = input('input patient name: ','s'); w = input('input patient weight (kg): '); h = input('input patient height (m): '); bmi = bmicalculation(w, h); message = bmimessage; % Ορισμός εμφωλευμένης συνάρτησης (μέσα στην κύρια συνάρτηση). function message = bmimessage if bmi<18, message = 'Underweight'; elseif bmi>=18 & bmi<25, message = 'Normal weight'; elseif bmi>=25 & bmi<30, message = 'Overweight'; else message = 'Obesity'; % Συνέχιση του κώδικα της κύριας συνάρτησης. fprintf('patient %s: BMI=%.1f (%s)\n', n, bmi, message); % Ορισμός υποσυνάρτησης (μετά το τέλος της κύριας συνάρτησης). function bmi = bmi_calculation(weight, height) bmi = weight/height^2;

Συναρτήσεις 91 11.10 Ανώνυμες συναρτήσεις (anonymous functions) Στο MATLAB είναι δυνατός ο ορισμός συναρτήσεων κατευθείαν σε μία γραμμή εντολής (in line functions). Οι συναρτήσεις αυτές ονομάζονται ανώνυμες (anonymous), διότι δεν έ- χουν όνομα, αλλά καλούνται με το όρισμα εξόδου τους. Προσοχή: Ο ορισμός μιας ανώνυμης συνάρτησης πρέπει να προηγείται της κλήσης της. Ορισμός ανώνυμης συνάρτησης: όρισμα_εξόδου = @(ορίσματα_εισόδου)ορισμός_συνάρτησης Π.χ. y = @(x)x^2; Κλήση ανώνυμης συνάρτησης: μεταβλητή = όρισμα_εξόδου(ορίσματα_εισόδου) Π.χ. z = y(4); Παραδείγματα: Π.χ. 1: Εκτύπωση των βαθμών θερμοκρασίας Κελσίου από 0 έως 100 ανά 5 με τους αντίστοιχους βαθμούς Φαρενάιτ: F = @(C)(9/5)*C + 32; for C=0:5:100 fprintf('%d\t%d\n',c,f(c)); Π.χ. 2: Γραφική παράσταση παραβολής: y = @(x)x^2; hold on; for x=1:100 plot(x,y(x)); Π.χ. 3: Υπολογισμός και εκτύπωση του δείκτη σωματικού βάρους (bmi): bmi = @(weight,height)weight/height^2; w = input('input your weight (kg): '); h = input('input your height (m): '); b = bmi(w,h); fprintf('your Body Mass Index is %.1f', b); 11.11 Ιδιωτικές συναρτήσεις (private functions) Πρόκειται για συνήθη για αρχεία συναρτήσεων (m-files) που βρίσκονται σε έναν φάκελο με όνομα private. Οι συναρτήσεις αυτές γίνονται γνωστές μόνο στις συναρτήσεις που βρίσκονται στο φάκελο του αμέσως ανωτέρου επιπέδου, και μάλιστα με προτεραιότητα κλήσης έναντι όλων των m-files με ίδιο όνομα (που μπορεί να βρίσκονται ακόμα και στον ίδιο φάκελο με την καλούσα συνάρτηση ή σε οποιοδήποτε φάκελο του path ή στον current folder κλπ). Αυτή η ιδιότητα των ιδιωτικών συναρτήσεων είναι μια από τις κύριες χρήσεις τους (όπως όταν χρειάζεται να δημιουργηθεί μια προσωρινή έκδοση μιας άλλης συνάρτησης με ίδιο όνομα: τότε, θα κληθεί η συνάρτηση που βρίσκεται μέσα στον υποφάκελο private). Παράδειγμα: Μέσα στο φάκελο common βρίσκεται η συνάρτηση calculations.m, καθώς και ο φάκελος private, μέσα στον οποίο υπάρχει η συνάρτηση mean.m. Τότε, αν η calculations καλέσει την mean, θα κληθεί η mean του φακέλου private και όχι η γνωστή mean του MATLAB.

92 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 11.12 Μεταβλητό πλήθος ορισμάτων εισόδου ή εξόδου σε συναρτήσεις Στο MATLAB είναι δυνατόν μια συνάρτηση να μπορεί να καλείται χωρίς να είναι αυστηρά καθορισμένο το πλήθος (και ο τύπος) των ορισμάτων εισόδου ή εξόδου. α) Μεταβλητό πλήθος ορισμάτων εισόδου: varargin, nargin Κατά τον ορισμό της συνάρτησης, τα ορίσματα εισόδου πρέπει να οριστούν ως στοιχεία του πίνακα κελιών varargin. Η μεταβλητή nargin είναι αυτομάτως ίση με το πλήθος των ορισμάτων εισόδου και μπορεί να χρησιμοποιηθεί για τον έλεγχό τους. Η κλήση της συνάρτησης γίνεται κατά το συνήθη τρόπο. Ορισμός συνάρτησης με μεταβλητό πλήθος ορισμάτων εισόδου: function [ορίσματα_εξόδου] = όνομα_συνάρτησης(varargin) <ορισμός μεταβλητών με βάση τα κελιά varargin{1}, varargin{2} κλπ> <κώδικας συνάρτησης> Για παράδειγμα, έστω η συνάρτηση average η οποία θα υπολογίζει το συνολικό βαθμό ενός μαθήματος ως τη μέση τιμή των βαθμών θεωρίας και εργαστηρίου. Η μέση τιμή θα υπολογίζεται με σχετικά βάρη (π.χ. 60% θεωρία και 40% εργαστήριο), οπότε η συνάρτηση θα έχει 4 ορίσματα εισόδου (2 βαθμούς και 2 βάρη). Για λόγους απλότητας, σε περίπτωση που τα σχετικά βάρη είναι ίσα (50%-50%), θα πρέπει να είναι δυνατόν κατά την κλήση της συνάρτησης να εισάγονται μόνο οι δύο βαθμοί (μόνο 2 ορίσματα εισόδου): Ορισμός συνάρτησης function m = average(varargin) % d1, d2 = βαθμοί θεωρίας και εργαστηρίου % w1, w2 = σχετικά βάρη για τον υπολογισμό της μέσης τιμής % m = μέση τιμή βαθμών θεωρίας και εργαστηρίου (m = d1*w1 + d2*w2) % Καθορισμός ορισμάτων εισόδου % αναλόγως του πλήθους τους κατά την κλήση d1 = varargin{1}; d2 = varargin{2}; if nargin==2 w1 = 0.5; w2 = 0.5; if nargin==4 w1 = varargin{3}; w2 = varargin{4}; % Πράξεις κυρίως συνάρτησης m = d1*w1 + d2*w2; Κλήση συνάρτησης Αποτέλεσμα >> m1 = average(9, 7) >> m2 = average(9, 7, 0.6, 0.4) m1 = m2 = 8 8.2

Συναρτήσεις 93 β) Μεταβλητό πλήθος ορισμάτων εξόδου: varargout, nargout Κατά τον ορισμό της συνάρτησης, τα ορίσματα εξόδου πρέπει να οριστούν ως στοιχεία του πίνακα κελιών varargout. Η μεταβλητή nargout είναι αυτομάτως ίση με το πλήθος των ορισμάτων εξόδου και μπορεί να χρησιμοποιηθεί για τον έλεγχό τους. Η κλήση της συνάρτησης γίνεται κατά το συνήθη τρόπο. Ορισμός συνάρτησης με μεταβλητό πλήθος ορισμάτων εξόδου: function varargout = όνομα_συνάρτησης(ορίσματα_εισόδου) <κώδικας συνάρτησης> <ορισμός κελιών varargout{1}, varargout{2} κλπ> Για παράδειγμα, έστω η συνάρτηση stats, με είσοδο έναν πίνακα, και έξοδο τη μέση τιμή των στοιχείων του (αν κληθεί με 1 όρισμα εξόδου) ή τη μέση τιμή και το άθροισμα των στοιχείων του (αν κληθεί με 2 ορίσματα εξόδου): Ορισμός συνάρτησης function varargout = stats(a) % A = πίνακας % m = μέση τιμή πίνακα % s = άθροισμα στοιχείων πίνακα % Κυρίως συνάρτηση s = 0; for i=1:size(a,1) for j=1:size(a,2) s = s + A(i,j); m = s/(size(a,1)*size(a,2)); % Καθορισμός ορισμάτων εξόδου % αναλόγως του πλήθους τους κατά την κλήση if nargout==1 varargout{1} = m; if nargout==2 varargout{1} = m; varargout{2} = s; Κλήση συνάρτησης Αποτέλεσμα >> x = [1 2 3 ; 4 5 6]; >> mx = stats(x) mx = 3.5 >> [m, s] = stats(x) m = s = 3.5 21

94 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 11.13 Εφαρμογή συνάρτησης σε πολλαπλές μεταβλητές: arrayfun, structfun, cellfun Στο MATLAB είναι δυνατή η εφαρμογή μιας συνάρτησης σε πολλαπλές μεταβλητές: arrayfun: Εφαρμογή συνάρτησης σε κάθε στοιχείο ενός πίνακα. Στην απλούστερη περίπτωση επιστρέφεται πίνακας αποτελεσμάτων ίδιας διάστασης με τον αρχικό. Παράδειγμα Αποτέλεσμα >> x = [9.1 pi -4.2 1.6 2.5-5.7]; >> y = arrayfun(@round, x) y = 9 3-4 2 3-6 structfun: Εφαρμογή συνάρτησης σε κάθε πεδίο μιας δομής. Στην απλούστερη περίπτωση τα αποτελέσματα επιστρέφονται σε πίνακα. Παράδειγμα Αποτέλεσμα >> n.a = 0; >> n.b = [1:10]; >> n.c = rand(1000,1)}; >> m = structfun(@mean, n) m = 0 5.5 0.49108 cellfun: Εφαρμογή συνάρτησης σε κάθε κελί ενός cell array. Στην απλούστερη περίπτωση, πρέπει να επιστρέφονται βαθμωτές (απλές) μεταβλητές (όχι πίνακες κλπ), οι οποίες επιστρέφονται ως στοιχεία πίνακα. Παράδειγμα Αποτέλεσμα >> n = {0, [1:10], rand(1000,1)}; >> m = cellfun(@mean, n) m = 0 5.5 0.49108

Συναρτήσεις 95 Ερωτήσεις 11.1 Να αναφερθούν δύο διαφορές μεταξύ απλών προγραμμάτων (scripts) και συναρτήσεων (functions). 11.2 Να αναφερθούν 3 πλεονεκτήματα της ανάπτυξης ενός σύνθετου προγράμματος με χρήση συναρτήσεων. 11.3 Να αναφέρετε μια περίπτωση στην οποία εξυπηρετεί η δημιουργία συναρτήσεων ως ξεχωριστά αρχεία καθώς και μια άλλη περίπτωση στην οποία εξυπηρετεί η δημιουργία συναρτήσεων ως υποσυναρτήσεις. 11.4 Να σημειωθούν με [Σ] οι σωστές και με [Λ] οι λανθασμένες απαντήσεις: [ ] Οι τοπικές μεταβλητές γίνονται γνωστές τόσο στη συνάρτηση όσο και στο πρόγραμμα που την καλεί. [ ] Οι συναρτήσεις εκτελούνται στο δικό τους ανεξάρτητο χώρο μνήμης. [ ] Μια συνάρτηση έχει υποχρεωτικά ως είσοδο μία ή περισσότερες μεταβλητές. [ ] Μια συνάρτηση έχει υποχρεωτικά ως έξοδο μία ή περισσότερες μεταβλητές. [ ] Μια συνάρτηση είναι δυνατόν να μην έχει ορίσματα εισόδου. Ασκήσεις 11.5 Να γραφτεί κατάλληλη συνάρτηση η οποία να υπολογίζει τη μέση τιμή ενός πίνακα. Υπόδειξη: Η συνάρτηση πρέπει να έχει ως όρισμα εισόδου τον πίνακα και ως όρισμα εξόδου τη μέση τιμή του. 11.6 Να γραφτεί κατάλληλη συνάρτηση η οποία να υπολογίζει τη μέγιστη και την ελ τιμή ενός πίνακα. Υπόδειξη: Η συνάρτηση πρέπει να έχει ως όρισμα εισόδου τον πίνακα και ως ορίσματα εξόδου τη μέγιστη και την ελάχιστη τιμή του. 11.7 Να γραφτεί κατάλληλη συνάρτηση η οποία να υπολογίζει το πλήθος των θετικών και το πλήθος των αρνητικών στοιχείων ενός πίνακα. 11.8 α) Να γραφτεί κατάλληλη συνάρτηση που να εξάγει έναν τυχαίο ακέραιο αριθμό από 1 έως 6, προσομοιώνοντας τη ρίψη ενός ζαριού. Υπόδειξη: Χρησιμοποιήστε κατάλληλα τις συναρτήσεις rand, η οποία επιστρέφει ένα τυχαίο αριθμό (όχι ακέραιο) από 0 έως 1, και τη round, για τη στρογγυλοποίηση σε ακέραιο. Η συνάρτηση δεν έχει όρισμα εισόδου. β) Να γραφτεί κατάλληλη συνάρτηση που να παράγει ρίψη 2 ζαριών. Να χρησιμοποιηθεί η συνάρτηση του ερωτήματος (α). γ) Να γραφτεί κατάλληλη συνάρτηση που να παράγει ρίψη Ν ζαριών (το Ν θα είναι είσοδος της συνάρτησης). Να χρησιμοποιηθεί η συνάρτηση του ερωτήματος (α). 11.9 Να γραφτεί ο κώδικας κατάλληλης συνάρτησης η οποία να υπολογίζει το άθροισμα N όρων μιας αριθμητικής προόδου (οι όροι της προόδου είναι οι a, a+s, a+2s, a+3s, ). Υπόδειξη: Τα ορίσματα εισόδου της συνάρτησης πρέπει να είναι τα a, s και N, ενώ όρισμα εξόδου πρέπει να είναι το ζητούμενο άθροισμα. 11.10 Να γραφτούν δύο συναρτήσεις που θα τυπώνουν N αστερίσκους (*) στο Command Window, όπου Ν θα είναι το όρισμα εισόδου της συνάρτησης (η μία συνάρτηση πρέπει να τυπώνει τους αστερίσκους οριζοντίως, και η άλλη καθέτως). Υπόδειξη: Κάθε μία από τις συναρτήσεις πρέπει να έχει ως όρισμα εισόδου το πλήθος των αστερίσκων. Οι συναρτήσεις αυτές δεν έχουν όρισμα εξόδου (απλώς τυπώνονται οι αστερίσκοι στο Command Window). 11.11 Να γραφτεί πρόγραμμα στο οποίο: α) θα ζητείται από το πληκτρολόγιο μια τιμή θερμοκρασίας σε βαθμούς Κελσίου. β) θα υπολογίζεται η αντίστοιχη τιμή θερμοκρασίας σε βαθμούς Φαρενάιτ.

96 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB γ) Οι δύο τιμές θερμοκρασίας θα τυπώνονται με κατάλληλο μήνυμα στο Command Window, π.χ.: 100 Celcius = 212 Fahrenheit Η μετατροπή της θερμοκρασίας από Κελσίου σε Φαρενάιτ πρέπει να γίνεται με κατάλληλη συνάρτηση, η οποία να είναι ενσωματωμένη στο πρόγραμμα. Η σχέση των δύο θερμοκρασιών είναι η εξής: 9 T T 32, όπου T C η θερμοκρασία σε βαθμούς Κελσίου και T F σε Φαρενάιτ. F 5 C 11.12 Να γραφτεί κατάλληλη συνάρτηση που να έχει ως είσοδο μια συμβολοσειρά και ως έξοδο έναν αριθμητικό πίνακα 26 θέσεων που σε κάθε θέση θα περιέχει τη συχνότητα εμφάνισης κάθε γράμματος της συμβολοσειράς (π.χ. στην πρώτη θέση θα περιέχει το πλήθος των 'a', στη δεύτερη θέση των 'b' κλπ). Σημείωση: Για να αποφύγετε τη διάκριση πεζών-κεφαλαίων, μπορείτε να χρησιμοποιήσετε τη συνάρτηση (του MATLAB) upper, η οποία μετατρέπει τους χαρακτήρες μιας συμβολοσειράς σε πεζούς (για παράδειγμα upper('hello') 'HELLO'). 11.13 Να γραφτεί κατάλληλη συνάρτηση η οποία θα υπολογίζει το Ν! (Ν παραγοντικό), δηλαδή το γινόμενο 1 2 N, και να την αποθηκεύσετε σε αρχείο με όνομα fact.m. 11.14 Να γραφτεί ένα πρόγραμμα το οποίο, καλώντας κατάλληλα την συνάρτηση της προηγούμενης άσκησης (fact.m ) να υπολογίζει το πλήθος των συνδυασμών n αντικειμένων ανά k, το οποίο δίνεται από τη σχέση: n n! k k!( n k)! Για παράδειγμα, οι συνδυασμοί των 4 γραμμάτων {a,b,c,d} ανά 2 είναι οι: {a,b}, {a,c}, {a,d}, {b,c}, {b,d} και {c,d}. Τ το πλήθος των συνδυασμών αυτών μπορεί να υπολογιστεί από τον παραπάνω τύπο ως εξής: 4 4! 1 2 3 4 6 2 2!(4 2)! 1 2 1 2

12 Δομές Δομή (structure) ονομάζεται μια ομάδα μεταβλητών, ακόμα και διαφορετικών τύπων, με ένα κοινό όνομα. Οι μεταβλητές αυτές ονομάζονται πεδία (fields) της δομής. Ένα πεδίο μιας δομής μπορεί να οποιουδήποτε τύπου, ακόμη και πίνακας (ή ακόμα και άλλη δομή). Το όνομα των πεδίων της δομής χωρίζεται από το όνομα της δομής με μια τελεία (.). 12.1 Απλή δομή Ανάθεση τιμών σε πεδία δομής: domi.pedio = <τιμή> domi.pedio(<δείκτης>) = <τιμή> Π.χ.: Έστω η δομή Student, με πεδία τα Name (αλφαριθμητικό), Phone (αλφαριθμητικό) και Degrees (αριθμητικός πίνακας). Τότε: Η δομή Η δομή: Student Τα πεδία: Name Phone Degrees Οι μεταβλητές: Student.Name Student.Phone Student.Degrees(1) Student.Degrees(2) Student.Degrees(3) Student Name: Nicolas Phone: 210-5385375 Degrees: 7, 9, 5 Τα πεδία Οι τιμές των πεδίων Παραδείγματα % Δημιουργία δομής και απεικόνιση ενός πεδίου patient.name = 'John'; patient.height = 1.80; disp(patient.name); % Χρήση της μεταβλητής ενός πεδίου της δομής heightincentimeters = 100*patient.height; disp(heightincentimeters); % Πρόσθεση επιπλέον πεδίου σε μια υπάρχουσα δομή patient.weight = 75; patient.bmi = patient.weight/patient.height^2; patient Δημιουργία δομής με πεδίο που είναι πίνακας Student.Name = 'Nicolas'; Student.Phone = '210-5385375'; Student.Degrees(1) = 7; Student.Degrees(2) = 9; Student.Degrees(3) = 5; Student mo = 0; for i=1:3 mo = mo + Student.Degrees(i); mo = mo / length(student.degrees) Αποτελέσματα John 180 patient = name: 'John' height: 1.8 weight: 75 bmi: 23.148 Student = Name: 'Nicolas' Phone: '210-5385375' Degrees: [7 9 5] mo = 7

98 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 12.2 Πίνακας Δομών (Structure Array) Ένας πίνακας μπορεί να αποτελείται από στοιχεία που είναι τύπου δομής. Αυτό σημαίνει ότι τα πεδία της ίδιας δομής επαναλαμβάνονται με διαφορετική ομάδα τιμών κάθε φορά. Τότε ο πίνακας αποτελεί μια βάση δεδομένων (database), και κάθε στοιχείο του λέγεται εγγραφή (record). Ανάθεση τιμών σε πεδία πίνακα δομών: domi(<δείκτης>).pedio = <τιμή> domi(<δείκτης>).pedio(<δείκτης>) = <τιμή> Π.χ.: Έστω η δομή Students, με πεδία Name (αλφαριθμητικό), Phone (αλφαριθμητικό) και Degrees (αριθμητικός πίνακας). Τότε: Ο πίνακας δομών: Students Τα πεδία: Name Weight Height Οι μεταβλητές: Students(1).Name Students(1).Phone Students(1).Degrees(1) Students(1).Degrees(2) Students(1).Degrees(3) Students(2).Name Students(2).Phone Students(2).Degrees(1) Students(2).Degrees(2) Students(2).Degrees(3)... Students(3) Name: Georgiou Ioannis Phone: Students(2) 210-5385303 Degrees: 5, 7, 4 Name: Tetsi Maria Phone: Students(1) 210-5385387 Degrees: 8, 6, 10 Name: Neos Nicolaos Phone: 210-5385375 Degrees: 7, 9, 5 Εγγραφή 1 Εγγραφή 2 Εγγραφή 3 Παραδείγματα % Εισαγωγή 5 εγγραφών της βάσης δεδομένων for i=1:5 fprintf('patient #%d\n', i); Patients(i).Name = input('name : ', 's'); Patients(i).LDL = input('ldl value : '); Patients(i).HDL = input('hdl value : '); Patients(i).LH = Patients(i).LDL/Patients(i).HDL; fprintf('\n'); Αποτελέσματα Patient #1 Name : John LDL value: 190 HDL value: 16 Patient #2 Name : George LDL value: 130 HDL value: 40...e.t.c... % Εκτύπωση των ασθενών υψηλού κινδύνου όλης της βάσης for i=1:length(patients) if Patients(i).LH > 11 fprintf('%s: High risk\n', Patients(i).Name); fprintf('(hdl/ldl = %.1f)\n\n', Patients(i).LH); John: High risk (HDL/LDL = 11.9) Nicolas: High risk (HDL/LDL = 12.3)

Δομές 99 12.3 Ιδιαίτερα είδη δομών του MATLAB: Πίνακες Κελιών (Cell Arrays) Εκτός από τις κλασσικές δομές (structures), που υπάρχουν με παρόμοια μορφή και σε άλλες γλώσσες προγραμματισμού, όπως η C, το MATLAB προσφέρει και έναν ιδιαίτερο τύπο μεταβλητής τύπου δομών που λέγεται πίνακας κελιών (cell array). Τα cell arrays του MATLAB είναι μια συλλογή μεταβλητών οργανωμένων σε μορφή πινάκων, των οποίων τα στοιχεία ονομάζονται «κελιά» και, αντίθετα από τους «κανονικούς» πίνακες, μπορεί να περιέχουν μεταβλητές διαφορετικού τύπου (όπως στις δομές). Η διαφορά από τις δομές είναι ότι οι επιμέρους μεταβλητές των cell arrays χαρακτηρίζονται από δείκτες όπως στους πίνακες, αντί για ονόματα πεδίων όπως στις δομές. Έτσι, τα cell arrays συνδυάζουν την ευελιξία των διαφορετικών τύπων μεταβλητών (όπως στις δομές), με την ευκολία προσπέλασης και σάρωσης των κελιών τους με δείκτες (όπως στους πίνακες). Στο MATLAB, οι δομές θεωρούνται ειδικές περιπτώσεις των cell arrays. Για παράδειγμα, μια απλή δομή Ν πεδίων αποθηκεύεται στη μνήμη με τον ίδιο τρόπο όπως ένα cell array μεγέθους 1 Ν. Τα κελιά των cell arrays μπορεί να περιέχουν οποιοδήποτε τύπο μεταβλητής, όπως απλές μεταβλητές, πίνακες, συμβολοσειρές, δομές ή ακόμα και άλλα cell arrays. Μια απλή συχνή χρήση των cell arrays είναι ως πίνακες αποθήκευσης συμβολοσειρών. Τόσο η ανάθεση τιμών σε κελιά ενός cell array όσο και η αναφορά σ αυτά γίνεται με άγκιστρα ({}). Ανάθεση τιμών σε cell array: Οι τιμές τοποθετούνται μέσα σε άγκιστρα {...}, και διευθετούνται σε γραμμές και στήλες με τον ίδιο τρόπο που γίνεται στους πίνακες: τα στοιχεία μιας γραμμής χωρίζονται μεταξύ τους με κενό ή κόμμα, ενώ οι γραμμές χωρίζονται με ερωτηματικό ή με αλλαγή γραμμής ( Enter),π.χ. A = {'John',75 ; 1.80,[6.5 9 7]}. Αναφορά σε κελί ενός cell array: Οι δείκτες των κελιών μπαίνουν επίσης σε άγκιστρα, χωρισμένοι με κόμμα. Π.χ. το στοιχείο A{2,2} του προηγούμενου παραδείγματος είναι ο πίνακας [6.5 9 7]. Ακολουθούν παραδείγματα ανάθεσης και αναφοράς κελιών σε cell arrays: Παραδείγματα % Ορισμός / Ανάθεση τιμών cell array students={'john', 75, 1.80, [6.5 9 7] 'Nic', 82, 1.75, [10 7 8] 'Anna', 58, 1.70, [9.5 6.5 7]} % Αναφορά στα κελιά ενός cell array AnnaWeight = students{3,2} John2ndDegree = students{1,4}(2) AnnaName = students{3,1} Anna4thLetter = students{3,1}(4) % Εύρεση μέσου όρου του 2ου βαθμού μεταξύ % των μαθητών mo = 0; for i=1:3 mo = mo + students{i,4}(2); ; mo = mo/3 Αποτελέσματα students = 'John' [75] [ 1.8] [1x3 double] 'Nic' [82] [1.75] [1x3 double] 'Anna' [58] [ 1.7] [1x3 double] AnnaWeight = 58 John2ndDegree = 9 AnnaName = Anna Anna4thLetter = a mo = 7.5 Σημείωση: Στο πρώτο παράδειγμα το cell array με όνομα students χρησιμοποιήθηκε ως βάση δεδομένων (με κάθε γραμμή να είναι και από μια εγγραφή, και οι στήλες να περιέχουν τα πεδία της βάσης), αυτό όμως δεν είναι υποχρεωτικό (π.χ. δεν είναι ανάγκη τα στοιχεία της πρώτης στήλης ενός cell array να περιέχουν όλα συμβολοσειρές).

100 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Συναρτήσεις για cell arrays Ακολουθούν λίγες βασικές συναρτήσεις για τα cell arrays: cell A = cell(m,n,...) Δημιουργία ενός κενού cell array με όνομα A και διαστάσεις m n... celldisp celldisp(a) Απεικόνιση ενός cell array: Η celldisp προκαλεί την απεικόνιση όλων των στοιχείων ενός cell array, καθώς η «απλή» disp (ή η παράλειψη του ελληνικού ερωτηματικού στο τέλος) προκαλεί μόνο συνοπτική παρουσίαση των περιεχομένων του. cellplot cellplot(c) Γραφική απεικόνιση ενός cell array: Η cellplot εμφανίζει ένα παράθυρο γραφικών (figure) με μια γραφική απεικόνιση του cell array, όπου κάθε τύπος μεταβλητής απεικονίζεται με διαφορετικό τρόπο με σκοπό το γρήγορο οπτικό έλεγχο του είδους των περιεχομένων του. Παραδείγματα struct.a = 143; struct.b = {'W';7}; C = {'Nic', struct, {150;44}}; disp('1. disp(c):'); disp(c); disp(' '); disp('2. celldisp(c):'); celldisp(c); Αποτελέσματα 1. disp(c): 'Nic' [1x1 struct] {2x1 cell} 2. celldisp(c): C{1} = Nic C{2} = a: 143 b: {2x1 cell} C{3}{1} = 150 C{3}{2} = 44 cellplot(c);

Δομές 101 Ερωτήσεις 12.1 Να οριστούν οι έννοιες: δομή, πεδίο, πίνακας δομών, εγγραφή, βάση δεδομένων. 12.2 Να προσδιοριστεί μια διαφορά των δομών από τους πίνακες. 12.3 Να υπολογιστεί το μέγεθος (σε bytes) της δομής που ορίστηκε στο MATLAB με τις παρακάτω εντολές στο Command Window: >> Patient.Name = 'John'; >> Patient.Age = 35; >> Patient.Weight = 85; >> Patient.Height = 1.80; >> Patient.ExamValues = [1.24 30.02 0.3]; 12.4 Πρόκειται να δημιουργηθεί μια βάση δεδομένων με δημογραφικά στοιχεία ασθενών. Κάθε εγγραφή της βάσης θα έχει δύο πεδία: το όνομα και την ηλικία του ασθενούς. Ποιός από τους δύο παρακάτω πίνακες δομών είναι λογικά καταλληλότερος για την ανάπτυξη της βάσης, και γιατί; Πίνακας δομών #1: Patient.Name(1) = 'John'; Patient.Age(1) = 35; Patient.Name(2) = 'Mary'; Patient.Age(2) = 24; Πίνακας δομών #2: Patient(1).Name = 'John'; Patient(1).Age = 35; Patient(2).Name = 'Mary'; Patient(2).Age = 24; 12.5 Να σημειωθούν με [Σ] οι σωστές και με [Λ] οι λανθασμένες απαντήσεις: [ ] Στα πεδία μιας δομής αποθηκεύονται μεταβλητές πάντοτε ίδιου τύπου. [ ] Ένας πίνακας δεν είναι δυνατόν να είναι πεδίο μιας δομής. [ ] Ένα πεδίο μιας δομής μπορεί να περιέχει συμβολοσειρά. [ ] Η εντολή "struct.field(1) = 40;" ορίζει το πρώτο στοιχείο ενός πίνακα, ο οποίος είναι πεδίο δομής (ποιο είναι το όνομα του πίνακα και ποιο της δομής;). [ ] Η εντολή "struct(1).field = 40;" ορίζει ένα πεδίο της πρώτης εγγραφής ε- νός πίνακα δομών (ποιο είναι το όνομα του πίνακα δομών και ποιο του πεδίου;). 12.6 Στο παρακάτω τμήμα κώδικα προγράμματος αρχικά ορίζεται μια δομή με δύο πεδία, το όνομα (συμβολοσειρά) και οι βαθμοί (αριθμητικός πίνακας) ενός σπουδαστή. Στη συνέχεια επιχειρείται να βρεθεί η μέση τιμή των βαθμών του σπουδαστή, να αποθηκευτεί σε ένα νέο πεδίο της δομής και να απεικονιστεί με fprintf με κατάλληλο μήνυμα. Να βρεθούν τα σφάλματα του προγράμματος και να γραφτεί ο διορθωμένος κώδικας στις κενές γραμμές στο δεξιό τμήμα: stud.name = 'John'; stud.degr = [8 10 7]; s = 0; for i=1:length(stud.degr) s = s + degr(i); stud.mean = s/length(degr); fprintf('mean degree of %s is %f',name,mean);

102 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Ασκήσεις 12.7 α) Να δημιουργηθεί με κατάλληλες εντολές στο Command Window μια δομή η οποία να περιέχει το όνομα, το επώνυμο, την ηλικία, το βάρος και το ύψος ενός ασθενούς. β) Στη συνέχεια, με μία κατάλληλη εντολή fprintf, να τυπωθεί στο Command Window ένα μήνυμα όπως στο επόμενο παράδειγμα με τυχαίες τιμές των στοιχείων ενός ασθενούς: Patient John is 45 age old. 12.8 Να γραφτεί κατάλληλο πρόγραμμα στο οποίο: α) Θα ζητούνται από το πληκτρολόγιο τα παρακάτω στοιχεία ενός σπουδαστή, τα ο- ποία θα αποθηκεύονται σε κατάλληλα αντίστοιχα πεδία μιας δομής: Όνομα (συμβολοσειρά) Αριθμός Μητρώου (συμβολοσειρά) Εξάμηνο (συμβολοσειρά) Βαθμοί (αριθμητικός πίνακας με 5 στοιχεία, για βαθμούς 5 μαθημάτων) β) Θα υπολογίζεται η μέση τιμή των βαθμών του σπουδαστή, η οποία θα αποθηκεύεται σε κατάλληλο επόμενο πεδίο της δομής. 12.9 Να τροποποιηθεί το πρόγραμμα της άσκησης 12.8 με χρήση πίνακα δομών αντί απλής δομής, ώστε να είναι δυνατή η εισαγωγή στοιχείων για 100 σπουδαστές. Στη συνέχεια να τυπωθούν τα στοιχεία των σπουδαστών στο Command Window, με μία γραμμή ανά σπουδαστή, όπως στο ακόλουθο παράδειγμα: Nikos Nikolaidis (AM=1074). Mesi timi bathmwn = 7.4 12.10 Να δημιουργείται μια δομή με τα εξής πεδία σπουδαστών: Όνομα (συμβολοσειρά), Αριθμός Μητρώου (συμβολοσειρά), Εξάμηνο (χαρακτήρας), Βαθμοί (αριθμητικός πίνακας), Μέση τιμή βαθμών (αριθμός). 12.11 Ο Δείκτης Σωματικού Βάρους (Body Mass Index, BMI) ενός ατόμου ισούται με το πηλίκο του βάρους του (σε kg) προς το τετράγωνο του ύψους του (σε m): Βάρος (kg) BMI = Ύψος (m) 2 Ο Δείκτης Σωματικού Βάρους είναι ένας στατιστικός δείκτης για την εκτίμηση της παχυσαρκίας σε ενήλικες. Οι κατηγορίες του BMI είναι (http://www.nhlbisupport.com/bmi/): Λιπόβαρος: BMI < 18.5 Κανονικό βάρος: 18.5 BMI < 25 Υπέρβαρος: 25 BMI < 30 Παχύσαρκος: BMI 30 α) Να γραφτεί κατάλληλο πρόγραμμα για την εισαγωγή από το πληκτρολόγιο των στοιχείων 100 ασθενών, τα οποία θα αποθηκεύονται στα πεδία ενός πίνακα δομών 100 στοιχείων. Τα πεδία του πίνακα δομών πρέπει να είναι: όνομα, επώνυμο, ηλικία, βάρος, ύψος και δείκτης σωματικού βάρους (bmi). β) Ο δείκτης σωματικού βάρους δεν θα εισάγεται από το πληκτρολόγιο, αλλά θα υπολογίζεται από το βάρος και το ύψος του ασθενούς, και θα αποθηκεύεται στο κατάλληλο πεδίο του πίνακα δομών. γ) Μετά την εισαγωγή των στοιχείων των ασθενών, θα γίνεται εκτύπωση των στοιχείων τους στο Command Window, σε μία γραμμή ανά ασθενή, όπως στο ακόλουθο παράδειγμα: Patient: John Kalatzis. BMI = 27.8

13 Αρχεία 13.1 Είδη αρχείων Οι τιμές των μεταβλητών ενός προγράμματος μπορούν να αποθηκεύονται στα μέσα μόνιμης αποθήκευσης σε ομάδες δεδομένων που ονομάζονται αρχεία. Τα δεδομένα μπορούν να αποθηκευτούν στα αρχεία με δύο μορφές: α) ως δυαδικοί αριθμοί που αντιστοιχούν σε χαρακτήρες κειμένου του πίνακα ASCII (βλ. 1.5), οπότε τα αρχεία ονομάζονται αρχεία κειμένου (text files), ή β) ως δυαδικοί αριθμοί που δεν αντιστοιχούν αναγκαστικά σε χαρακτήρες ASCII, οπότε τα αρχεία ονομάζονται δυαδικά αρχεία (binary files). Τα αρχεία κειμένου είναι εύκολα αναγνώσιμα με οποιονδήποτε διορθωτή αρχείων κειμένου (editor) όπως το Notepad (Σημειωματάριο) των Windows. Στη συνέχεια θα δειχθεί πώς είναι δυνατόν να εγγραφούν τιμές μεταβλητών σε μαγνητικά μέσα (σκληρός δίσκος, δισκέτα, μνήμη flash), καθώς και το αντίστροφο (πώς να αναγνωστούν από το δίσκο σε μεταβλητές). 13.2 Άνοιγμα και κλείσιμο αρχείου Πριν χρησιμοποιηθεί ένα αρχείο πρέπει να «ανοιχθεί» (δηλαδή να δεσμευτεί το όνομά του για αποκλειστική χρήση), ενώ μετά πρέπει να «κλείσει» (δηλαδή να αποδεσμευτεί). fopen <μεταβλητή_αρχείου> = fopen('όνομα_αρχείου', 'επιλογές') Άνοιγμα αρχείου για ανάγνωση ή εγγραφή: Η μεταβλητή_αρχείου (file identifier) α- ντιπροσωπεύει μέσα στο πρόγραμμα το 'αρχείο'. Μπορούν να είναι ανοιχτά πολλά αρχεία ταυτόχρονα, με διαφορετικές μεταβλητές_αρχείου. Αν και δεν είναι υποχρεωτικό, συστήνεται να χρησιμοποιείται η επέκταση '.txt' στα αρχεία κειμένου που δημιουργεί ο χρήστης στα Windows, για να γίνεται εύκολα ο έλεγχός τους με τη βοήθεια π.χ. του Notepad (Σημειωματάριο). Η παράμετρος 'επιλογές' δηλώνει με ποιόν τρόπο θα χρησιμοποιηθεί το αρχείο. Οι συνήθεις τιμές της είναι 'w' για εγγραφή (write), 'a' για προσθήκη (app) ή 'r' για ανάγνωση (read), σε συνδυασμό με τις 't' για αρχείο κειμένου (text) ή 'b' για δυαδικό αρχείο (binary) αντίστοιχα: Τρόπος χρήσης αρχείου Για αρχεία κειμένου Για δυαδικά αρχεία Άνοιγμα αρχείου για εγγραφή (write) 'wt' 'wb' Άνοιγμα αρχείου για προσθήκη (app) δεδομένων 'at' 'ab' Άνοιγμα αρχείου για ανάγνωση (read) 'rt' 'rb' Η διαφορά της εγγραφής (write) από την προσθήκη (app) είναι ότι, αν το αρχείο υπάρχει στο δίσκο, η εγγραφή ('w') το σβήνει και το ξαναδημιουργεί με τα νέα δεδομένα, ενώ η προσθήκη ('a') έχει ως αποτέλεσμα την προσθήκη των νέων δεδομένων μετά το τέλος των προηγουμένων. fclose fclose(<μεταβλητή_αρχείου>) Κλείσιμο του αρχείου μετά τη χρήση του. Παράδειγμα % Π.χ.1: Άνοιγμα για εγγραφή αρχείου κειμένου στο Current Directory. fid = fopen('mydata.txt', 'wt'); % Π.χ.2: Άνοιγμα για προσθήκη νέων δεδομένων σε δυαδικό αρχείο στη δισκέτα. fid = fopen('a:\mydata.dat', 'ab'); % Π.χ.3: Κλείσιμο αρχείου. fclose(fid);

104 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 13.3 Αρχεία κειμένου Για εγγραφή (αποθήκευση τιμών μεταβλητών σε μαγνητικό μέσο) και ανάγνωση (ανάκτηση τιμών από μαγνητικό μέσο σε μεταβλητές) αρχείων κειμένου μπορούν να χρησιμοποιηθούν οι συναρτήσεις fprintf και fscanf: fprintf (σε μορφή για εγγραφή σε αρχείο κειμένου) fprintf(<μεταβλητή_αρχείου>, 'παράσταση', <μεταβλητές>) Εγγραφή τιμών μεταβλητών σε αρχείο κειμένου: H μεταβλητή_αρχείου είναι αυτή με την οποία έχει ανοιχθεί το αρχείο με την fopen. Κατά τα άλλα η fprintf λειτουργεί όμοια όπως για εκτύπωση στην οθόνη (η 'παράσταση' περιέχει κείμενο και ειδικούς χαρακτήρες, \n, %d, %f, %c, %s). fscanf <μεταβλητή> = fscanf(<μεταβλητή_αρχείου>, 'μορφή', <πλήθος>) Ανάγνωση τιμών από αρχείο σε μεταβλητές κειμένου: Διαβάζονται τόσα στοιχεία από το αρχείο όσα δηλώνει το πλήθος (που μπορεί να είναι και ίσο με Inf, οπότε το αρχείο διαβάζεται μέχρι το τέλος του), και αποθηκεύονται στη μεταβλητή με μορφή κειμένου. Εάν επαναληφθεί η fscanf πριν κλείσει το αρχείο, η ανάγνωση συνεχίζεται από το σημείο που είχε σταματήσει προηγουμένως. Η 'μορφή' δηλώνει τον τύπο των δεδομένων, δηλαδή ακέραιος (%d), κινητής υποδιαστολής (%f), χαρακτήρας (%c) ή συμβολοσειρά (%s). Ο τύπος %s αγνοεί τους «λευκούς» χαρακτήρες (δηλαδή κενό διάστημα/space, στηλοθέτες/tab και αλλαγή γραμμής/enter), οι οποίοι μπορούν να διαβαστούν μόνο με %c. Παραδείγματα Αποτελέσματα name = 'John'; w = 85.2; % Άνοιγμα για εγγραφή, Εγγραφή, Κλείσιμο fid = fopen('mydata.txt', 'wt'); fprintf(fid, '%s weights %.1f kg.', name, w); fclose(fid); Έχει δημιουργηθεί ένα αρχείο στο current directory με όνομα mydata.txt, στο οποίο έχει γραφτεί: John weights 85.2 kg. % Άνοιγμα για διάβασμα, Διάβασμα, Κλείσιμο fid = fopen('mydata.txt', 'rt'); a = fscanf(fid, '%c', 12); b = fscanf(fid, '%f', 1); fclose(fid); % Εκτύπωση μεταβλητών στην οθόνη disp(a); disp(b); fid = fopen('mydata.txt', 'rt'); a = fscanf(fid, '%s', 2) b = fscanf(fid, '%d', 1) fclose(fid); John weights 85.2 A = Johnweights b = 85

Αρχεία 105 Οι επόμενες δύο συναρτήσεις του MATLAB είναι πολύ χρήσιμες για ανάγνωση ολόκληρων γραμμών από αρχεία κειμένου: fgetl <μεταβλητή> = fgetl(<μεταβλητή_αρχείου>) Διαβάζει μια γραμμή κειμένου από το αρχείο που σχετίζεται με μια μεταβλητη_αρχείου και την αποθηκεύει στη μεταβλητή. fgets <μεταβλητή> = fgets(<μεταβλητή_αρχείου>) Διαβάζει μια γραμμή κειμένου, μαζί με το χαρακτήρα αλλαγής γραμμής, από το αρχείο που σχετίζεται με μια μεταβλητή_αρχείου και την αποθηκεύει στη μεταβλητή. Η μόνη διαφορά των δύο συναρτήσεων είναι ότι η fgets διαβάζει και το χαρακτήρα αλλαγής γραμμής (enter), ενώ η fgetl όχι. Παράδειγμα 1 % Έστω το αρχείο days.txt που περιέχει τις % ημέρες της εβδομάδας, μία σε κάθε γραμμή. fid = fopen('days.txt', 'rt'); for i=1:7 day = fgetl(fid); if day(1)=='s' disp('week!'); else disp([day ' is a weekday']); fclose(fid); Αποτέλεσμα Week! Monday is a weekday Tuesday is a weekday Wednesday is a weekday Thursday is a weekday Friday is a weekday Week! >> Παράδειγμα 2 % Ανάγνωση της 1ης γραμμής του αρχείου days.txt με getl: fid = fopen('days.txt', 'rt'); s1 = fgetl(fid); fclose(fid); % Ανάγνωση της 1ης γραμμής του αρχείου days.txt με gets: fid = fopen('days.txt', 'rt'); s2 = fgets(fid); fclose(fid); % Απεικόνιση των τελευταίων χαρακτήρων των μεταβλητών s1 και s2 s1(length(s1)) s2(length(s2)) Αποτέλεσμα ans = y ans = >> Σχόλιο: Στις συμβολοσειρές s1 και s2 περιέχεται η πρώτη γραμμή του αρχείου days.txt, π.χ. Sunday. ο τελευταίος χαρακτήρας της συμβολοσειράς s1 είναι ο χαρακτήρας 'y', διότι έχει διαβαστεί με την fgetl. Αντίθετα, ο τελευταίος χαρακτήρας της συμβολοσειράς s2 είναι ο χαρακτήρας αλλαγής γραμμής, γιατί έχει διαβαστεί με την fgets.

106 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 13.4 Δυαδικά αρχεία Για εγγραφή δεδομένων σε δυαδική μορφή μπορεί να χρησιμοποιηθεί η συνάρτηση fwrite. Για ανάγνωση δεδομένων από δυαδικό αρχείο μπορεί να χρησιμοποιηθεί η συνάρτηση fread, αρκεί να είναι γνωστός ο τρόπος που έχει γίνει η εγγραφή. fwrite fwrite(<μεταβλητή_αρχείου>, <μεταβλητή>, 'ακρίβεια') Εγγραφή σε δυαδικό αρχείο: Η μεταβλητή μπορεί να είναι μόνο απλή μεταβλητή ή πίνακας (υπενθυμίζεται ότι, αν και μια δομή δεν είναι απλή μεταβλητή, εν τούτοις τα πεδία της είναι βλ. και παράδειγμα παρακάτω). Η 'ακρίβεια' καθορίζει πόσα bytes θα δεσμευτούν στο μέσο εγγραφής για τη μεταβλητή. Συνήθεις χρήσιμες τιμές της είναι: 'char' χαρακτήρας, 1 byte 'int' ακέραιος, 4 bytes 'float' κινητής υποδιαστολής, 4 bytes 'double' κινητής υποδιαστολής, 8 bytes fread <μεταβλητή> = fread(<μεταβλητή_αρχείου>, <πλήθος>, 'ακρίβεια') Ανάγνωση από δυαδικό αρχείο: Διαβάζονται τόσα στοιχεία από το αρχείο όσα δηλώνει το πλήθος (που μπορεί να είναι και ίσο με Inf, οπότε το αρχείο διαβάζεται μέχρι το τέλος του), και αποθηκεύονται στη μεταβλητή. Εάν επαναληφθεί η fread πριν κλείσει το αρχείο, η ανάγνωση συνεχίζεται από το σημείο που είχε σταματήσει προηγουμένως. H 'ακρίβεια' πρέπει να είναι αυτή με την οποία γράφτηκαν οι μεταβλητές με την fwrite ('char' 1byte, 'int' 4bytes, 'float' 4bytes ή 'double' 8bytes). Σημείωση: Ειδικά για τις μεταβλητές χαρακτήρα, αν θέλουμε να επιστραφούν με μορφή χαρακτήρα, πρέπει να θέσουμε την 'ακρίβεια' ίση με '*char', αλλιώς επιστρέφεται ο ASCII κωδικός τους. Παραδείγματα data.name = 'Nicolas'; data.weight = 85.2; % Άνοιγμα για εγγραφή, Εγγραφή, Κλείσιμο fid = fopen('h:mydata.bin', 'wb'); fwrite(fid, data.name, 'char'); fwrite(fid, data.weight, 'float'); fclose(fid); Αποτελέσματα Έχει δημιουργηθεί ένα αρχείο στη μονάδα H: (π.χ. USB stick) με όνομα mydata.bin. Το αρχείο έχει μέγεθος 11 bytes (7 bytes για τη μεταβλητή data.name='nicolas' ως τύπου 'char' και 4 bytes για τη μεταβλητή 'float'). % Άνοιγμα για διάβασμα, Διάβασμα, Κλείσιμο fid = fopen('mydata.bin', 'rb'); a = fread(fid, 7, '*char')' b = fread(fid, 1, 'float')' fclose(fid); a = Nicolas b = 85.2

Αρχεία 107 13.5 Έλεγχος του δείκτη θέσης σε αρχείο Κατά την ανάγνωση ενός αρχείου είναι χρήσιμη η γνώση του δείκτη θέσης, δηλαδή του σημείου όπου έχει σταματήσει η ανάγνωση. Επίσης είναι χρήσιμη και η δυνατότητα μετακίνησης του δείκτη σε άλλη θέση, ώστε να μπορεί να συνεχιστεί η ανάγνωση από άλλο σημείο. ftell <θέση> = ftell(<μεταβλητή_αρχείου>) Δείκτης θέσης σε αρχείο: Επιστρέφεται η θέση μέσα στο αρχείο στην οποία έχει σταματήσει η ανάγνωση, με τη μορφή ενός θετικού ακέραιου που ξεκινάει από το μηδέν και δείχνει την «απόσταση» σε bytes του δείκτη θέσης από την αρχή του αρχείου. Παράδειγμα fid = fopen('mydata.txt', 'rt'); a = fscanf(fid, '%c', 6); position1 = ftell(fid) b = fscanf(fid, '%c', 1); position2 = ftell(fid) fclose(fid); Αποτέλεσμα position1 = 6 position2 = 7 fseek fseek(<μεταβλητή_αρχείου>, <μετακίνηση>, 'αφετηρία') Μετακίνηση του δείκτη θέσης: Ο δείκτης θέσης μετακινείται κατά τόσα bytes όσα ορίζει η μετακίνηση σε σχέση με την 'αφετηρία'. Η μετακίνηση μπορεί να είναι θετική (μετακίνηση προς το τέλος του αρχείου), αρνητική (μετακίνηση προς την αρχή του αρχείου) ή μηδέν (καμία μετακίνηση). Η 'αφετηρία' μπορεί να είναι 'bof' (beginning of file, αρχή του αρχείου) 'cof' (current position, τρέχουσα θέση) ή 'eof' ( of file, τέλος του αρχείου). Παραδείγματα % Απεικόνιση του τελευταίου χαρακτήρα του αρχείου fid = fopen('mydata.txt', 'rt'); fseek(fid, -1,'eof'); lastcharacter = fscanf(fid, '%c', 1) fclose(fid); Αποτέλεσμα (Διάβασμα από το 'mydata.txt' του τελευταίου χαρακτήρα του αρχείου και απεικόνισή του στο Command Window.) % Επαναφορά του δείκτη θέσης στην αρχή fseek(fid, 0,'bof'); % Η επαναφορά του δείκτη θέσης στην αρχή γίνεται και με την εντολή frewind: frewind(fid); feof <έλεγχος_τέλους> = feof(<μεταβλητή_αρχείου>) Έλεγχος του τέλους του αρχείου (-of-file): Η feof επιστρέφει τη λογική τιμή 1 (true) αν ο δείκτης θέσης του αρχείου είναι στο τέλος, αλλιώς επιστρέφει 0 (false). Παράδειγμα % Read till the -of-file fid = fopen('mydata.txt', 'rt'); while ~feof(fid) a = fscanf(fid, '%c', 1); fprintf('%c',a); fclose(fid); Αποτέλεσμα John weights 85.2 kg.

108 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 13.6 Παραδείγματα τρόπου εργασίας με αρχεία κειμένου α) Παράδειγμα εγγραφής δεδομένων από πίνακα δομών σε αρχείο κειμένου: Έστω ότι επιθυμούμε (i) να εισάγουμε σε ένα πίνακα δομών τα εξής στοιχεία για 100 σπουδαστές: Όνομα, Αριθμός μητρώου, Βαθμοί 5 μαθημάτων και (ii) την εγγραφή των στοιχείων αυτών σε ένα αρχείο κειμένου, σε 3 γραμμές για κάθε σπουδαστή (το όνομα στην 1 η γραμμή, ο αριθμός μητρώου στη 2 η και οι 5 βαθμοί στην 3 η, χωρισμένοι με κενό διάστημα (space). Για παράδειγμα, το αρχείο με τα στοιχεία των σπουδαστών μπορεί να είναι ως εξής: students.txt Nikolaou 06042 8.5 6.0 9.0 10.0 7.5 Georgiou 04134 7.0 5.0 8.0 6.5 9.0 Anagnostopoulos 05206 6.5 7.0 9.5 10.0 7.5... Ο κώδικας του προγράμματος, που υλοποιεί το παραπάνω πρόβλημα, μπορεί να είναι ο εξής: students_write.m clc; clear all; N = 100; % Πλήθος σπουδαστών n = 5; % Πλήθος βαθμών % Εισαγωγή στοιχείων σε πίνακα δομών for i=1:n s(i).n = input('name: ', 's'); s(i).am = input('am: ', 's'); for j=1:n message = sprintf('degree %d: ',j); s(i).d(j) = input(message); fprintf('\n'); % Εγγραφή πίνακα δομών σε αρχείο κειμένου fid = fopen('students.txt', 'wt'); for i=1:n fprintf(fid,'%s\n',s(i).n); fprintf(fid,'%s\n',s(i).am); for j=1:n fprintf(fid,'%.1f ',s(i).d(j)); if i<n fprintf(fid,'\n'); Αποτελέσματα Name: Nikolaou AM: 06042 Degree 1: 8.5 Degree 2: 6 Degree 3: 9 Degree 4: 10 Degree 5: 7.5 Name: Georgiou AM: 04134 Degree 1: 7 Degree 2: 5 Degree 3: 8 Degree 4: 6.5 Degree 5: 9 Name: Anagnostopoulos AM: 05206 Degree 1: 6.5 Degree 2: 7 Degree 3: 9.5 Degree 4: 10 Degree 5: 7.5... >> fclose(fid);

Αρχεία 109 Παρατήρηση: Κατά την εγγραφή των στοιχείων κάθε σπουδαστή, μετά από τους 5 βαθμούς εγγράφεται ένας χαρακτήρας αλλαγής γραμμής. Αυτό γίνεται σε όλους τους σπουδαστές, ε- κτός από την τελευταία επανάληψη (if i<n...). Αυτό γίνεται ώστε να μην υπάρχει μια α- κόμα γραμμή (έστω και κενή) μετά το τέλος των δεδομένων, καθώς αυτό θα δυσκόλευε την κατασκευή του προγράμματος ανάγνωσης του αρχείου (βλέπε επόμενο παράδειγμα). β) Παράδειγμα ανάγνωσης δεδομένων από αρχείο κειμένου σε πίνακα δομών: Έστω ότι διαθέτουμε το αρχείο students.txt που δημιουργήθηκε με το προηγούμενο παράδειγμα, και ότι επιθυμούμε να διαβάσουμε τα δεδομένα που περιέχει και να τα εισάγουμε σε έναν πίνακα δομών. Ο κώδικας του προγράμματος, που υλοποιεί το παραπάνω πρόβλημα (που ουσιαστικά είναι το αντίστροφο του προηγούμενου παραδείγματος), μπορεί ναι είναι ο εξής: students_read.m clc; clear all; n = 5; % Ανάγνωση δεδομένων από το αρχείο κειμένου % και εισαγωγή τους σε πίνακα δομών. fid = fopen('students1.txt', 'rt'); i = 0; while ~feof(fid) i = i + 1; s(i).n = fgetl(fid); s(i).am = fgetl(fid); for j=1:n s(i).d(j) = fscanf(fid,'%f',1); temp = fscanf(fid,'%c',1); Αποτελέσματα Nikolaou (AM: 06042) Degrees: 8.5 6.0 9.0 10.0 7.5 Georgiou (AM: 04134) Degrees: 7.0 5.0 8.0 6.5 9.0 Anagnostopoulos (AM: 05206) Degrees: 6.5 7.0 9.5 10.0 7.5... >> fclose(fid); % Απεικόνιση των στοιχείων των σπουδαστών N = length(s); for i=1:n fprintf('%s (AM: %s)\n', s(i).n, s(i).am); fprintf('degrees:'); for j=1:n fprintf(' %.1f',s(i).d(j)); fprintf('\n\n'); Παρατήρηση: Κατά την ανάγνωση των στοιχείων κάθε σπουδαστή, μετά από τους 5 βαθμούς διαβάζεται ένας ακόμα χαρακτήρας. Αυτός είναι ο χαρακτήρας αλλαγής γραμμής, που δεν είναι δυνατόν να διαβαστεί με την fscanf(fid,'%f',1), γιατί είναι τύπου %c και όχι %f. Επειδή αυτός ο χαρακτήρας δεν μας χρειάζεται, εισάγεται σε μια προσωρινή μεταβλητή που δεν χρησιμοποιείται (temp).

110 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 13.7 Ιδιαίτερες συναρτήσεις του MATLAB για χειρισμό αρχείων Εκτός από τον κλασσικό τρόπο χειρισμού των αρχείων που προαναφέρθηκε, και που με μικρές διαφορές εφαρμόζεται και σε άλλες γλώσσες προγραμματισμού (όπως η C), το MATLAB προσφέρει και ιδιαίτερες εξειδικευμένες συναρτήσεις με σκοπό τον εύκολο χειρισμό αρχείων (με τις οποίες όμως ο προγραμματιστής δεν έχει απόλυτο έλεγχο της εγγραφής ή της ανάγνωσης των δεδομένων). Στις παρακάτω συναρτήσεις δεν απαιτείται άνοιγμα και κλείσιμο του αρχείου (γίνεται αυτόματα στο εσωτερικό τους). Βλ. και 15.6. save (αναφέρεται μόνο η περίπτωση αποθήκευσης δεδομένων σε αρχεία κειμένου) save('αρχείο', 'μεταβλητή', '-ascii') save('αρχείο', 'μεταβλητή', '-ascii', '-app') Εγγραφή απλών μεταβλητών και πινάκων σε μαγνητικό μέσο: Η 'μεταβλητή' γράφεται στο 'αρχείο'. Αν και δεν είναι υποχρεωτικό, συστήνεται να χρησιμοποιείται η επέκταση '.txt' στα αρχεία κειμένου που δημιουργεί ο χρήστης στα Windows, για να γίνεται εύκολα ο έλεγχός τους με τη βοήθεια π.χ. του Notepad. Η παράμετρος '-ascii' καθορίζει ότι η εγγραφή θα γίνει σε μορφή κειμένου. Η εγγραφή γίνεται αποκλειστικά σε αριθμητική μορφή (οι μη αριθμητικοί χαρακτήρες αντικαθίστανται από τον αντίστοιχο κωδικό ASCII ή Unicode). Προσοχή: Σε περίπτωση που ήδη υπάρχει το αρχείο, τότε αυτό διαγράφεται και επαναδημιουργείται με εγγραφή μόνο των νέων μεταβλητών, εκτός αν υπάρχει η παράμετρος '-app', οπότε νέα δεδομένα εγγράφονται μετά το τέλος των προηγούμενων. save('αρχείο', '-struct', 'δομή', '-ascii') save('αρχείο', '-struct', 'δομή', 'πεδίο1', 'πεδίο2',..., '-ascii') Εγγραφή απλών δομών (δηλαδή όχι δομών-πινάκων) σε μαγνητικό μέσο: Η 'δομή' γράφεται στο 'αρχείο'. Με το δεύτερο τρόπο σύνταξης εγγράφονται μόνο τα συγκεκριμένα πεδία 'πεδίο1', 'πεδίο2' κλπ. Παράδειγμα % Εγγραφή της μεταβλητής DataX σε αρχείο κειμένου. save('mydata.txt', 'DataX', '-ascii'); % Δήλωση του ονόματος και της διαδρομής του αρχείου με συμβολοσειρά. name_and_path = 'c:\matlab7\work\mydata.txt'; save(name_and_path, 'DataX', '-ascii'); % Εγγραφή δομής-πίνακα, μετά το τέλος των προηγουμένων δεδομένων. save('patientsdata.txt', '-struct', 'patients', '-ascii', '-app'); % Εγγραφή των συγκεκριμένων πεδίων name και BMI μιας δομής-πίνακα. save('patientsdata.txt', '-struct', 'patients', 'name', 'BMI', '-ascii'); load (αναφέρεται μόνο η περίπτωση ανάγνωσης αρχείων κειμένου) <πίνακας> = load('αρχείο') Ανάγνωση αριθμητικών μεταβλητών από αρχείο κειμένου. Τα περιεχόμενα του αρχείου αποθηκεύονται στον πίνακα. Το αρχείο πρέπει να περιέχει μόνο αριθμητικά δεδομένα σε μορφή πίνακα, δηλαδή σε γραμμές με ίδιο πλήθος στοιχείων η κάθε μια, που χωρίζονται με κενό (space), στηλοθέτη (tab), κόμμα (,) ή ελληνικό ερωτηματικό (;). Παράδειγμα Έστω ότι το αρχείο mydata.txt περιέχει τα εξής αριθμητικά δεδομένα: 7.5 4-12 -4 8 1 Τότε η συνάρτηση load φορτώνει τα δεδομένα και τα αποθηκεύει σε έναν πίνακα: A = load('mydata.txt');

Αρχεία 111 Συναρτήσεις ελέγχου του πλήρους ονόματος ενός αρχείου (διαδρομή-όνομα-επέκταση): fileparts [διαδρομή, κυρίωςόνομα, επέκταση] = fileparts(πλήρες_όνομα_αρχείου) Διαχωρισμός του πλήρους ονόματος ενός αρχείου στα επιμέρους στοιχεία του: Η διαδρομή, το κυρίως όνομα και η επέκταση του αρχείου αποθηεύονται στις αντίστοιχες μεταβλητές με μορφή συμβολοσειράς (string). fullfile πλήρες_όνομα_αρχείου = fullfile(φάκελος1, φάκελος2,, όνομααρχείου) Δημιουργία του πλήρους ονόματος ενός αρχείου με διασύνδεση της διαδρομής από επιμέρους φακέλους και του ονόματος του αρχείου. Το πλήρες_όνομα_αρχείου αποθηκεύεται με μορφή συμβολοσειράς (string). Παράδειγμα [pathstring, name, ext] = fileparts('c:\my Documents\Examples\mydata.txt'); newname = fullfile(pathstring, 'today', [name '.dat']) Αποτέλεσμα newname = C:\My Documents\Examples\today\mydata.dat Συνάρτηση λήψης ονομάτων αρχείου μέσω παραθύρου διαλόγου: uigetfile Π.χ. για λήψη των ονομάτων (File) και της διαδρομής (Path) πολλών αρχείων: [Files, Path] = uigetfile({'*.txt;','text files (*.txt)';'*.*','all files (*.*)'},'Select files','multiselect','on'); 13.8 Ιδιαίτερες συναρτήσεις του MATLAB για χειρισμό φακέλων Απεικόνιση καταλόγου με τα ονόματα των αρχείων ενός φακέλου dir Απεικόνιση των αρχείων του current directory/folder dir('directory_name') Απεικόνιση των αρχείων του φακέλου με όνομα directory_name files = dir('directory_name') Αποθήκευση σε έναν πίνακα δομών των ιδιοτήτων των αρχείων (όνομα, μέγεθος, ημερομηνία, αν το αρχείο είναι φάκελος ή όχι) του φακέλου με όνομα directory_name. Σημείωση: Η συνάρτηση dir ΔΕΝ είναι η εντολή dir της γραμμής εντολών. Για κλήση των εντολών του λειτουργικού συστήματος χρησιμοποιούμε το πρόθεμα «!», π.χ.!dir Απεικόνιση ή αλλαγή του current directory/folder cd Απεικόνιση του current directory/folder. w = cd Αποθήκευση του current directory/folder στη συμβολοειρά w. cd('new_current_directory') Αλλαγή του current directory στο new_current_directory. 'Αλλες χρήσιμες συναρτήσεις χειρισμού φακέλων matlabroot Συνάρτηση που επιστρέφει το όνομα του φακέλου εγκατάστασης του Matlab. winopen Συνάρτηση η οποία ανοίγει έναν φάκελο σε περιβάλλον Windows. Παραδείγματα: winopen(matlabroot) Ανοίγει ο φάκελος εγκατάστασης του Matlab. winopen(cd) Ανοίγει ο φάκελος του current directory/folder.

112 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Ερωτήσεις 13.1 Ποια η διαφορά μεταξύ αρχείων κειμένου και δυαδικών αρχείων;. 13.2 Να αναφερθεί η χρησιμότητα κάθε μιας από τις παραμέτρους w, a, r, t και b στη συνάρτηση fopen. Ποιες από αυτές τις παραμέτρους χρησιμοποιούνται σε συνδυασμό; 13.3 Ποια η διαφορά των παραμέτρων w και a της συνάρτησης fopen; 13.4 Να σημειωθούν με [Σ] οι σωστές και με [Λ] οι λανθασμένες απαντήσεις: [ ] Η εντολή (συνάρτηση) fprintf χρησιμεύει για την απεικόνιση στην οθόνη (στο Command Window) καθώς και για εγγραφή σε αρχείο. [ ] Μεταβλητές τύπου χαρακτήρα μπορούν να γραφτούν μόνο σε αρχεία κειμένου και όχι σε δυαδικά αρχεία. [ ] Μεταβλητές τύπου κινητής υποδιαστολής χαρακτήρα μπορούν να εγγραφούν τόσο σε σε αρχεία κειμένου όσο και σε δυαδικά αρχεία. 13.5 Να περιγραφεί η διαφορά των δύο επόμενων εντολών ανοίγματος αρχείου: Εντολή 1: fid = fopen('data.txt', 'wt'); και Εντολή 2: fid = fopen('data.txt', 'at'); Ασκήσεις 13.6 Να γραφτεί κατάλληλο πρόγραμμα με το οποίο να δημιουργείται ένα αρχείο κειμένου με όνομα "numbers.txt" όπου να γράφονται, σε μία γραμμή, οι ακέραιοι αριθμοί από 1 έως 100, χωρισμένοι ο ένας από τον άλλον με κενό (space). 13.7 Να γραφτεί κατάλληλο πρόγραμμα με το οποίο να «ανοίγει» για ανάγνωση το αρχείο κειμένου που δημιουργήθηκε στην άσκηση 13.6 (letters.txt) και να διαβάζονται οι πρώτοι 10 ακέραιοι, οι οποίοι και να αποθηκεύονται στις 10 θέσεις ενός πίνακα. 13.8 Να γραφτεί κατάλληλο πρόγραμμα με το οποίο α) αρχικά να «ανοίγει» για ανάγνωση το αρχείο κειμένου που δημιουργήθηκε στην άσκηση 13.6 (letters.txt), β) στη συνέχεια να διαβάζεται ο 50ός χαρακτήρας του αρχείου (να χρησιμοποιηθεί η fseek) ο οποίος και να τυπώνεται με disp στο Command Window. 13.9 Να γραφτεί κατάλληλο πρόγραμμα με το οποίο να αποθηκεύεται στο σκληρό δίσκο ένα αρχείο κειμένου (temperatures.txt) μια λίστα θερμοκρασιών από 0 έως 100 ανά 5 βαθμών Κελσίου, με τις αντίστοιχες τιμές σε Φαρενάιτ, ως εξής: 0 32 5 41 10 50 100 212 Η σχέση των θερμοκρασιών σε βαθμούς Κελσίου και Φαρενάιτ είναι: T 9 T 32, όπου T C η θερμοκρασία σε βαθμούς Κελσίου και T F σε Φαρενάιτ. F 5 C Για την εγγραφή να χρησιμοποιηθεί η συνάρτηση fprintf. Οι θερμοκρασίες σε Κελσίου (πρώτη στήλη) πρέπει να χωρίζονται από τις θερμοκρασίες σε Φαρενάιτ (δεύτερη στήλη) με στηλοθέτη (tab, \t στην fprintf). 13.10 Να γραφτεί κατάλληλη συνάρτηση με όρισμα εισόδου μια τιμή θερμοκρασίας σε βαθμούς Κελσίου και έξοδο την αντίστοιχη τιμή θερμοκρασίας σε Φαρενάιτ. Η τιμή Φαρενάιτ πρέπει να βρίσκεται με τη βοήθεια του αρχείου αντιστοίχησης βαθμών θερμοκρασίας που δημιουργήθηκε στην άσκηση 13.9. Συγκεκριμένα, θα διαβάζονται με τη σειρά οι τιμές της πρώτης στήλης, και όταν βρεθεί η τιμή Κελσίου που είναι ίση με την είσοδο της συνάρτησης, θα διαβάζεται και θα επιστρέφεται ως έξοδος η τιμή της

Αρχεία 113 δεύτερης στήλης. Σε περίπτωση μη εύρεσης της θερμοκρασίας Κελσίου μέχρι το τέλος του αρχείου (π.χ. αν δοθεί τιμή Κελσίου που δεν είναι πολλαπλάσιο του 5, ή αν δοθεί τιμή άνω των 100 βαθμών Κελσίου) πρέπει να εμφανίζεται κατάλληλλο μήνυμα σφάλματος. 13.11 Να γραφτεί κατάλληλο πρόγραμμα με το οποίο να αποθηκεύεται στο σκληρό δίσκο ένα αρχείο κειμένου (letters.txt) που να περιέχει, σε μία γραμμή, όλα τα πεζά γράμματα του λατινικού αλφαβήτου (a, b,, z). Υπόδειξη: Να χρησιμοποιηθεί fprintf μέσα σε επαναληπτικο βρόχο for, σε συνδυασμό με το γεγονός ότι τα πεζά γράμματα του λατινικού αλφαβήτου βρίσκονται στις θέσεις από 97 έως 122 του πίνακα ASCII (βλ. και τη σημείωση 2 της συνάρτησης sprintf, 10.2). 13.12 Να γραφτεί κατάλληλο πρόγραμμα με το οποίο να διαβάζεται το αρχείο κειμένου που δημιουργήθηκε στην άσκηση 13.11 (letters.txt). Συγκεκριμένα, πρέπει να διαβάζονται ένας-ένας οι χαρακτήρες του αρχείου και μετά να τυπώνονται ο ένας κάτω από τον άλλον στο Command Window. 13.13 Να γραφτεί κατάλληλη συνάρτηση με όρισμα εισόδου έναν αριθμό n από 1 έως 26 και όρισμα εξόδου το n-οστό χαρακτήρα από το αρχείο letters.txt που δημιουργήθηκε στην άσκηση 13.11. Να χρησιμοποιηθεί η συνάρτηση fseek.

14 Γραφικά Στην ενότητα αυτή περιγράφονται οι βασικές συναρτήσεις που υποστηρίζουν τις γραφικές δυνατότητες του MATLAB, δηλαδή τη διαχείριση (α) γραφικών παραστάσεων & (β) εικόνων. Τα γραφικά του MATLAB εμφανίζονται σε ιδιαίτερα παράθυρα που λέγονται figures. 14.1 Γραφικές παραστάσεις Η δημιουργία γραφικών παραστάσεων σε 2 ή 3 άξονες είναι πολύ εύκολη στο MATLAB, λόγω των ενσωματωμένων συναρτήσεων. Καμπύλη σε 2 διαστάσεις της μορφής y=f(x) plot plot(x,y) Γραφική παράσταση των τιμών των μονοδιάστατων πινάκων x και y. Π.χ.: x = [0:0.1:2*pi]; y = sin(x); plot(x,y); plot(x,y,'προδιαγραφές_γραμμής') Οι 'προδιαγραφές_γραμμής' (line specifications) είναι σύμβολα που προδιαγράφουν το είδος και το χρώμα της γραμμής και των σημείων που σχεδιάζονται. Είδος γραμμής: / -- / : /. (συνεχής / διακεκομμένη / με τελίτσες / διακεκομμένη με τελίτσες, αντίστοιχα). Αν λείπει το είδος της γραμμής σχεδιάζονται μόνο σημεία. Είδος σημείου: + / ο / * /. / x / s / d / p / h / ^ / v / > / < (σταυρός / κύκλος / αστερίσκος / τελεία / χί / τετράγωνο / ρόμβος / πεντάγωνο / εξάγωνο / τρίγωνα, αντίστοιχα). Χρώμα γραμμής και σημείων: r / g / b / c / m / y / k / w (κόκκινο /πράσινο / μπλε / κυανό / ματζέντα / κίτρινο / μαύρο / άσπρο, αντίστοιχα). Π.χ.: plot(x,y,'bo-'); % μπλε κύκλοι που ενώνονται με συνεχή γραμμή plot(x,y,'bo'); % μπλε κύκλοι που δεν ενώνονται (χωρίς γραμμή) plot(x, y, 'property1', value1, 'property2', value2,...) Για περισσότερο έλεγχο στις γραμμές και στα σημεία (π.χ. διαφορετικό χρώμα της γραμμής από το σημείο) χρησιμοποιούνται οι ιδιότητες (properties). Οι ιδιότητες με τις τιμές τους (property_value) είναι: 'Marker': Είδος σημείου ('+', 'ο', '*', '.', 'x', 's', 'd', 'p', 'h', '^', 'v', '>', '<', 'none'). 'MarkerEdgeColor': Χρώμα περιγράμματος σημείου. 'MarkerFaceColor': Χρώμα εσωτερικού του σημείου. 'MarkerSize': Μέγεθος σημείου (σε points=1/72 της ίντσας). 'LineStyle': Είδος γραμμής ('-', '--', ':', '-.', 'none') 'Color': Χρώμα γραμμής. 'LineWidth': Πάχος γραμμής (σε points=1/72 της ίντσας). Οι τιμές των χρωμάτων των σημείων και των γραμμών μπορεί να είναι: 'r', 'g', 'b', 'c', 'm', 'y', 'k', 'none' (εκτός της ιδιότητας 'Color' που δεν δέχεται 'none') ή [R G B], δηλαδή μια τριάδα τιμών με το ποσοστό κάθε χρώματος RGB (red, green, blue). Για παράδειγμα: άσπρο=[1 1 1], μαύρο=[0 0 0], γκρι=[0.5 0.5 0.5], κόκκινο=[1 0 0], πράσινο: [0 1 0], μπλέ=[0 0 1], πορτοκαλί=[1 0.5 0.2] κλπ). Π.χ.: plot(x,y,'marker','s','markeredgecolor','r','markersize',3,'color','b');

Γραφικά 115 Αντί της plot μπορούν να χρησιμοποιηθούν με όμοιο τρόπο οι συναρτήσεις semilogx, semilogy και loglog για ημιλογαριθμικούς ή λογαριθμικούς άξονες. Παράδειγμα 1: % Στοιχειώδης plot: % Σημείο προς σημείο for x=-10:0.1:10 y = x^2; plot(x,y); hold on Παράδειγμα 2: % Διακρότημα (άθροισμα ταλαντώσεων με πολύ μικρή διαφορά συχνότητας) f1 = 10; f2 = 11; t = [0:0.001:4*pi]; y = 10*sin(f1*t) + 10*sin(f2*t); plot(t,y,'r'); Παράδειγμα 3: % Σύνθεση ταλαντώσεων ίδιας συχνότητας, με διαφορά φάσης π/6 x = [0:0.001:4*pi]; y1 = 5*sin(x+pi/6); y2 = 7*sin(x); y = y1 + y2; plot(x,y1,'b--'); hold on; plot(x,y2,'k:','linewidth',2); plot(x,y,'r'); axis([0 4*pi -12 12]); leg('y_1','y_2','y'); grid on;

116 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Επιφάνεια σε 3 διαστάσεις της μορφής z=f(x,y) Συνοπτικά, η απεικόνιση μιας επιφάνειας που ορίζεται αναλυτικά με εξίσωση της μορφής z = f(x,y) γίνεται σε 3 στάδια: - Αρχικά δημιουργείται ένα «πλέγμα» με τα ζεύγη των τιμών x και y, που γίνεται με τη συνάρτηση meshgrid. - Στη συνέχεια, βρίσκονται οι τιμές της μεταβλητής z για κάθε ζεύγος (x,y) του «πλέγματος», με τη βοήθεια της εξίσωσης z = f(x,y). - Τέλος, γίνεται τρισδιάστατη απεικόνιση των τριάδων (x, y, z) με μία από τις συναρτήσεις surf ή mesh. meshgrid [X,Y] = meshgrid(x,y) Δημιουργία «πλέγματος» με όλα τα ζεύγη των τιμών (x,y): Δημιουργούνται οι δισδιάστατοι πινάκες X και Υ, που τα αντίστοιχα στοιχεία τους περιέχουν όλα τα ζεύγη των τιμών των μονοδιάστατων πινάκων x και y, με σκοπό την τρισδιάστατη απεικόνιση της επιφάνειας z=f(x,y) μέσω της κατάλληλα διαμορφωμένης εξίσωσης Z=f(X,Y). Παράδειγμα Αποτέλεσμα x = [1 2 3] y = [40 50] [X,Y] = meshgrid(x,y) X = Y = 1 2 3 1 2 3 40 40 40 50 50 50 surf surf(x,y,z) Δημιουργία της επιφάνειας που ορίζεται από τις τριάδες που βρίσκονται στα αντίστοιχα στοιχεία των δισδιάστατων πινάκων X, Υ και Z. Για δημιουργία «διαφάνειας» ώστε να εμφανίζονται τα τμήματα της επιφάνειας που βρίσκονται «πίσω» από κάποια άλλα, χρησιμοποιείται η εντολή aplha. Παράδειγμα Αποτέλεσμα x = [-2:0.2:2]; y = [-2:0.2:2]; [X,Y] = meshgrid(x,y); Z = X.* exp(-x.^2 - Y.^2); surf(x,y,z); alpha(0.6);

Γραφικά 117 mesh mesh(x,y,z) Δημιουργία της επιφάνειας με μορφή «δικτυωτού πλαισίου» (wireframe) που ορίζεται από τις τριάδες που βρίσκονται στα αντίστοιχα στοιχεία των δισδιάστατων πινάκων X, Υ και Z. Για να αποκρύπτεται ή όχι το τμήμα της επιφάνειας που βρίσκονται «πίσω» από κάποια άλλα, χρησιμοποιείται η εντολή hidden. Παράδειγμα Αποτέλεσμα x = [-2:0.2:2]; y = [-2:0.2:2]; [X,Y] = meshgrid(x,y); Z = X.* exp(-x.^2 - Y.^2); mesh(x,y,z); hidden off Οι δύο παρακάτω συναρτήσεις χρησιμοποιούνται για εμφάνιση ή απόκρυψη τμημάτων που βρίσκονται πίσω από άλλα τμήματα της επιφάνειας σε μια τρισδιάστατη απεικόνιση: hidden hidden on / off Απόκρυψη / Εμφάνιση του τμήματος της επιφάνειας που βρίσκεται «πίσω» από άλλα τμήματα, σε επιφάνειες που έχουν δημιουργηθεί με τη συνάρτηση mesh. alpha alpha(ποσοστό) Δημιουργία «διαφάνειας», ώστε να εμφανίζονται τα τμήματα της επιφάνειας που βρίσκονται πίσω από κάποια άλλα σε επιφάνειες που έχουν δημιουργηθεί με mesh ή surf. Το ποσοστό μπορεί να είναι από 0 έως 1 (όσο μικρότερο τόσο μεγαλύτερη η διαφάνεια).

118 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Επιφάνεια σε 3 διαστάσεις από δεδομένα συντεταγμένων (x,y,z): Τριγωνοποίηση Αν οι συντεταγμένες των προς απεικόνιση σημείων μιας επιφάνειας βρίσκονται σε μορφή πίνακα (π.χ. πίνακας N 3, για N σημεία με τις συντεταγμένες x,y,z, σε 3 στήλες), τότε μπορεί να γίνει απεικόνιση είτε (α) μόνο των σημείων, είτε (β) μιας επιφάνειας που μπορεί να δημιουργηθεί από τα σημεία αυτά. α) Απεικόνιση των σημείων: Τα σημεία μπορούν να απεικονιστούν με απλό τρόπο με τη συνάρτηση plot3 (βλ. και σελ. 121), π.χ.: plot3(x,y,z,'.'); όπου x,y,z μονοδιάστατοι πίνακες με τις συντεταγμένες των σημείων. Παράδειγμα Αποτέλεσμα % Φόρτωμα έτοιμων δεδομένων επιφάνειας του MATLAB (φορτώνονται οι συντεταγμένες τους x,y,z): load seamount 0-1000 -2000-3000 % Απεικόνιση των σημείων μέσω των συντεταγμένων τους με την plot3: plot3(x,y,z,'.'); -4000-5000 -47.8-48 -48.2-48.4-48.6 210.8 211 211.2 211.4 211.6 211.8 β) Απεικόνιση της επιφάνειας: Η επιφάνεια μπορεί να δημιουργηθεί με χρήση μεθόδων παρεμβολής (interpolation) ή τριγωνοποίησης (triangulation) και στη συνέχεια να απεικονιστεί. Οι μέθοδος τριγωνοποίησης Delaunay συνίσταται στην εύρεση των μικρότερων δυνατων τριγώνων με κορυφές τα σημεία της επιφάνειας (είναι αυτά στα οποία οι περιγεγραμμένοι κύκλοι τους δεν περιλαμβάνουν άλλα σημεία στο εσωτερικό τους): - Αρχικά δημιουργούνται οι δείκτες των συντεταγμένων των τριγώνων με τη συνάρτηση delaunay. - Στη συνέχεια, γίνεται η απεικόνιση της επιφάνειας με τη βοήθεια της συνάρτησης trisurf (η οποία επιπλέον χρωματίζει την επιφάνεια ανάλογα με τις τιμές της συντεταγμένης z, σύμφωνα με μια χρωματική κλίμακα). Παράδειγμα Αποτέλεσμα % Φόρτωμα έτοιμων δεδομένων επιφάνειας του MATLAB (φορτώνονται οι συντεταγμένες τους x,y,z): load seamount 0-1000 -2000 % Δημιουργία τριγώνων με τη μέθοδο Delaunay: tri = delaunay(x,y); % Απεικόνιση επιφάνειας trisurf(tri,x,y,z); -3000-4000 -5000-47.8-48 -48.2-48.4-48.6 210.8 211 211.2 211.4 211.6 211.8

Γραφικά 119 Καμπύλη σε 2 διαστάσεις της μορφής f(x,y)=0 Σε περίπτωση που δεν είναι δυνατή η αναλυτική λύση της f(x,y) = 0 ως προς y, δεν είναι δυνατή η απεικόνιση της γραφικής παράστασης x-y με τη συνάρτηση plot. Στην περίπτωση αυτή η απεικόνιση γίνεται με έμμεσο τρόπο με ένα κατάλληλο «τρυκ», χρησιμοποιώντας τη συνάρτηση contour που δίνει την τομή μιας επιφάνειας z = f(x,y) με ένα επίπεδο: contour contour(x,y,z,[z 0 z 0 ]) Γραφική παράσταση των σημείων (x,y) που επαληθεύουν την εξίσωση f(x,y) = z 0 (ή αλλιώς, των σημείων της τομής της επιφάνειας z = f(x,y) με ένα σε επίπεδο παράλληλο προς το επίπεδο x-y που τέμνει τον άξονα z σε ένα σημείο z 0 ). Αν επιλεγεί z 0 = 0, τότε προκύπτει η γραφική παράσταση της καμπύλης f(x,y) = 0. contour(x,y,z,[z 0 z 0 ],'προδιαγραφές_γραμμής') Προδιαγραφές γραμμής και σημείων: όπως στην plot. contour(x,y,z,[z 0 z 0 ],'property1',property_value1,...) Ιδιότητες γραμμής και σημείων: όπως στην plot. Παράδειγμα: Έστω ότι θέλουμε να απεικονίσουμε την εξίσωση sin(x) e -x 0.1 cos(y) = 0: [X,Y] = meshgrid([0:0.1:10], [0:0.1:10]); % Δημιουργία του «πλέγματος» (x,y) Z = sin(x).*exp(-x)-0.1*cos(y); %Υπολογισμός των τιμών Ζ για κάθε ζεύγος (x,y) figure(1); contour(x,y,z,[0 0],'b'); %Απεικόνιση της προβολής του Ζ στο Ζ 0 =0 figure(2); surfc(x,y,z); alpha(0.5); %Απεικόνιση και της επιφάνειας Z=f(X,Y), % με χρήση της συνάρτησης surfc, που % απεικονίζει και τομές της επιφάνειας % με το επίπεδο x-y Figure 1 Απεικόνιση της f(x,y) = 0: sin(x) e -x 0.1 cos(y) = 0 Figure 1 (μετά από κατάλληλη περιστροφή σε 3 διαστάσεις, για να φανεί το επίπεδο τομής με το γράφημα του Figure 2) Figure 2 Απεικόνιση της z = f(x,y): z = sin(x) e -x 0.1 cos(y) μαζί με μερικές προβολές της

120 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Επιφάνεια σε 3 διαστάσεις της μορφής f(x,y,z)=0 Σε περίπτωση που δεν είναι δυνατή η αναλυτική λύση της f(x,y,z) = 0 ως προς z, δεν είναι δυνατή η απεικόνιση της γραφικής παράστασης x-y-z με τις συναρτήσεις surf ή mesh. Στην περίπτωση αυτή η απεικόνιση γίνεται με ένα «τρυκ» παρόμοιο με αυτό της contour, χρησιμοποιώντας τη συνάρτηση isosurface, η οποία δίνει την τομή μιας 4-διάστατης ιδεατής «υπερεπιφάνειας» v = f(x,y,z) με το χώρο των 3 διαστάσεων: isosurface isosurface(x,y,z,v,v 0 ) Γραφική παράσταση των σημείων (x,y,z) που επαληθεύουν την εξίσωση f(x,y,z) = v 0. Αν επιλεγεί v 0 = 0, τότε προκύπτει η γραφική παράσταση της επιφάνειας f(x,y,z) = 0. Η isosurface είναι η τρισδιάστατη «εκδοχή» της contour. Η εφαρμογή ιδιοτήτων όπως χρώμα επιφάνειας κλπ γίνεται με τη συνάρτηση patch ως εξής: p = patch(isosurface(x,y,z,v,v 0 )) set(p, 'property1', value2, 'property2', value2,...); Παράδειγμα: Έστω ότι θέλουμε να απεικονίσουμε την εξίσωση (x y z + x y ) e -z = 0: [X,Y,Z] = meshgrid([0:0.1:10], [0:0.1:10], [0:0.1:10]); V = (X - Y.*Z.^2 + X.^Y).*exp(-Z); p = patch(isosurface(x,y,z,v,0)); set(p,'facecolor','r','edgecolor','none'); % πρόσθεση χρώματος επιφάνειας camlight left; lighting phong; % πρόσθεση φωτισμού grid on; alpha(0.8); % πρόσθεση πλέγματος και διαφάνειας

Γραφικά 121 Καμπύλη σε 3 διαστάσεις της μορφής x=f(t), y=g(t), z=h(t) Στη συνέχεια επεξηγείται πώς μπορούμε να απεικονίσουμε γραφικά μια παραμετρική εξίσωση καμπύλης σε 3 διαστάσεις: plot3 plot3(x,y,z) Τρισδιάστατη γραφική παράσταση των τιμών των μονοδιάστατων πινάκων x, y, z. Χρησιμοποιείται συνήθως σε παραμετρικές εξισώσεις, όπου t η παράμετρος, δηλαδή: x = f(t), y = g(t), z = h(t) plot3(x,y,z,'προδιαγραφές_γραμμής') Προδιαγραφές γραμμής και σημείων: όπως στην plot. plot3(x,y,z,'property1',property_value1,'property2',property_value2,...) Ιδιότητες γραμμής και σημείων: όπως στην plot. Παράδειγμα t = [0:0.1:80*pi]; x = exp(-t/10).*sin(2*t); y = exp(-t/10).*cos(2*t); z = exp(-t/10); plot3(x,y,z); grid on

122 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 14.2 Συναρτήσεις παραμετροποίησης γραφημάτων Ακολουθούν βασικές συναρτήσεις μορφοποίησης και παραμετροποίησης των γραφημάτων του MATLAB, που εφαρμόζονται σε figures είτε με γραφικές παραστάσεις είτε με εικόνες: Γενικές συναρτήσεις γραφικών figure Δημιουργία ενός νέου παραθύρου γραφικών (figure). figure(n) Δημιουργία ενός νέου figure με αύξοντα αριθμό n (ή ενεργοποίησή του, αν υπάρχει ήδη). Αλλαγή των προεπιλεγμένων ιδιοτήτων ενός figure: h = figure(n); % figure window handle variable set(h,'position',[x y w h],... % x,y=position, w,h=width,height 'NumberTitle','off',... % Figure numbering: 'on'/'off' 'Name',string,... % Figure name (as a string variable) 'Menubar','none',... % Menu: 'none'/'figure' 'ToolBar','auto',... % Toolbar: 'none'/'auto'/'figure' 'Color',[r g b],... % Figure color (numbers between 0 and 1) 'Resize','on',... % Figure resize: 'on'/'off' 'Visible','on',... % Figure visibility: 'on'/'off' 'WindowStyle','normal'); % Window type: 'normal'/'modal'/'docked' close Κλείσιμο του τρέχοντος figure. close(n) Κλείσιμο του figure με αύξοντα αριθμό n. close all Κλείσιμο όλων των figures. clf Σβήσιμο του γραφήματος από το τρέχον figure (χωρίς κλείσιμο του figure). drawnow Άμεση απεικόνιση ενός γραφήματος σε ένα figure: Για να μην υπάρχουν καθυστερήσεις λόγω απεικόνισης γραφικών, το MATLAB δίνει προτεραιότητα στην εκτέλεση των άλλων εντολών, αναβάλλοντας την απεικόνιση. Έτσι, αν πρέπει να προκληθεί άμεσα απεικόνιση, χρησιμοποιείται η drawnow (με επιβάρυνση στο χρόνο εκτέλεσης του προγράμματος). hold hold on Απεικόνιση νέου γραφήματος στο ίδιο figure, χωρίς σβήσιμο του προηγούμενου γραφήματος (εφαρμόζεται σε κάθε figure χωριστά). hold off Απεικόνιση νέου γραφήματος στο ίδιο figure, με σβήσιμο του προηγούμενου γραφήματος. scrsize = get(0,'screensize');% Screen size [1 1 width height] figsize = get(1,'position'); % Figure size [xpos ypos width height] Λήψη της θέσης και των διαστάσεων της οθόνης (0) ή του figure(1) σε pixels. Π.χ.: scr = get(0,'screensize'); fig = get(1,'position'); h = figure(gcf); set(h,'position',scr); % get fig. handle & set full screen set(gcf,'position',[1 scr(4)/2 scr(3)/2 scr(4)/2]); % set quarter screen % Centered window and resized with ratio "r": r = 0.5; set(gcf,'position',[scr(3)*(1-r)/2 scr(4)*(1-r)/2 scr(3)*r scr(4)*r]); % Centered window and resized to the image matrix I dimensions:ι = imread(filename); set(gcf,'position',[(scr(3)-size(i,2))/2 (scr(4)-size(i,1))/2 size(i,2) size(i,1)]); set(h,'windowstyle','docked'); % Dock the figure window

Γραφικά 123 Άξονες axis Ακολουθούν βασικές συναρτήσεις χειρισμού αξόνων: axis on/off Ενεργοποίηση ή Απενεργοποίηση των αξόνων. axis ij/xy Αρχή των αξόνων: ij = πάνω αριστερά (π.χ. για εικόνες), xy = κάτω αριστερά (π.χ. για γραφικές παραστάσεις). axis equal/square/image axis equal = Ίσες μονάδες αξόνων, axis square = Ίσα μήκη αξόνων, axis image = Ίσα μήκη αξόνων με εφαρμοστό στα δεδομένα περίγραμμα. axis([xmin xmax ymin max]) ή axis([xmin xmax ymin ymax zmin zmax]) Χειροκίνητα όρια αξόνων v = axis Αποθήκευση των ορίων των αξόνων στο διάνυσμα v, το οποίο μπορεί να χρησιμοποιηθεί στη συνέχεια για χειροκίνητα όρια αξόνων ως axis([v(1) v(2) v(3) v(4)]) ή ως axis([v(1) v(2) v(3) v(4) v(5) v(6)]). axis manual/auto manual = «Πάγωμα» των ορίων των αξόνων, ώστε σε επόμενη απεικόνιση στο ίδιο figure με hold on να μείνουν τα όρια σταθερά, auto = Επαναφορά στην αυτόματη ρύθμιση. grid grid on/off Ενεργοποίηση / Απενεργοποίηση του πλέγματος. Αλλαγή ενδεικτικών σημείων στους άξονες και των ετικετών τους: set(gca,'xtick',τιμές) ή set(gca,'υtick',τιμές) Αλλαγή των ενδεικτικών σημείων τιμών στους άξονες: Οι τιμές είναι πίνακες που περιέχουν τις τιμές του αντίστοιχου άξονα στις οποίες θα υπάρχουν ενδεικτικά σημεία. set(gca,'xticklabel',{ετικέτες},'yticklabel',{ετικέτες}) Αλλαγή των ετικετών των ενδεικτικών σημείων τιμών στους άξονες: Οι {ετικέτες} είναι cell arrays που περιέχουν τις ετικέτες των ενδεικτικών σημείων τιμές του αντίστοιχου άξονα. x = [0:0.1:3*pi]; y = sin(x); plot(x,y); grid on set(gca,'xtick',[0 pi/2 pi 3*pi/2 2*pi]) set(gca,'xticklabel',{'0', 'pi/2', 'pi', '3pi/2', '2pi'})

124 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Επισημείωση γραφημάτων Ακολουθούν οι βασικότερες συναρτήσεις με τις οποίες μπορούμε να προσθέσουμε κείμενο σε διάφορες περιοχές ενός γραφήματος: title title('κείμενο') Τίτλος του γραφήματος. xlabel / ylabel / zlabel xlabel('κείμενο') ή ylabel('κείμενο') ή zlabel('κείμενο') Ετικέτες αξόνων. leg leg('string1', 'string2', 'string3',...) Υπόμνημα γραφήματος: Το πλήθος των συμβολοσειρών ('string1/2/3/...') πρέπει να ταυτίζεται με το πλήθος των γραφημάτων που έχουν γίνει στο ίδιο figure (με hold on). text text(x,y,'κείμενο') ή text(x,y,z,'κείμενο') Απεικόνιση 'κειμένου' στις συντεταγμένες x,y (ή και z) του γραφήματος. text(x,y,'κείμενο') ή text(x,y,z,'κείμενο','ιδιότητες',τιμές, ) Απεικόνιση 'κειμένου' με συγκεκριμένες ιδιότητες: 'FontSize', 'FontName', 'FontWeight'('normal','bold'), 'BaxkgroundColor', 'EdgeColor', 'EraseMode'('normal','none','xor','background'), Γλώσσα TeX Η TeX είναι μια γλώσσα περιγραφής για απεικόνιση μαθηματικών συμβόλων και ελληνικών χαρακτήρων. Η TeX είναι εξ αρχής ενεργοποιημένη στο MATLAB σε όλες τις συναρτήσεις κειμένου γραφημάτων. Αυτό δημιουργεί πρόβλημα κατά τις συνήθεις χρήσεις των κειμένων στα γραφήματα, καθώς για παράδειγμα όποιος χαρακτήρας είναι μετά το χαρακτήρα underscore ( _ ) εμφανίζεται ως δείκτης (για παράδειγμα, ο τίτλος My_Data θα εμφανιστεί ως My D ata). Ενεργοποίηση TeX: Επιλογή 'Interpreter','tex' ή: Καμία σχετική επιλογή (γιατί η επιλογή TeX είναι ενεργοποιημένη εξ αρχής αν δεν την απενεργοποιήσουμε). Απενεργοποίηση TeX: Επιλογή 'Interpreter','none'. Βασικές λειτουργίες και σύμβολα TeX με τους χαρακτήρες ενεργοποίησης: _: Δείκτης ο επόμενος χαρακτήρας (περισσότεροι: πρέπει να περικλείονται σε {}). ^: Εκθέτης ο επόμενος χαρακτήρας (περισσότεροι: πρέπει να περικλείονται σε {}). \pi: π, \circ:, \infty:, \pm:, \neq:, \geq:, \leq:, \int:, \surd:, \forall:, \exist:, \in: \leftarrow, \rightarrow, \uparrow, \downarrow:,,, Ειδικοί χαρακτήρες: Πρέπει να προηγείται «\»: \\, \{, \}, \_, \^ για τους: \, {, },_,^. Παράδειγμα 1: Οι διαδοχικές εντολές: title('my_data','interpreter','none'); xlabel('x_1'); ylabel('y_1^{0.5}') 0.5 δημιουργούν τον τίτλο My_data στο γράφημα και τις ετικέτες x 1 και y 1 στους άξονες. Παράδειγμα 2: H εντολή: text(pi,1,'\leftarrowy=sin(\theta)=cos(\pi/2-\omegat)','edgecolor','k') δημιουργεί τη σημείωση sin(θ )=cos(π /2-ω t) στη θέση (π,1) σε μαύρο πλαίσιο.

Γραφικά 125 Εμφάνιση πολλών γραφημάτων σε ένα figure Η εμφάνιση πολλών γραφημάτων στο ίδιο figure γίνεται με τη συνάρτηση subplot: subplot subplot(<γραμμές>, <στήλες>, <αύξων_αριθμός_γραφήματος>) Το figure χωρίζεται σε γραμμές στήλες «κελιών», όπου στην κάθε περιοχή μπορεί να εμφανιστεί και διαφορετικό γράφημα (γραφική παράσταση ή εικόνα). Ο αύξων αριθμός οδηγεί σε συμπλήρωση των κελιών κατά γραμμές, δηλαδή συμπληρώνεται πρώτα η 1η γραμμή, μετά η 2η κλπ. Μετά τη subplot, ακολουθεί απεικόνιση είτε γραφήματος (plot) είτε εικόνας (imshow). Παράδειγμα x = [0:0.001:4*pi]; y1 = 5*sin(x+pi/6); y2 = 7*sin(x); y = y1 + y2; subplot(3,1,1); plot(x,y1,'b'); axis([0 4*pi -12 12]); ylabel('y_1(cm)'); grid on; title('y = y_1 + y_2'); subplot(3,1,2); plot(x,y2,'k'); axis([0 4*pi -12 12]); ylabel('y_2(cm)'); grid on; subplot(3,1,3); plot(x,y,'r'); text(9,5,'\leftarrowy=y_1+y_2') axis([0 4*pi -12 12]); xlabel('t(sec)'); grid on; ylabel('y(cm)','rotation',0); %Χωρίς 'Rotation' εμφανίζεται παράλληλα στον άξονα Αποτέλεσμα

126 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Συγχρονισμός ορίων αξόνων Στο προηγούμενο παράδειγμα της συνάρτησης subplot, προκειμένου όλοι οι άξονες να έχουν κοινά όρια στον άξονα y, χρησιμοποιήθηκε η εντολή axis. Ένας περισσότερο αυτόματος τρόπος να συγχρονιστούν οι άξονες πολλών γραφημάτων σε ένα subplot (ή γραφημάτων σε πολλά figures) είναι η χρήση της συνάρτησης linkaxes: linkaxes linkaxes(axes_handles_array, 'x'/'y'/'xy'/'off') axes_handles_array: Πίνακας με τα handles των αξόνων (βλ. παράδειγμα) 'x'/'y'/'xy'/'off': Επιλογή άξονα (ή απενεργοποίηση) συγχρονισμού Ο συγχρονισμός γίνεται ως προς τους άξονες του πρώτου handle του πίνακα, αλλά για αυτόματη ρύθμιση πρέπει οι ιδιότητες 'xlimmode' ή/και 'ylimmode' να τεθούν 'auto': Παράδειγμα x = [0:0.001:4*pi]; y1 = 5*sin(x+pi/6); y2 = 7*sin(x); y = y1 + y2; a(1) = subplot(3,1,1); plot(x,y1,'b'); ylabel('y_1(cm)'); grid on; title('y = y_1 + y_2'); a(2) = subplot(3,1,2); plot(x,y2,'k'); ylabel('y_2(cm)'); grid on; a(3) = subplot(3,1,3); plot(x,y,'r'); text(9,5,'\leftarrowy=y_1+y_2') xlabel('t(sec)'); grid on; ylabel('y(cm)','rotation',0); %Χωρίς 'Rotation' εμφανίζεται παράλληλα στον άξονα linkaxes(a,'y'); set(a,'ylimmode','auto'); Αποτέλεσμα

Γραφικά 127 Ανανέωση δεδομένων γραφήματος Με κατάλληλη δήλωση των δεδομένων ενός γραφήματος, το γράφημα μπορεί να ανανεωθεί με τα νέα δεδομένα, όταν αυτά αλλάξουν. refreshdata Ανανέωση γραφήματος με νέα δεδομένα. linkdata on/off Αυτόματη ανανέωση γραφήματος με νέα δεδομένα (χωρίς συνεχή ανάγκη refreshdata). Η refreshdata καλείται μετά την αλλαγή των δεδομένων, και προκαλεί ανανέωση του γραφήματος κάθε φορά που καλείται (και μόνο τότε). Αντίθετα, η linkdata πρέπει να τεθεί σε κατάσταση on πριν την αλλαγή των δεδομένων και, κάθε φορά που αυτά αλλάζουν, το γράφημα ανανεώνεται αυτόματα. Σε κάθε περίπτωση (refreshdata ή linkdata), τα δεδομένα πρέπει να διασυνδεθούν με το συγκεκριμένο γράφημα στο οποίο πρόκειται να ανανεώνονται, χρησιμοποιώντας τις ιδιότητες XdataSource, YdataSource (ή και ZdataSource), όπως στο παράδειγμα: Παράδειγμα: refreshdata x = 0:0.01:2*pi; y = sin(x); % Δεδομένα x και y h = plot(x,y); % Plot και ανάθεση του handler της plot στη μεταβλητή h set(h,'xdatasource','x') % Διασύνδεση της XDataSource με τον πίνακα x set(h,'ydatasource','y') % Διασύνδεση της YDataSource με τον πίνακα y pause(2) % Καθυστέρηση 2sec για να φανεί η διαφορά στο αποτέλεσμα y = sin(x.^3); % Υπολογισμός νέων δεδομένων refreshdata % Ανανέωση δεδομένων στο γράφημα Παράδειγμα: linkdata x = 0:0.01:2*pi; y = sin(x); % Δεδομένα x και y h = plot(x,y); % Plot και ανάθεση του handler της plot στη μεταβλητή h pause(2) % Καθυστέρηση 2sec για να φανεί η διαφορά στο αποτέλεσμα linkdata on % Η αυτόματη διασύνδεση δεδομένων τίθεται on set(h,'xdatasource','x') % Σύνδεση της XDataSource με τον πίνακα x set(h,'ydatasource','y') % Σύνδεση της XDataSource με τον πίνακα x y = sin(x.^3); % Υπολογισμός νέων δεδομένων Αποτέλεσμα (ίδιο και στις 2 περιπτώσεις) 2sec αργότερα

128 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 14.3 Εικόνες Ψηφιακές εικόνες Οι ψηφιακές εικόνες αποτελούνται από στοιχειώδη τμήματα που λέγονται εικονοστοιχεία (picture elements, pixels). Τα εικονοστοιχεία διατάσσονται σε στήλες και γραμμές, που το πλήθος τους αποτελεί το πλάτος και το ύψος της εικόνας αντίστοιχα (σε μονάδες pixels). Εικόνες τόνων του γκρι Στην περίπτωση των εικόνων με τόνους του γκρι, κάθε εικονοστοιχείο χαρακτηρίζεται από έναν θετικό ακέραιο αριθμό, που αποτελεί την τιμή της έντασης ή της φωτεινότητας του συγκεκριμένου εικονοστοιχείου. Οι τόνοι του γκρι ποικίλουν από 0, που αντιστοιχεί στο μαύρο, έως μια μέγιστη τιμή, που αντιστοιχεί στο άσπρο. Το εύρος των τιμών ανάμεσα στο 0 και στη μέγιστη τιμή αποτελεί το πλήθος των τόνων του γκρι που είναι δυνατόν να έχει η εικόνα. Το πλήθος των τόνων του γκρι εκφράζεται συνήθως ως δυνάμεις του 2, και τότε ο εκθέτης ονομάζεται βάθος χρώματος της εικόνας. Παραδείγματα: - Πλήθος τόνων του γκρι = 2 = 2 1. Βάθος χρώματος = 1, ή αλλιώς εικόνα 1-bit. Το μαύρο αντιστοιχεί στο 0 και το άσπρο στο 1. Οι εικόνες αυτές έχουν μόνο μαύρο και άσπρο, είναι δηλαδή οι καθαρά μαυρόασπρες εικόνες. - Πλήθος τόνων του γκρι = 16 = 2 4. Βάθος χρώματος = 4, ή αλλιώς εικόνα 4-bit. Το μαύρο αντιστοιχεί στο 0 και το άσπρο στο 15. - Πλήθος τόνων του γκρι = 256 = 2 8. Βάθος χρώματος = 8, ή αλλιώς εικόνα 8-bit. Το μαύρο αντιστοιχεί στο 0 και το άσπρο στο 255. Αυτές είναι οι συνήθεις εικόνες τόνων του γκρι. Ο χώρος μιας εικόνας στη μνήμη του Η/Υ ισούται με το πλήθος των εικονοστοιχείων της επί το πλήθος των bits σε κάθε εικονοστοιχείο, δηλαδή: Πλάτος Ύψος Βάθος χρώματος. Π.χ. μια εικόνα με πλάτος 640 pixel, ύψος 480 pixel και 256 (=2 8 ) δυνατούς τόνους του γκρι, καταλαμβάνει 640 480 8 bits = 2457600 bits = 2457600 / 8 bytes = 307200 bytes = 307200 / 1024 kb = 300 kb χώρο στη μνήμη του υπολογιστή. Έγχρωμες εικόνες Στην περίπτωση των έγχρωμων εικόνων, το χρώμα κάθε εικονοστοιχείου σχηματίζεται από συνδυασμό διαφόρων εντάσεων των τριών βασικών χρωμάτων, δηλαδή του κόκκινου (red, R), του πράσινου (green, G) και του μπλε (blue, B), και γι αυτό οι εικόνες αυτές χαρακτηρίζονται ως εικόνες RGB. Κάθε ένα από τα τρία χρώματα χαρακτηρίζεται από την έντασή του (τον τόνο του, αντίστοιχο του τόνου του γκρι), που είναι ένας ακέραιος αριθμός από 0 έως μια μέγιστη τιμή. Τότε, το πλήθος των δυνατών χρωμάτων της εικόνας ισούται με τον εκθέτη του 2 που αντιστοιχεί στο πλήθος των τόνων κάθε χρώματος, υψωμένο εις την 3 η δύναμη, διότι τόσοι είναι οι δυνατοί συνδυασμοί τριάδων. Για παράδειγμα, κάθε εικονοστοιχείο μιας έγχρωμης RBG εικόνας με 256 διαβαθμίσεις έντασης σε κάθε χρώμα μπορεί να έχει (2 8 ) 3 = 2 24 = 16.777.216 δυνατά χρώματα, επομένως το βάθος χρώματος της εικόνας είναι τότε ίσο με 24 (εικόνα 24-bit). Ψηφιακές εικόνες και πίνακες Οι τιμές των εικονοστοιχείων της εικόνας μπορούν να αποθηκευτούν στα στοιχεία ενός πίνακα, του οποίου το πλήθος των γραμμών είναι ίσο με το ύψος της εικόνας σε pixels ενώ το πλήθος των στηλών με το πλάτος της εικόνας, πάλι σε pixels. Στην περίπτωση των εικόνων τόνων του γκρι ο πίνακας είναι δύο διαστάσεων, ενώ στην περίπτωση των έγχρωμων εικόνων ο πίνακας είναι τριών διαστάσεων, με την τρίτη διάσταση να αποτελεί τη διάσταση όπου α- ποθηκεύονται οι τόνοι κάθε ενός από τα τρία χρώματα. Στο MATLAB οι εικόνες μπορούν να αποθηκευτούν σε πίνακες, οπότε η διαχείρισή τους είναι πολύ εύκολη (επιπλέον λόγω και των ιδιαίτερων συναρτήσεων, που ακολουθούν):

Γραφικά 129 Συναρτήσεις χειρισμού ψηφιακών εικόνων Ακολουθούν χρήσιμες συναρτήσεις χειρισμού ψηφιακών εικόνων του MATLAB: imread <πίνακας> = imread('αρχείο_εικόνας') Διάβασμα του αρχείου_εικόνας και αποθήκευση των εικονοστοιχείων της στον πίνακα. Το είδος του αρχείου εικόνας (.bmp,.jpg,.gif,.tiff, ) αναγνωρίζεται από την ε- πέκταση του αρχείου. Προσοχή: Τα στοιχεία του πίνακα επιστρέφονται ως uint8, δηλαδή είναι ακέραιοι 8-bit (ταιριάζουν ακριβώς στους 256 τόνους του γκρι των εικόνων). <πίνακας> = imread('αρχείο_εικόνας', 'είδος') Μη αυτόματος καθορισμός είδους του αρχείου εικόνας. Το 'είδος' περιλαμβάνει πολλά είδη αρχείων εικόνας, και οι τιμές του μπορεί να είναι 'bmp', 'jpg', 'gif', 'tiff', κλπ. imshow imshow(<πίνακας>) Εμφάνιση της εικόνας της οποίας οι τιμές των εικονοστοιχείων βρίσκονται αποθηκευμένες στον πίνακα. Ο πίνακας πρέπει να είναι τύπου uint8, δηλαδή ακεραίων 8-bit (μετατροπή σε unit8: <πίνακας> = uint8(<πίνακας>), βλ. 4.2). imwrite imwrite(<πίνακας>, 'αρχείο_εικόνας') Εγγραφή στο δίσκο ενός πίνακα ως αρχείο εικόνας: Το είδος του αρχείου εικόνας (.bmp,.jpg,.gif,.tiff) καθορίζεται αυτόματα από την επέκταση του αρχείου. Ο πίνακας πρέπει να είναι τύπου uint8 (μετατροπή σε unit8: πίνακας = uint8(πίνακας)). imwrite(πίνακας, 'αρχείο_εικόνας', 'είδος') Μη αυτόματος καθορισμός είδους αρχείου εικόνας: Το 'είδος' περιλαμβάνει πολλά είδη αρχείων εικόνας, και οι τιμές του μπορεί να είναι 'bmp', 'jpg', 'gif', 'tiff', κλπ. Παράδειγμα Αποτέλεσμα % Αποθήκευση εικονοστοιχείων εικόνας σε πίνακα Im = imread('chest.bmp'); % Εμφάνιση εικόνας imshow(im); % Αντιστροφή χρωμάτων της εικόνας % (δημιουργία αρνητικού) και αποθήκευση % σε 2ο πίνακα for j=1:size(im,2) for i=1:size(im,1) Im2(i,j) = 255 - Im(i,j); % Ισοδύναμος τρόπος για την παραπάνω % επεξεργασία (πράξεις απ ευθείας σε όλα τα % στοιχεία ενός πίνακα, βλ. παράγραφο 9.1) Im2 = 255 - Im; % Εμφάνιση επεξεργασμένης εικόνας Im2 = uint8(im2); % μετατροπή σε unit8 figure, imshow(im); % Αποθήκευση της επεξεργασμένης εικόνας imwrite(im2,'chest_inv.bmp');

130 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB colormap colormap gray Εμφάνιση μιας εικόνας σε συγκεκριμένο «χάρτη χρωμάτων» (colormap). Αρκετές φορές χρησιμοποιείται με την παράμετρο gray, για απεικόνισης μιας έγχρωμης εικόνας σε εικόνα τόνων του γκρι. rgb2gray <πίνακας2> = rgb2gray(<πίνακας1>) Μετατροπή μιας έγχρωμης εικόνας σε εικόνα τόνων του γκρι. Η έγχρωμη εικόνα είναι α- ποθηκευμένη στον πίνακα1 (που είναι τρισδιάστατος, όπου η τρίτη διάσταση αντιστοιχεί στις τιμές των εντάσεων των χρωμάτων RGB) και η εικόνα τόνων του γκρι αποθηκεύεται στο δισδιάστατο πίνακα2. Η μετατροπή γίνεται βρίσκοντας την τιμή του τόνου του γκρι κάθε εικονοστοιχείου του πίνακα2 ως συνδυασμό των τιμών των τριών χρωμάτων των αντίστοιχων εικονοστοιχείων του πίνακα1, χρησιμοποιώντας τους συντελεστές 0.29894 για το κόκκινο, 0.58704 για το πράσινο και 0.11402 για το μπλε, δηλαδή: graytone = 0.29894 R + 0.58704 G + 0.11402 B Οι συγκεκριμένοι συντελεστές είναι αυτοί του συστήματος NTSC, και έχουν σχέση με την σχετική ευαισθησία του ανθρώπινου ματιού σε κάθε ένα από τα τρία βασικά χρώματα. Για ισοδύναμη βαρύτητα κάθε χρώματος (uniform gray) πρέπει να χρησιμοποιηθεί η σχέση: graytone = 1 3 R + 1 3 G + 1 3 B Το άθροισμα των τριών συντελεστών πρέπει πάντοτε να ισούται με τη μονάδα. Παράδειγμα Im = imread('spine.bmp'); % Διάβασμα εικόνας Im1 = rgb2gray(im); % Μετατροπή σε γκρι με την rgb2gray % Μετατροπή σε γκρι στοιχείο προς στοιχείο με διάφορους συντελεστές for j=1:size(im,2), for i=1:size(im,1) Im2(i,j)= 0.29894*Im(i,j,1)+0.58704*Im(i,j,2)+0.11402*Im(i,j,3); % NTSC standard Im3(i,j)= (1/3)*Im(i,j,1) + (1/3)*Im(i,j,2) + (1/3)*Im(i,j,3); % Ομοιόμορφο γκρι Im4(i,j)= 0.7*Im(i,j,1) + 0.1*Im(i,j,2) + 0.2*Im(i,j,3); % Αυθαίρετοι συντελεστές, subplot(2,3,1); imshow(im); title('colored image'); subplot(2,3,2); imshow(im1); title('gray with rgb2gray'); subplot(2,3,3); imshow(im2); title('ntsc gray with (R,G,B)\cong(0.30,0.59,0.11)'); subplot(2,3,5); imshow(im3); title('uniform gray with (R,G,B)=(1/3,1/3,1/3)'); subplot(2,3,6); imshow(im4); title('arbitrary gray with (R,G,B)=(0.7,0.1,0.2)'); Αποτέλεσμα

Γραφικά 131 14.4 Λήψη συντεταγμένων σημείων γραφήματος Στη συνέχεια περιγράφεται μια πολύ χρήσιμη συνάρτηση που επιτρέπει τη λήψη των συντεταγμένων οποιονδήποτε σημείων ενός γραφήματος με τη βοήθεια του ποντικιού: ginput [X,Y] = ginput Λήψη των συντεταγμένων σημείων του τρέχοντος γραφήματος με τη βοήθεια του ποντικιού. Οι συντεταγμένες κάθε σημείου λαμβάνονται πατώντας ένα (οποιοδήποτε) κουμπί του ποντικιού και αποθηκεύονται στους μονοδιάστατους πίνακες X και Y. Η λήψη των συντεταγμένων συνεχίζεται μέχρι να πατηθεί το Enter. [X,Y] = ginput(n) Λήψη συντεταγμένων για N το πλήθος σημεία (εκτός αν νωρίτερα πατηθεί Enter). [X,Y,b] = ginput(n) Εκτός από τις συντεταγμένες καταγράφεται και ποιό κουμπί του ποντικιού πατήθηκε (1=αριστερό κουμπί, 2=μεσαίο κουμπί (π.χ. τροχός), 3=δεξί κουμπί). Παράδειγμα Αποτέλεσμα στο figure: Im = imread('head.bmp'); imshow(im); hold on % Παράδειγμα 1: Μέτρηση απόστασης title('measure: Click 2 points'); [x,y] = ginput(2); d=((x(2)-x(1))^2 + (y(2)-y(1))^2)^0.5; plot(x,y,'r+:'); disp(['distance: ',num2str(d,'%.1f')]); % Παράδειγμα 2: Αριστερό και δεξί κλικ title('left/right click. Enter to finish'); [x,y,b] = ginput; plot(x(find(b==1)),y(find(b==1)),'rd'); plot(x(find(b~=1)),y(find(b~=1)),'bo'); disp([x y b]); Αποτέλεσμα στο Command Window: Distance: 112.3 45.552 95.346 1 65.575 70.127 1 85.598 48.197 1 108.35 35.039 1 72.856 142.5 3 108.35 117.28 3

132 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 14.5 Συνοπτική παρουσίαση συναρτήσεων γραφικών του MATLAB: graphics, graph2d, graph3d, specgraph Λίστα με τις γενικές συναρτήσεις γραφικών εμφανίζεται στο Command Window με την εντολή help graphics (ή doc graphics, στο παράθυρο της Βοήθειας). Λίστα συναρτήσεων για γραφικές παραστάσεις 2 και 3 διαστάσεων εμφανίζεται στο Command Window με τις εντολές help graph2d και help graph3d (ή doc graph2d και doc graph3d, στο παράθυρο της Βοήθειας). Λίστα εξειδικευμένων συναρτήσεων γραφικών και εικόνων του MATLAB εμφανίζεται στο Command Window με την εντολή help specgraph (ή doc specgraph, στο παράθυρο της Βοήθειας).

15 Χρήσιμες συναρτήσεις του MATLAB Στην ενότητα αυτή περιγράφονται χρήσιμες συναρτήσεις του MATLAB ανά κατηγορία. 15.1 Εντολές βοήθειας Αναλυτική βοήθεια για μια εντολή ή συνάρτηση του MATLAB μπορεί να αναζητηθεί με τις εντολές help ή doc, όταν αυτές δοθούν στο Command Window (π.χ. >> help plot ή >> doc plot): help <συνάρτηση/εντολή>: Παρουσίαση κειμένου βοήθειας στο Command Window. doc <συνάρτηση/εντολή>: Παρουσίαση στο παράθυρο Βοήθειας του MATLAB. Μερικές εντολές παρουσίασης συνοπτικών λιστών βοήθειας είναι οι εξής: help general (doc general): Εντολές γενικής χρήσης. help? (doc?) ή help ops (doc ops): Τελεστές και ειδικοί χαρακτήρες. help elmat (doc elmat): Στοιχειώδεις πίνακες και χειρισμός πινάκων. help elfun (doc elfun): Στοιχειώδεις μαθηματικές συναρτήσεις. help matfun (doc matfun): Συναρτήσεις πινάκων / γραμμικής άλγεβρας. help graphics (doc graphics): Γενικές εντολές γραφικών. help graph2d (doc graph2d): Εντολές γραφικών παραστάσεων 2 διαστάσεων. help graph3d (doc graph3d): Εντολές γραφικών παραστάσεων 3 διαστάσεων. help specgraph (doc specgraph): Εξειδικευμένες εντολές γραφικών και εικόνων. help strfun (doc strfun): Συναρτήσεις συμβολοσειρών. help lang (doc lang): Εντολές προγραμματισμού και αποσφαλμάτωσης. 15.2 Αρχεία εντολών εκκίνησης και τερματισμού του MATLAB startup.m : Αρχείο με εντολές που εκτελούνται κατά την εκκίνηση του MATLAB, αν υπάρχει σε ένα φάκελο του Path (δηλ. των γνωστών στο MATLAB διαδρομών). Π.χ. ένα αρχείο startup.m θα μπορούσε να περιέχει τις εξής εντολές, για να καθαρίζει το Command Window και το workspace και να κλείνουν τυχόν ανοικτά παράθυρα γραφικών: startup.m clc; clear all; close hidden all; finish.m : Αρχείο με εντολές που εκτελούνται κατά τον τερματισμό του MATLAB, αν υπάρχει σε φάκελο του Path (δηλ. των γνωστών στο MATLAB διαδρομών). Π.χ. ένα αρχείο finish.m θα μπορούσε να περιέχει την εντολή save, ώστε κατά την έξοδο να αποθηκεύεται το Workspace σε ένα αρχείο τύπου.mat: finish.m save 15.3 Συναρτήσεις διακοπής και επαναφοράς της ροής του προγράμματος pause Προσωρινή διακοπή του προγράμματος μέχρι να πιεστεί ένα πλήκτρο. pause(n) Προσωρινή διακοπή του προγράμματος για n δευτερόλεπτα. keyboard Είσοδος σε κατάσταση αποσφαλμάτωσης (debug mode, προσωρινή διακοπή του προγράμματος με έλεγχο πληκτρολογίου στο χρήστη). dbstop Είσοδος σε κατάσταση αποσφαλμάτωσης σε σφάλμα ή κλήση συνάρτησης dbquit Έξοδος από την κατάσταση αποσφαλμάτωσης και διακοπή της εκτέλεσης του προγράμματος. return: α) Έξοδος από την κατάσταση αποσφαλμάτωσης με συνέχιση της εκτέλεσης του προγράμματος. β) Έξοδος από συνάρτηση ή m-file πριν από το τέλος της/του. quit ή exit Έξοδος από το MATLAB.

134 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 15.4 Μαθηματικές συναρτήσεις Οι παρακάτω μαθηματικές συναρτήσεις του MATLAB εφαρμόζονται τόσο σε αριθμούς όσο και σε πίνακες (στους οποίους εφαρμόζονται στοιχείο προς στοιχείο). abs(x) Απόλυτη τιμή πραγματικού αριθμού x abs(z) Μέτρο μιγαδικού αριθμού z angle(z) φάση (όρισμα) μιγαδικού αριθμού z rem(a,b) Υπόλοιπο της ακέραιης διαίρεσης a/b (παρόμοια εντολή: mod) sign(x) Πρόσημο του x rats(x) Μετατροπή δεκαδικού σε κλάσμα (rat: σε μικτό κλάσμα) lcm(a,b) Ελάχιστο κοινό πολλαπλάσιο των a και b. gcd(a,b) Μέγιστος κοινός διαιρέτης των a και b. factor(n) Εύρεση των πρώτων παραγόντων ενός ακεραίου n factorial(n) Υπολογισμός του παραγοντικού n! isprime(n) Έλεγχος του ακεραίου n για το αν είναι πρώτος primes(n) Παραγωγή των πρώτων αριθμών μέχρι τον ακέραιο n nchoosek(n,k) Μεταθέσεις των αριθμών του πίνακα n ανά k στοιχεία perms(a) Σύνολο δυνατών συνδυασμών των στοιχείων του πίνακα A Εκθετικές συναρτήσεις: exp(x) Εκθετική συνάρτηση (e x ) log(x) Φυσικός λογάριθμος (λογάριθμος του x με βάση το e) log10(x) Λογάριθμος του x με βάση το 10 log2(x) Λογάριθμος του x με βάση το 2 sqrt(x) Τετραγωνική ρίζα του x nrooth(x,n) n-οστή ρίζα του x Σημείωση: Για την εύρεση ριζών (ειδικά των αρνητικών αριθμών) είναι ορθότερη η χρησιμοποίηση των συναρτήσεων sqrt και nthroot σε σχέση με ύψωση σε δύναμη (^0.5, ^(1/3) κλπ), για παράδειγμα y=nthroot(-8,3) αντί y=(-8)^(1/3). Τριγωνομετρικές συναρτήσεις (και αντίστροφες): Ημίτονο, συνημίτονο, εφαπτομένη, συνεφαπτομένη: sin(x), cos(x), tan(x), cot(x) (όπου x σε ακτίνια) sind(x), cosd(x), tand(x), cotd(x) (όπου x σε μοίρες) Τόξο ημιτόνου, συνημιτόνου, εφαπτομένης, συνεφαπτομένης: asin(y), acos(y), atan(y), acot(y) (η γωνία επιστρέφεται σε ακτίνια) asind(y), acosd(y), atand(y), acotd(y) (η γωνία επιστρέφεται σε μοίρες) Σημείωση: Συνήθως χρησιμοποιούνται οι συναρτήσεις ακτινίων, αλλά ένα παράδειγμα όπου πρέπει να χρησιμοποιηθούν οι συναρτήσεις μοιρών είναι ότι η sin(pi) δίνει αποτέλεσμα πολύ κοντά στο 0, που εξαρτάται από το πλήθος των δεκαδικών ψηφίων του pi, ενώ η sind(180) δίνει αποτέλεσμα ακριβώς 0. Συναρτήσεις στρογγυλοποίησης σε ακεραίους: round(x) Στρογγυλοποίηση του x προς τον πλησιέστερο ακέραιο (το 0.5 στρογγυλοποιείται προς τον αμέσως μεγαλύτερο ακέραιο κατ απόλυτη τιμή) fix(x) Στρογγυλοποίηση του x προς το 0 (μπορεί να χρησιμοποιηθεί για την εύρεση του ακέραιου μέρους ενός αριθμού) floor(x) Στρογγυλοποίηση του x προς το ceil(x) Στρογγυλοποίηση του x προς το +

Χρήσιμες συναρτήσεις του MATLAB 135 Στατιστικές συναρτήσεις: min(a) max(a) sum(a) prod(a) mean(a) median(a) std(a) Ελάχιστη τιμή Μέγιστη τιμή Άθροισμα Γινόμενο Μέση τιμή Διάμεσος τιμή Τυπική απόκλιση Οι παραπάνω συναρτήσεις εφαρμόζονται στα στοιχεία ενός πίνακα (A) ως εξής: Αν ο πίνακας είναι μονοδιάστατος, τότε η συνάρτηση εφαρμόζεται σε όλα τα στοιχεία του (π.χ. sum([3 1 5]) = 9, min([3 1 5]) = 1). Αν ο πίνακας είναι δύο διαστάσεων, τότε η συνάρτηση εφαρμόζεται σε κάθε στήλη του πίνακα ξεχωριστά, και τα αποτελέσματα εξάγονται σε έναν πίνακα-γραμμή: Παραδείγματα A = [1 5 3 4 2 6] Αποτελέσματα A = 1 5 3 4 2 6 B = min(a) C = sum(a) B = C = 1 2 3 5 7 9 Για να εφαρμοστούν οι συναρτήσεις αυτές σε όλα τα στοιχεία ενός δισδιάστατου πίνακα, πρέπει αυτός να μετατραπεί σε πρώτα μονοδιάστατο (π.χ. με χρήση του τελεστή «:» που μετατρέπει έναν πίνακα σε πίνακα-στήλη, βλ. και 9.1γ). Π.χ.: D = sum(a(:)) D = 21 Συναρτήσεις παραγωγής τυχαίων αριθμών: rand(m,n): Παραγωγή τυχαίων αριθμών ομοιόμορφης κατανομής, σε πίνακα m n. Οι αριθμοί ανήκουν στο διάστημα [0,1] και είναι ψευδοτυχαίοι με περίοδο 2 32. rand('state',n): Τοποθέτηση της κατάστασης παραγωγής τυχαίων αριθμών στη θέση n, όπου n από 0 έως 2 32-1. Βλ. και 9.12. randn(m,n): Παραγωγή τυχαίων αριθμών κανονικής κατανομής, σε πίνακα m n. randi([a b],m,n):παραγωγή τυχαίων ακεραίων από a έως και b, ομοιόμορφης κατανομής, σε πίνακα m n. randperm(n): Παραγωγή τυχαίου συνδυασμού των ακεραίων από 1 έως n. Π.χ.: Παραγωγή n τυχαίων αριθμών από a έως b, ξεκινώντας από διαφορετική κατάσταση κάθε φορά, και με μετατροπή σε ακεραίους: % Αρχικοποίηση του rand από διαφορετική κατάσταση κάθε φορά: rand('state',sum(100*clock)); % Παραγωγή n τυχαίων αριθμών από a έως b n = 5; a = 10; b = 50; Χ = a + (b-a) * rand(n,1); % Μετατροπή των τιμών του πίνακα X σε ακέραιες τιμές N = round(x); % στο διάστημα [a,b] N = floor(x); % στο διάστημα [a,b) N = ceil(x); % στο διάστημα (a,b] N = ceil(x-0.5); % στο διάστημα (a,b)

136 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 15.5 Συναρτήσεις χρόνου Ακολουθεί περιγραφή συναρτήσεων διαχείρισης χρόνου και ημερομηνιών: tic - toc tic... toc ή μεταβλητή = toc Χρονομέτρηση διαδικασιών στο MATLAB. Η toc εμφανίζει (ή αποθηκεύει στη μεταβλητή) το χρόνο που πέρασε από την τελευταία tic, σε δευτερόλεπτα. clock πίνακας_ημερομηνίας = clock Επιστροφή της ημερομηνίας και ώρας του συστήματος σε πίνακα 6 θέσεων: <πίνακας_ημερομηνίας> = [έτος μήνας ημέρα ώρα λεπτά δευτερόλεπτα] Παράδειγμα c = clock Αποτέλεσμα c = 2006 5 31 21 47 7.109 datenum <αριθμός_ημερών> = datenum(<πίνακας_ημερομηνίας>) Μετατροπή της ημερομηνίας που βρίσκεται στον πίνακα_ημερομηνίας σε αριθμό που δείχνει το πλήθος των ημερών από την 1/1/0000. Το ακέραιο μέρος του αριθμού δείχνει την ημερομηνία, και το δεκαδικό μέρος δείχνει την ώρα. datevec <πίνακας_ημερομηνίας> = datenum(<αριθμός_ημερών>) Μετατροπή του αριθμoύ_ημερών σε πίνακα_ημερομηνίας (αντίστροφη της datenum). datestr <συμβολοσειρά_ημερομηνίας> = datestr(<πίνακας_ημερομηνίας>, 'μορφή') Μετατροπή του πίνακα_ημερομηνίας σε κατανοητή συμβολοσειρά_ημερομηνίας κάποιας 'μορφής', π.χ. 'dd/mm/yyyy' (ημέρα/μήνας/έτος). now <αριθμός_ημερών> = now Ο αριθμός_ημερών της τρέχουσας ημερομηνίας και ώρας. Το ακέραιο μέρος του α- ριθμού_ημερών δίνει την ημερομηνία (floor(now)) και το δεκαδικό μέρος δίνει την ώρα (rem(now,1)). Για γρήγορη εμφάνιση ημερομηνίας και ώρας: datestr(now) Οι δύο πρώτες συναρτήσεις μπορούν να χρησιμοποιηθούν σε συνδυασμό, για την εύρεση της ημερολογιακής διαφοράς δύο ημερομηνιών. Παράδειγμα c = clock; today = [c(1) c(2) c(3) 0 0 0]; birthday = [1984 1 16 0 0 0]; age_number = datenum(today) - datenum(birthday) age = datevec(age_number) birthday_string = datestr(birthday,'dd/mm/yyyy'); fprintf('birthday is at %s. John is %d years old',birthday_string,age(1)); Αποτέλεσμα age_number = 9635 age = 26 5 18 0 0 0 Birthday is at 16/01/1984. John is 22 years old

Χρήσιμες συναρτήσεις του MATLAB 137 15.6 Συναρτήσεις αρχείων Το MATLAB διαθέτει πολλές συναρτήσεις για εγγραφή δεδομένων σε αρχεία με διάφορους τρόπους, καθώς και για ανάγνωση αρχείων και εισαγωγή δεδομένων από αυτά. Ακολουθεί παράθεση των συναρτήσεων αυτών, με απλά παραδείγματα τρόπων σύνταξης. Για περισσότερα βλ. το σύστημα βοήθειας του MATLAB: help <εντολή> ή doc <εντολή>. Εγγραφή αρχείων Γενικές συναρτήσεις χαμηλού επιπέδου για εγγραφή αρχείων: fprintf: Εγγραφή κειμένου μαζί με μεταβλητές σε αρχείο κειμένου. Για γενική χρήση, με πολύ καλό έλεγχο της μορφής των δεδομένων που θα εγγραφούν. Απαιτείται ά- νοιγμα και κλείσιμο αρχείου (fopen, fclose). Βλ. και 5.6, 13.2, 13.3. Π.χ.: fid = fopen('filename.txt', 'wt'); for i=1:size(a,1) fprintf(fid, 'Weight: %d, Height: %g\n', A(i,1), A(i,2)); fclose(fid); Σημείωση: Για εγγραφή τιμών κινητής υποδιαστολής, αν δεν είναι γνωστό το πλήθος των σημαντικών ψηφίων που απαιτούνται, συνιστάται η μορφή %g ή %e. fwrite: Εγγραφή πίνακα σε δυαδικό αρχείο. Γενικής χρήσης. Απαιτείται άνοιγμα και κλείσιμο αρχείου (fopen, fclose). Π.χ.: fid = fopen('filename.bin', 'wb'); fwrite(fid, A, 'double'); % Εγγραφή πίνακα A (κατά στήλες, fclose(fid); % σε συνεχόμενες θέσεις των 8 bytes κάθε μια) Σημείωση: Ο πίνακας Α εγγράφεται στο αρχείο κατά στήλες, διότι με αυτόν τον τρόπο το MATLAB τον αποθηκεύει στη μνήμη (βλ. και 8.3). Συναρτήσεις εγγραφής αριθμητικών δεδομένων σε αρχεία κειμένου: save (1): Εγγραφή πινάκων σε αρχείο κειμένου. Ακρίβεια 8 ή 16 σημαντικών ψηφίων. Χρήσιμη για γρήγορη εγγραφή ενός ή περισσοτέρων πινάκων ταυτόχρονα. save('filename.txt', 'A', 'B',..., '-ascii'); dlmwrite: Εγγραφή πίνακα σε αρχείο κειμένου. Σε αντίθεση με τη save (1), μπορεί να γίνει προσθήκη στοιχείων σε υπάρχον αρχείο (app). Επίσης, μπορούν να δηλωθούν ο χαρακτήρας διαχωρισμού (delimiter, π.χ. '\t', ',', ' ' κλπ), καθώς και η α- ριθμητική ακρίβεια (precision) εγγραφής, είτε σε πλήθος δεκαδικών ψηφίων είτε σε πλήθος σημαντικών ψηφίων. Π.χ.: dlmwrite('filename.txt', A, '-app', 'precision', '%.6f'); dlmwrite('filename.txt', A, 'precision', 6, 'newline','pc'); Στην πρώτη περίπτωση ('precision','%.6f'), τα στοιχεία του πίνακα εγγράφονται με ακρίβεια 6 δεκαδικών ψηφίων (π.χ. ο αριθμός 0.00003141592 εγγράφεται ως 0.000031). Στη δεύτερη περίπτωση ('precision',6), η εγγραφή γίνεται με ακρίβεια 6 σημαντικών ψηφίων (δηλαδή εγγράφονται 6 ψηφία συνολικά, εκτός των «0» που βρίσκονται αριστερά), π.χ. ο ανωτέρω αριθμός εγγράφεται ως 3.14159e-005, δηλαδή ως 0.0000314159. Σημείωση: η επιλογή 'newline','pc' τίθεται γιατί διαφορετικά η dlmwrite θέτει ως χαρακτήρα αλλαγής γραμμής μόνο το line feed (ASCII 10), και όχι το συνδυασμό carriage return και line feed (ASCII 13 και 10), με αποτέλεσμα η αλλαγή γραμμής να μην κωδικοποιείται σωστά από το Σημειωματάριο (Notepad) των Windows (σε αντίθεση π.χ. με τους editors Notepad++ και Scintilla). csvwrite: Εγγραφή πίνακα ή τμήματος πίνακα σε αρχείο κειμένου σε μορφή csv (comma separated value) με έως 5 σημαντικά ψηφία. Π.χ.: csvwrite('filename.txt', A);

138 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Ειδικές συναρτήσεις εγγραφής: Μεταβλητών MATLAB, σε Φύλλο Excel: save (2): Εγγραφή μεταβλητών σε δυαδικό αρχείο MATLAB (.mat). Χρήσιμη για γρήγορη εγγραφή μιας ή περισσοτέρων μεταβλητών ή ολόκληρου του workspace, σε μορφή αποκλειστικά για το MATLAB. Π.χ.: save('filename.mat', 'var1', 'var2',...); xlswrite: Εγγραφή πίνακα σε δυαδικό αρχείο Microsoft Excel. Π.χ.: xlswrite('filename.txt', A, 'Sheet3', 'D2:H5'); Ανάγνωση αρχείων Γενική παρατήρηση: Για να γίνει σωστά η ανάγνωση ενός αρχείου, πρέπει να γνωρίζουμε πώς έχει γίνει η εγγραφή του. Συνήθως, για κάθε συνάρτηση εγγραφής υπάρχει και η αντίστοιχη συνάρτηση για ορθή ανάγνωση, χωρίς όμως να είναι αναγκαστική η αποκλειστική χρήση της (π.χ. fprintf / fscanf, fwrite / fread, save / load, dlmwrite / dlmread, csvwrite / csvread, xlswrite / xlsread). Γενικές συναρτήσεις χαμηλού επιπέδου για ανάγνωση αρχείων: fscanf: fread: Ανάγνωση ομάδας μεταβλητών ίδιου τύπου από αρχείο κειμένου. Γενικής χρήσης. Απαιτείται άνοιγμα και κλείσιμο αρχείου (fopen, fclose). Βλ. 13.2, 13.3. Παράδειγμα: Έστω αρχείο κειμένου με τον παρακάτω πίνακα 2 γραμμών: A = 1 2 3 4 5 6 1) Ανάγνωση όλων των στοιχείων με χρήση μίας εντολής fscanf: fid = fopen('filename.txt', 'rt'); A = fscanf(fid, '%d', Inf)'; fclose(fid); Τότε τα στοιχεία διαβάζονται στη μεταβλητή Α ως εξής: A = 1 2 3 4 5 6 2) Ανάγνωση των στοιχείων σε μορφή πίνακα 2 διαστάσεων: fid = fopen('filename.txt', 'rt'); i = 0; while ~feof(fid) i = i + 1; A(i,:) = fscanf(fid, '%d', 3) fclose(fid); Τότε τα στοιχεία διαβάζονται στη μεταβλητή Α ως εξής: A = 1 2 3 4 5 6 Ανάγνωση από δυαδικό αρχείο. Απαιτείται άνοιγμα και κλείσιμο αρχείου. Παράδειγμα: Έστω δυαδικό αρχείο κειμένου που περιέχει τον πίνακα 2 γραμμών A = [1 2 3 ; 4 5 6], ο οποίος γράφτηκε με το παράδειγμα της fwrite της σελίδας 137 (κατά στήλες, σε συνεχόμενες θέσεις των 8 byte double η κάθε μια). fid = fopen('filename.bin', 'rb'); A = fread(fid, 6, 'double')' % Ανάγνωση 6 στοιχείων, 8 bytes fclose(fid); % το καθένα, και μετά transpose Επειδή ο πίνακας Α είχε γραφτεί με την fwrite κατά στήλες, διαβάζεται ως: A = 1 4 2 5 3 6

Χρήσιμες συναρτήσεις του MATLAB 139 Συναρτήσεις λήψης αριθμητικών δεδομένων από αρχεία κειμένου: load (1): Ανάγνωση αριθμητικού πίνακα από αρχείο κειμένου. Χρήσιμη για άμεση ανάγνωση αρχείου κειμένου που περιέχει στήλες αριθμών. A = load('filename.txt'); dlmread: Ανάγνωση αριθμητικού πίνακα από αρχείο κειμένου. Σε αντίθεση με τη load (1), μπορεί να γίνει ανάγνωση τμήματος μόνο του αρχείου. Παραδείγματα: 1) Ανάγνωση όλου του αρχείου: A = dlmread('filename.txt'); 2) Ανάγνωση από την 1 η γραμμή, 2 η στήλη (αρχή από 0, 0) μέχρι το τέλος: A = dlmread('filename.txt', '', 0, 1); 3) Ανάγνωση από την 1 η γραμμή, 2 η στήλη μέχρι την 4 η γραμμή, 3 η στήλη: A = dlmread('filename.txt', '', [0,1,3,2]); csvread: Ανάγνωση αριθμητικού πίνακα ή τμήματός του από αρχείο κειμένου μορφής csv. A = csvwrite('filename.txt', 0, 1, [0,1,3,2]); importdata (1): Εισαγωγή αριθμητικού πίνακα από αρχείο κειμένου, με ή χωρίς header: x = importdata('filename.txt'); % στήλες αριθμών χωρίς header x = importdata('filename.txt', '\t', n); % αν υπάρχει header n γραμμών Ως header εδώ εννοούνται αρχικές γραμμές κειμένου με τις επικεφαλίδες των αριθμητικών στηλών του υπόλοιπου αρχείου (π.χ. συχνά n=1, όπως στο παρακάτω παράδειγμα). Αντί για '\t' μπορεί να τεθεί οποιοσδήποτε χαρακτήρας διαχωρισμού των στηλών του αρχείου (π.χ. ',', ' ' ). Π.χ.: Weight Height 85 1.80 72 1.75 Συναρτήσεις λήψης κειμένου από αρχεία κειμένου: fgetl: fgets: Ανάγνωση ολόκληρης γραμμής κειμένου από αρχείο κειμένου. Απαιτείται άνοιγμα και κλείσιμο αρχείου (fopen, fclose). Βλ. 13.2, 13.3. Ανάγνωση ολόκληρης γραμμής κειμένου μαζί με το χαρακτήρα αλλαγής γραμμής από αρχείο κειμένου. Απαιτείται άνοιγμα και κλείσιμο αρχείου (fopen, fclose). textscan: Ανάγνωση μορφοποιημένου κειμένου από αρχείο κειμένου. Ισχυρή εντολή με πλήθος παραμέτρων. Απαιτείται άνοιγμα και κλείσιμο αρχείου (fopen, fclose). fileread: Ανάγνωση ολόκληρου του περιεχομένου ενός αρχείου κειμένου σε ένα string. Ειδικές συναρτήσεις ανάγνωσης: Μεταβλητών MATLAB, από Excel, από το Clipboard: load (2): Ανάγνωση μεταβλητών από δυαδικό αρχείο MATLAB (.mat). Διαβάζονται οι μεταβλητές μαζί με τα ονόματα με τα οποία αποθηκεύτηκαν (με εντολή save). load('filename.mat'); importdata (2): Εισαγωγή μεταβλητών από το MATLAB ή από το clipboard. Π.χ.: x = importdata('filename.mat'); % από αρχείο MATLAB (.mat) x = importdata(' -pastespecial'); % από τη μνήμη συστήματος clipboard xlsread: Ανάγνωση πίνακα σε αρχείο Microsoft Excel. Παραδείγματα: 1) Ανάγνωση αριθμητικών δεδομένων από την περιοχή D2:H5 του Sheet3. Num = xlsread('filename.xls', 'Sheet3', 'D2:H5'); 2) Ανάγνωση των αριθμητικών δεδομένων στον πίνακα Num, των αλφαριθμητικών στο cell array Str και όλης της περιοχής D2:H5 στο cell array Raw. [Num, Str, Raw] = xlsread('filename.xls', 'D2:H5');

140 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Συναρτήσεις ελέγχου θέσης κατά την ανάγνωση αρχείου Κατά την ανάγνωση ενός αρχείου με συναρτήσεις χαμηλού επιπέδου (π.χ. fscanf, fread) είναι χρήσιμη η γνώση του δείκτη θέσης, δηλαδή του σημείου όπου έχει σταματήσει η ανάγνωση ενός αρχείου που έχει ανοίξει με fopen. Επίσης είναι χρήσιμη και η δυνατότητα μετακίνησης του δείκτη σε άλλη θέση, ώστε να μπορεί να συνεχιστεί η ανάγνωση από άλλο σημείο. Βλ. και 13.5. ftell: Ακέραιος που δείχνει την «απόσταση» σε bytes από την αρχή του αρχείου. fseek: Μετακίνηση του δείκτη θέσης. frewind: Επαναφορά του δείκτη θέσης στην αρχή. feof: Λογική τιμή για έλεγχο του τέλους του αρχείου.

16 Παράλληλη επεξεργασία σε CPUs Οι τελευταίες εκδόσεις του MATLAB έχουν τη δυνατότητα κατανομής των διαδικασιών ενός προγράμματος στους πυρήνες ή επεξεργαστές ενός συστήματος ή στους υπολογιστές ε- νός δικτύου. Στη συνέχεια ακολουθεί μια εισαγωγή στις παραπάνω δυνατότητες. 16.1 Πλεονεκτήματα παράλληλης και κατανεμημένης επεξεργασίας α) Parallel computing: Η κατανομή του χρόνου επεξεργασίας ενός προγράμματος στους επιμέρους πυρήνες ή επεξεργαστές ενός υπολογιστή ή στους υπολογιστές ενός δικτύου. β) Distributed arrays: Κατανομή πολύ μεγάλων πινάκων στη μνήμη πολλών υπολογιστών ενός δικτύου, σε περίπτωση που δεν επαρκεί η διαθέσιμη μνήμη του τοπικού υπολογιστή. γ) Η εκτέλεση ενός χρονοβόρου προγράμματος σε άλλον υπολογιστή του δικτύου, ώστε να απελευθερωθεί η χρήση του τοπικού υπολογιστή για άλλες εργασίες στο MATLAB. Στη συνέχεια θα περιγραφεί η απλούστερη περίπτωση της παράλληλης επεξεργασίας, που αφορά στην κατανομή του υπολογιστικού χρόνου σε πολυπύρηνο επεξεργαστή. 16.2 matlabpool: Δημιουργία «κοινοπραξίας» για παράλληλη επεξεργασία σε CPUs Πριν την έναρξη παράλληλης επεξεργασίας, πρέπει να δηλωθούν στο MATLAB τα συστήματα που θα εργαστούν παράλληλα. Αυτά ονομάζονται workers, και μπορεί να είναι είτε πυρήνες ενός πολυπήρυνου επεξεργαστή, είτε επεξεργαστές ενός πολυεπεξεργαστικού συστήματος, είτε υπολογιστές ενός τοπικού δικτύου. Οι workers που θα συμμετάσχουν δηλώνονται ως μέλη μιας «κοινοπραξίας» (pool), στην οποία θα εργαστούν παράλληλα. Η απλούστερη περίπτωση είναι η δημιουργία pool με τους πολλαπλούς πυρήνες ενός σύγχρονου επεξεργαστή, που μπορεί να γίνει εντελώς αυτόματα και απλά στο MATLAB: matlabpool; Η παραπάνω εντολή δημιουργεί αυτόματα έναν worker ανά πυρήνα. Το πλήθος των workers που δημιουργήθηκαν φαίνεται με την εντολή matlabpool('size'), κάτι που μπορεί να χρησιμοποιηθεί (α) για τον έλεγχο ύπαρξης ανοικτού pool πριν την εντολή δημιουργίας του καθώς και (β) ως αυτόματη τελική τιμή του μετρητή στο parfor: if ~matlabpool('size') matlabpool; Εάν δεν είναι επιθυμητή η δέσμευση όλων των πυρήνων, μπορεί να δηλωθεί το πλήθος όσων πρόκειται να χρησιμοποιηθούν. Για παράδειγμα, σε υπολογιστή με επεξεργαστή 4 πυρήνων μπορούν να δηλωθούν ως workers οι 3, ως εξής: matlabpool(3); Σημείωση: Το πλήθος των πυρήνων του επεξεργαστή ενός υπολογιστή με Windows φαίνεται με δεξί κλικ του ποντικιού στο εικονίδιο Computer (Υπολογιστής) των Windows, στη συνέχεια Manage (Διαχείριση), Device Manager (Διαχείριση Συσκευών) και τέλος ανάπτυξη του εικονιδίου Processors (Επεξεργαστές), οπότε εμφανίζονται οι πυρήνες του επεξεργαστή. Στον Device Manager μπορούμε να έχουμε πρόσβαση και από αλλού, π.χ. Start > Control Panel > Hardware and Sound. Το κλείσιμο του pool και η απελευθέρωση των επιμέρους workers γίνεται με: matlabpool close; Προσοχή: Στις εκδόσεις του MATLAB 2010a ή νεότερες, πιθανό πρόβλημα κατά τη δημιουργία του pool ίσως να λύνεται αν προηγουμένως να δοθεί η εντολή: distcomp.feature('localusempiexec',false); Βλ. http://www.mathworks.com/support/solutions/en/data/1-c27yo8/index.html?product=ml&solution=1-c27yo8.

142 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 16.3 parfor: Παράλληλο for Η parfor κατανέμει παράλληλα τις επαναλήψεις ενός βρόχου στους workers ενός pool. Η σύνταξή της μοιάζει με της for, με τη διαφορά ότι ο δείκτης είναι ακέραιος με βήμα 1: parfor i=a:b <εντολές> Η χρήση της parfor μοιάζει με της for, με κάποιους περιορισμούς: α) Οι επαναλήψεις πρέπει να είναι μεταξύ τους ανεξάρτητες, δηλαδή οι τιμές των μεταβλητών που χρησιμοποιούνται σε κάθε επανάληψη πρέπει να είναι ανεξάρτητες από τα αποτελέσματα της προηγούμενης επανάληψης. β) Η σειρά των επαναλήψεων είναι τυχαία (δεν γίνεται σύμφωνα με το δείκτη του βρόχου) και εξαρτάται από το πόσο γρήγορα τελειώνει κάθε worker κάθε επανάληψη, πριν του ανατεθεί η επόμενη. γ) Στο εσωτερικό ενός βρόχου parfor δεν μπορούν να χρησιμοποιηθούν συναρτήσεις που δεν είναι αυστηρά υπολογιστικές (όπως οι plot, input, keyboard κλπ). Επίσης, δεν μπορούν να χρησιμοποιηθούν τα εργαλεία αποσφαλμάτωσης του MATLAB (όπως χρήση breakpoints και εκτέλεση γραμμή-γραμμή). δ) Ο δείκτης του βρόχου πρέπει να είναι ακέραιος που αυξάνεται με βήμα 1. ε) Όσες μεταβλητές δημιουργηθούν στο εσωτερικό του βρόχου, καταστρέφονται μετά την έξοδο από το βρόχο, εκτός αν αποθηκευτούν σε πίνακα ή cell array που χρησιμοποιεί το δείκτη του βρόχου ως δείκτη των στοιχείων του. Σημείωση: Η parfor εκτελείται χωρίς σφάλμα (και με ίδια ταχύτητα) ακόμα κι αν δεν υπάρχει ανοικτό pool. Αυτό σημαίνει ότι ένα πρόγραμμα μπορεί να γραφτεί με χρήση της parfor, ώστε να είναι έτοιμο για εκτέλεση σε περιβάλλον παράλληλης επεξεργασίας, ακόμα κι αν τελικά δεν συμβεί αυτό. Ένα απλό παράδειγμα Το παράδειγμα που ακολουθεί δείχνει μια απλή χρήση της parfor και τη διαφορά χρόνου από τη for (χρησιμοποιήθηκε υπολογιστής με επεξεργαστή 2 πυρήνων Intel Core 2 Duo συχνότητας 2GHz). Ο χρόνος εκτέλεσης με parfor δεν είναι ακριβώς ο μισός του χρόνου ε- κτέλεσης με for, λόγω του απαιτούμενου χρόνου μεταφοράς των δεδομένων. Παράδειγμα clear; tic for i=1:2 c(:,i) = eig(rand(1000)); toc Αποτελέσμα Elapsed time is 5.919485 seconds. matlabpool; % Δημιουργία pool clear; tic parfor i=1:2 c(:,i) = eig(rand(1000)); toc Elapsed time is 4.205843 seconds.

Παράλληλη επεξεργασία σε CPUs 143 Ένα περισσότερο ολοκληρωμένο παράδειγμα Στο παρακάτω παράδειγμα δεσμεύονται αυτόματα ως workers όλους τους πυρήνες ενός επεξεργαστή για τη δημιουργία pool, εάν αυτό δεν έχει δημιουργηθεί προηγουμένως. Επίσης, υπάρχει (εντός σχολίων) η κατάλληλη εντολή αποφυγής ενός σφάλματος (bug) στην έκδοση 2010a του MATLAB. Στη συνέχεια εφαρμόζεται η parfor, και τέλος ακολουθεί η καταστροφή του pool με απελευθέρωση των workers. % Δημιουργία pool (αν δεν υπάρχει ήδη) και δέσμευση των workers if ~(matlabpool('size')) % Αποσχολιάστε την παρακάτω εντολή, αν η matlabpool αποτυγχάνει % (π.χ. στην έκδοση MATLAB 2010a). % distcomp.feature('localusempiexec',false); matlabpool; % Εκτέλεση parfor parfor i=1:matlabpool('size') % για αυτόματη χρήση όλων των πυρήνων <εντολές> % Κλείσιμο pool (αν υπάρχει) και απελευθέρωση των workers if matlabpool('size') matlabpool close; 16.4 spmd: Single Program Multiple Data Οι μεταβλητές που οριστούν εντός μιας εντολής spmd δημιουργούνται ταυτόχρονα και παράλληλα σε όλους τους workers. Τότε, οι μεταβλητές μετατρέπονται σε cell arrays, με τόσα κελιά όσα και το πλήθος των workers. Η μεταβλητή labindex, εσωτερικά της spmd, δίνει το δείκτη του ενεργού worker. Στο επόμενο παράδειγμα η labindex λειτουργεί ως συχνότητα της ημιτονοειδούς συνάρτησης, απλώς για επίδειξη της εκτέλεσης σε διαφορετικούς workers (όπου και η labindex λαμβάνει διαφορετική τιμή). Παράδειγμα matlabpool; N = 1000; n = [0:N-1]; spmd x = 5*sin(2*pi*labindex*n/N); subplot(2,1,1); plot(x{1}); subplot(2,1,2); plot(x{2}); Αποτελέσμα 5 0-5 0 100 200 300 400 500 600 700 800 900 1000 5 0-5 0 100 200 300 400 500 600 700 800 900 1000

17 Παράλληλη επεξεργασία στη GPU Οι τελευταίες εκδόσεις του MATLAB έχουν τη δυνατότητα της εκτέλεσης πολλών έτοιμων συναρτήσεων στον επεξεργαστή γραφικών (graphics processing unit, GPU), χωρίς τη ανάγκη προγραμματισμού σε χαμηλό επίπεδο σε γλώσσα C ή Fortran. Η εκτέλεση συναρτήσεων στην GPU είναι μια ειδική περίπτωση παράλληλης επεξεργασίας, επειδή όμως οι επεξεργαστές των σύγχρονων καρτών γραφικών έχουν εκατοντάδες πυρήνες, η επιτάχυνση της επεξεργασίας σε GPU είναι πολύ μεγαλύτερη σε σχέση με την παράλληλη επεξεργασία σε πολυπύρηνους επεξεργαστές (CPU) των σύγχρονων υπολογιστών, που διαθέτουν πολύ μικρότερο αριθμό πυρήνων σε σχέση με τις GPU. 17.1 Απαιτήσεις Σήμερα, από το MATLAB υποστηρίζονται οι κάρτες γραφικών της εταιρείας NVIDIA με υποστήριξη CUDA και υπολογιστικής ικανότητας έκδοσης 1.3 και άνω (λόγω της υποστήριξης διπλής και υλοποίησης μαθματικών πράξεων συμμορφούμενων με IEEE). Επίσης, η έκδοση του MATLAB πρέπει να είναι τουλάχιστον η 2010b. 17.2 Προϋποθέσεις Για να είναι δυνατή η επιτάχυνση μιας εφαρμογής με τη βοιήθεια της GPU πρέπει να ικανοποιούνται και τα δύο ακόλουθα κριτήρια (διαφορετικά ο συνολικός χρόνος μπορεί να είναι μεγαλύτερος αν χρησιμοποιηθεί η GPU, εν μέρει λόγω της μεταφοράς των μεταβλητών προς και από τη μνήμη της GPU): α) Ο υπολογιστικός χρόνος πρέπει να είναι σημαντικά μεγαλύτερος από το χρόνο που α- παιτείται για η μεταφορά δεδομένων από και προς η μνήμη της GPU. β) Να είναι δυνατός ο χωρισμός των υπολογιστικών διαδικασιών σε πολλές ανεξάρτητες μεταξύ τους μονάδες επεξεργασίας. Επίσης, είναι σημαντικό να γνωρίζει κανείς ότι η επεξεργασία γίνεται αποκλειστικά στη φυσική μνήμη της GPU, σε αντίθεση με τη CPU η οποία μπορεί να χρησιμοποιήσει μέρος της χωρητικότητας των σκήρών δίσκων ως εικονική μνήμη. Αυτό σημαίνει ότι το μέγιστο μέγεθος των πινάκων που θα χρησιμοποιηθούν στην GPU περιορίζεται από την ποσότητα της διαθέσιμης μνήμης της. 17.3 Διαδικασία χρήσης GPU από το MATLAB Η εκμετάλλευση της GPU από το MATLAB γίνεται με μια διαδικασία τριών βημάτων: 1. Μεταφορά πινάκων από το Workspace στη μνήμη της GPU. Η μεταφορά αυτή γίνεται με χρήση της συνάρτησης gpuarray. Βλ. http://www.mathworks.com/help/distcomp/establish-arrays-on-a-gpu.html 2. Εφαρμογή συναρτήσεων του MATLAB στους πίνακες που βρίσκονται στη μνήμη της GPU. Οι περισσότερες μαθηματικές συναρτήσεις υποστηρίζουν πράξεις στη GPU (τριγωνομετρικές, εκθετικές και λογαριθμικές συναρτήσεις, μετασχηματισμός Fourier, πράξεις και μετασχηματισμοί πινάκων, μετατροπή μεταβλητών σε άλλους τύπους κλπ). Βλ. http://www.mathworks.com/help/distcomp/run-built-in-functions-on-a-gpu.html 3. Μεταφορά του αποτελέσματος από τη GPU στο Workspace. Η μεταφορά αυτή γίνεται με χρήση της συνάρτησης gather. Βλ. http://www.mathworks.com/help/distcomp/establish-arrays-on-a-gpu.html

Παράλληλη επεξεργασία στη GPU 145 17.4 Ένα απλό παράδειγμα Το παράδειγμα που ακολουθεί δείχνει μια απλή χρήση της GPU με αναλυτικά τα βήματα που απαιτούνται: Παράδειγμα % Δημιουργία πίνακα στο Workspace του MATLAB (στη μνήμη RAM) p = rand(2000); % Μεταφορά πίνακα από το Workspace στη μνήμη της GPU q = gpuarray(p); % Εκτέλεση συνάρτησης στην GPU a = eig(q); % Μεταφορά αποτελέσματος από τη μνήμη της GPU στο Workspace b = gather(a); 17.5 Ένα τεστ χρόνου Το παράδειγμα που ακολουθεί δείχνει την εκτέλεση των ίδιων πράξεων σε 3 περιπτώσεις: α) σε έναν πυρήνα μιας CPU (Intel Core 2 Quad Q9550 2.83GHz) β) στους 4 πυρήνες της CPU (Intel Core 2 Quad Q9550 2.83GHz) γ) στη GPU (NVIDIA GeForce GTX Titan 6GB) Παράδειγμα clear; tic for i=1:4 p = rand(2000); a(:,i) = eig(p);, toc matlabpool; clear; tic parfor i=1:4 p = rand(2000); b(:,k) = eig(p);, toc clear; tic for i=1:4 p = gpuarray(rand(2000)); c(:,i) = eig(p); d = gather(c); toc Αποτελέσμα Elapsed time is 38.385576 seconds (CPU in 1 core: Intel Core 2 Quad Q9550 2.83GHz) Elapsed time is 22.997933 seconds. (CPU in 4 cores: Intel Core 2 Quad Q9550 2.83GHz) Elapsed time is 20.543188 seconds. (GPU: NVIDIA GeForce GTX Titan 6GB)

18 Βελτιστοποίηση κώδικα Ως βελτιστοποίηση του κώδικα ενός προγράμματος (code optimization) εννοείται η τροποποίησή του από τον προγραμματιστή έτσι ώστε να εκτελείται ταχύτερα ή/και να απαιτεί λιγότερη μνήμη. Αρχικά θα αναφερθούν τεχνικές για ταχύτερη εκτέλεση του κώδικα, και στη συνέχεια τεχνικές για ελάττωση της απαιτούμενης μνήμης, 18.1 Έλεγχος χρόνου εκτέλεσης Ο έλεγχος του χρόνου εκτέλεσης όλου του προγράμματος ή τμήματός του μπορεί να γίνει είτε με απλή χρονομέτρηση (π.χ. με τις εντολές tic - toc) είτε με ανάλυση του κώδικα μέσω της εξειδικευμένης λειτουργίας του MATLAB profiler. Η διαφορά είναι ότι οι tic - toc καταμετρούν το συνολικό χρόνο εκτέλεσης ενός τμήματος κώδικα, ενώ ο profiler αναλύει ό- λες τις συναρτήσεις του τμήματος ξεχωριστά, ώστε να φανεί ποια από αυτές προκαλεί τη μεγαλύτερη καθυστέρηση. 18.2 Εντολές tic - toc Οι tic - toc είναι εντολές που χρησιμοποιούνται για μέτρηση χρόνου με πολύ μεγάλη ακρίβεια. Η tic τοποθετείται ακριβώς πριν τη διαδικασία που πρόκειται να χρονομετρηθεί, και η toc ακριβώς μετά. 1 ος τρόπος σύνταξης 2 ος τρόπος σύνταξης tic <εντολές> toc tic <εντολές> t = toc Με τον 1 ο τρόπο σύνταξης ο χρόνος που πέρασε εμφανίζεται στο Command Window, ενώ με το 2 ο τρόπο ο χρόνος αποθηκεύεται στη μεταβλητή t. Οι δύο εντολές δεν είναι υποχρεωτικό να τοποθετούνται κατά ζεύγη. Κάθε toc καταγράφει το χρόνο μετά την τελευταία tic. 18.3 Profiler Ο profiler είναι μια λειτουργία του MATLAB που επιτρέπει στο χρήστη να δει, μετά την εκτέλεση ενός προγράμματος, το χρόνο που χρειάστηκε κάθε επιμέρους συνάρτηση για να εκτελεστεί. Έτσι μπορούν να εντοπιστούν τα τμήματα του προγράμματος που προκαλούν καθυστερήσεις, ώστε να βελτιστοποιηθεί ο κώδικας στα σημεία που απαιτείται. Η λειτουργία του profiler ξεκινάει με την εντολή profile on στην αρχή του προγράμματος ή στην αρχή του τμήματος κώδικα που πρόκειται να αναλυθεί (ή στο Command Window, πριν την εκτέλεση του προγράμματος). Μετά το τέλος του προγράμματος, μπορεί να γίνει επισκόπηση του χρόνου εκτέλεσης κάθε συνάρτησης με άνοιγμα του παραθύρου του profiler, που γίνεται είτε με την εντολή profile viewer είτε από το μενού Desktop Profiler. Για παράδειγμα, το πρόγραμμα θα μπορούσε να περιλαμβάνει τις εντολές profile on και profile viewer στην αρχή και στο τέλος του τμήματος κώδικα αντίστοιχα: profile on <πρόγραμμα ή τμήμα κώδικα> profile viewer Η μέτρηση χρόνου με τον profiler δεν είναι τόσο ακριβής όσο με τις tic - toc (αν και οι τελευταίες μετρούν μάλλον το χρόνο συστήματος, παρά το χρόνο καθαρής εκτέλεσης κώδικα). Αύξηση της ακρίβειας μπορεί να επιτευχθεί με την εύρεση της μέσης τιμής του χρόνου εκτέλεσης μεγάλου αριθμού επαναλήψεων των συναρτήσεων που ενδιαφέρουν.

Βελτιστοποίηση κώδικα 147 18.4 Προδέσμευση πίνακα στη μνήμη (preallocation) Στο MATLAB είναι δυνατή η σταδιακή αύξηση του μεγέθους ενός πίνακα χωρίς υποχρεωτική προηγούμενη δέσμευσή του στη μνήμη. Αυτό το χαρακτηριστικό προσφέρει απλότητα αλλά ελαττώνει πολύ την ταχύτητα. Αυτό γίνεται γιατί τα στοιχεία ενός πίνακα αποθηκεύονται στη μνήμη πάντοτε σε διαδοχικές διευθύνσεις (αυτό δεν συμβαίνει για τις δομές και τα cell arrays). Όταν το μέγεθος του πίνακα αυξηθεί, αν δεν υπάρχουν συνεχόμενες θέσεις για τα νέα στοιχεία, τότε το MATLAB πρέπει να καταναλώσει χρόνο για να βρει στη μνήμη ένα μεγαλύτερο ελεύθερο συνεχόμενο τμήμα και να μετακινήσει εκεί τον πίνακα: Αύξηση του πίνακα χωρίς προδέσμευση (σκιασμένα τετράγωνα = δεσμευμένες θέσεις). 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 Η αποφυγή της άσκοπης αυτής κατανάλωσης χρόνου μπορεί να επιτευχθεί με μια αρχική δέσμευση συνεχόμενων θέσεων για το αναμενόμενο μέγεθος του πίνακα. Η δέσμευση αυτών των θέσεων γίνεται με μία από τις πολλές συναρτήσεις του MATLAB που δημιουργούν αυτόματα πίνακες, πληρώντας τους με συγκεκριμένα στοιχεία (π.χ. zeros, ones βλ. 9.10). Προδέσμευση του πίνακα σε ελεύθερο συνεχόμενο τμήμα... 0 0 0 0 0...και σάρωσή του χωρίς μετακίνηση. 1 0 0 0 0 1 2 0 0 0 1 2 3 0 0 1 2 3 4 0 1 2 3 4 5 Σε περίπτωση πινάκων κελιών (cell arrays), πρέπει πρώτα να δημιουργηθεί ο πίνακας κελιών (συνάρτηση cell) και μετά να γίνει προδέσμευση σε όσα κελιά περιέχουν πίνακες. Παράδειγμα: Προδέσμευση πίνακα % Χωρίς προδέσμευση του πίνακα Α clear; tic for i=1:1000 A(i) = i^2; toc Elapsed time is 0.001768 seconds. % Με προδέσμευση του πίνακα Α clear; tic A = zeros(1000,1); % Προδέσμευση for i=1:1000 A(i,j) = i^2; toc Elapsed time is 0.000040 seconds. Προδέσμευση πίνακα κελιών % Προδέσμευση πίνακα κελιών % α) Δημιουργία του cell array A = cell(2,3); % β) Προδέσμευση όσων κελιών % του cell array είναι πίνακες A{1,2} = zeros(1000); A{3,2} = zeros(1,500); % Ακολουθεί ο υπόλοιπος κώδικας Η προδέσμευση είναι σημαντική όταν το μέγεθος του πίνακα είναι μεγάλο και όταν ο υπολογιστικός χρόνος κάθε επανάληψης είναι σχετικά μικρός (διαφορετικά η ποσοστιαία αύξηση της ταχύτητας είναι μικρή).

148 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 18.5 Σάρωση πίνακα κατά στήλες Στο MATLAB (καθώς και στη γλώσσα Fortran), η αποθήκευση ενός πίνακα στη μνήμη γίνεται «κατά στήλες» (δηλαδή, μεταβάλλονται πρώτα οι δείκτες που είναι αριστερότερα) * : Πρώτα τα στοιχεία της 1 ης στήλης, στη συνέχεια της 2 ης στήλης κ.ο.κ.. Π.χ. Έστω ο πίνακας: Η αποθήκευση των στοιχείων ενός πίνακα στη μνήμη γίνεται «κατά στήλες», σε διαδοχικές διευθύνσεις μνήμης: A = [ ] 1 4 7 10 2 5 8 11 3 6 9 12 Λόγω της αποθήκευσης του πίνακα στη μνήμη κατά στήλες, η σάρωσή του είναι ταχύτερη αν γίνει επίσης κατά στήλες, παρά κατά γραμμές. A = [ ] A = [ ] 1 4 7 10 2 5 8... 1 4 7 10 2 5... 3 Η σάρωση είναι ταχύτερη όταν γίνεται σύμφωνα με τη σειρά αποθήκευσης στη μνήμη, διότι οι σύγχρονοι επεξεργαστές, όταν ζητηθεί από τη μνήμη RAM μια μεταβλητή, ανασύρουν μαζί με αυτήν και τις μεταβλητές που βρίσκονται στις αμέσως επόμενες θέσεις (καθώς θεωρείται ότι είναι περισσότερο πιθανό να ζητηθούν σε επόμενο αίτημα προς τη μνήμη). Η ομάδα αυτή των μεταβλητών αποθηκεύεται προσωρινά σε μια μικρού μεγέθους αλλά γρήγορης προσπέλασης μνήμη μέσα στον επεξεργαστή που λέγεται cache. Έτσι, όταν ζητηθεί η μεταβλητή της επόμενης θέσης, αυτή θα διαβαστεί από την μνήμη cache και όχι από τη RAM. Έτσι, κατά τη σάρωση σύμφωνα με τη σειρά αποθήκευσης, γίνονται λιγότερα αιτήματα προς την κύρια μνήμη RAM, με αποτέλεσμα αύξηση της ταχύτητας σάρωσης. Παράδειγμα % Σάρωση κατά γραμμές clear; A = rand(1e4); s = 0; tic for i=1:size(a,1) for j=1:size(a,2) s = s + A(i,j); toc % Σάρωση κατά στήλες clear; A = rand(1e4); s = 0; tic for j=1:size(a,2) for i=1:size(a,1) s = s + A(i,j); toc Αποτέλεσμα Elapsed time is 9.166792 seconds. Elapsed time is 0.966869 seconds. * Αντίθετα, στη γλώσσα C και τις περισσότερες γλώσσες προγραμματισμού η αποθήκευση ενός πίνακα στη μνήμη γίνεται «κατά γραμμές» (δηλαδή, μεταβάλλονται πρώτα οι δείκτες που είναι δεξιότερα).

Βελτιστοποίηση κώδικα 149 18.6 Διανυσματοποίηση (vectorization) Με την έννοια της διανυσματοποίησης εννοείται η εκτέλεση πράξεων απ ευθείας πάνω σε ολόκληρους πίνακες χωρίς, για παράδειγμα, τη χρήση επαναληπτικών βρόχων. Το MATLAB έχει ενσωματωμένες πολύ ισχυρές δυνατότητες διανυσματοποίησης, με α- ποτέλεσμα (α) πιο απλό και συμπαγή κώδικα και (β) ταχύτερη εκτέλεση προγράμματος. Α- κολουθούν οι βασικές τεχνικές διανυσματοποίησης, ενώ με εξοικείωση και επινοητικότητα μπορούν να διανυσματοποιηθούν και αρκετά πιο πολύπλοκες διαδικασίες: Πράξεις πινάκων (όπως ορίζονται στη γραμμική άλγεβρα). Εκτελούνται απ ευθείας με χρήση των αριθμητικών τελεστών (+ - * / ^, βλ. και 9.10).. Π.χ.: Πολλαπλασιασμός πινάκων: C = A*B (όπου και θυμίζουμε ότι πρέπει οι εσωτερικές διαστάσεις των πινάκων να είναι ίσες, A[q r] B[r p], οπότε το γινόμενό τους έχει τις εξωτερικές διαστάσεις, C[q p]). Πράξεις πινάκων στοιχείο προς στοιχείο, με χρήση των τελεστών των αριθμητικών πράξεων μαζί με μια τελεία (.+.-.*./.^). Βλ. και 9.11. Π.χ.: Πολλαπλασιασμός πινάκων στοιχείο προς στοιχείο: C = A.*B. Εφαρμογή συναρτήσεων απ ευθείας σε ολόκληρους πίνακες: Π.χ. Η y=sin(x) δημιουργεί πίνακα y με τις τιμές των ημιτόνων των στοιχείων του πίνακα x, αντί για το βρόχο: for i=1:length(x), y(i)=sin(x(i)); Προσοχή: Οι στατιστικές συναρτήσεις (min, max, sum, mean, std κλπ), ενεργούν στις στήλες των πινάκων. Π.χ. η mean(x) βρίσκει τις μέσες τιμές κάθε στήλης του πίνακα x και τις αποθηκεύει σε έναν πίνακα-γραμμή. Βλ. και 15.4. Χρήση του ισχυρού συντομευμένου τρόπου χειρισμού των δεικτών πίνακα στο MATLAB (βλ. 9.2-9.5,0), π.χ.: A(2:5,:) = 0 Όλα τα στοιχεία των γραμμών 2 έως 5 τίθενται ίσα με το μηδέν. C(:,[3,7:]) Αναφορά σε όλα τα στοιχεία των στηλών 3 και από 7 έως την τελευταία στήλη του πίνακα C. mean(c(:)) Εύρεση της μέσης τιμής όλου του πίνακα C, αφού μετατραπεί σε πίνακα-στήλη (διότι η mean ενεργεί κατά στήλες, 9.2, 9.13). F = [A;[2 4 6]] Δημιουργία του πίνακα F από τον A με πρόσθεση μιας ακόμη γραμμής με τα στοιχεία [2 4 6]. G(2,:) = [] Κατάργηση της 2 ης γραμμής του G με αναδιάταξη των υπολοίπων γραμμών. Πολύ χρήσιμες είναι οι συναρτήσεις χειρισμού και ταξινόμησης πινάκων, π.χ.: repmat Δημιουργία πίνακα μέσω επαναλήψεων άλλου μικρότερου πίνακα sort Ταξινόμηση των στηλών ενός πάνινα (κάθε στήλη ταξινομείται ανεξάρτητα από τις άλλες). sortrows Ταξινόμηση των γραμμών ενός πίνακα ως προς μια συγκεκριμένη στήλη. κλπ (βλ. και 9.8, 9.9). Ιδιαιτέρως ισχυρή είναι η δυνατότητα του MATLAB για άμεση εύρεση στοιχείων πίνακα υπό συνθήκες ( 9.6). Π.χ. η B = A(A~=0) επιστρέφει στον πίνακα B μόνο τα μη μηδενικά στοιχεία του Α, ενώ η C = A(B>0) επιστρέφει στον πίνακα C μόνο τα στοιχεία του A για τα οποία τα αντίστοιχα στοιχεία του B είναι θετικά. Στη συγκεκριμένη περίπτωση, το κέρδος χρόνου με διανυσματοποίηση είναι μεγάλο, καθώς το μέγεθος του C δεν είναι γνωστό, οπότε σε σάρωση δεν μπορεί να γίνει preallocation. Στα επόμενα παραδείγματα περιγράφονται δύο διαδικασίες με και χωρίς διανυσματοποίηση, ώστε να φανούν τα πλεονεκτήματα της διανυσματοποίησης.

150 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Παραδείγματα Αποτελέσματα % 1) Πολλαπλασιασμός μεγάλων πινάκων στοιχείο προς στοιχείο A = rand(1000); B = rand(1000); % (α) Χωρίς διανυσματοποίηση tic C = zeros(size(a)); %(προδέσμευση) for j=1:size(c,2) for i=1:size(c,1) C(i,j) = A(i,j) * B(i,j); toc Elapsed time is 0.097549 seconds. % (β) Mε διανυσματοποίηση (6 γραμμές κώδικα αντικαθίστανται από 1) tic C = A.* B; toc Elapsed time is 0.015228 seconds. % 2) Εύρεση στοιχείων πίνακα υπό συνθήκη (εύρεση των θετικών % στοιχείων του C και αποθήκευσή τους σε νέο πίνακα-γραμμή D) % (α1) Χωρίς διανυσματοποίηση και χωρίς προδέσμευση tic n = 0; %(αρχικοποίηση μετρητή για τα στοιχεία του D) for j=1:size(c,2) for i=1:size(c,1) if C(i,j)>0, n = n + 1; D(n) = C(i,j); toc Elapsed time is 4869.505111 seconds. Ο τεράστιος χρόνος σάρωσης οφείλεται (εκτός από το ότι ο C είναι αρκετά μεγάλος πίνακας) στο ότι η διάσταση του πίνακα D δεν είναι γνωστή εκ των προτέρων, οπότε δεν μπορεί να γίνει προδέσμευσή του. Ένας τρόπος να γίνει προδέσμευση του D θα ήταν να γίνει πρώτα μια σάρωση του C με απαρίθμηση των μηδενικών στοιχείων του, ώστε να γίνει γνωστό το μέγεθος του D: % (α2) Χωρίς διανυσματοποίηση, με προδέσμευση tic n = 0; for j=1:size(c,2) for i=1:size(c,1) if C(i,j)>0, n = n + 1; Μετά, αφού γνωρίζουμε το μέγεθος του D (είναι ίσο με n) γίνεται η προδέσμευσή του, και μετά ακολουθεί δεύτερη σάρωση του C για την αποθήκευση των μηδενικών στοιχείων του στον D. D = zeros(1,n); n = 0; %(προδέσμευση και αρχικοποίηση του μετρητή) for j=1:size(c,2) for i=1:size(c,1) if C(i,j)>0, n = n + 1; D(n) = C(i,j); toc Elapsed time is 0.06177 seconds. Όλα τα παραπάνω μπορούν να αποφευχθούν με χρήση διανυσματοποίησης: % (β) Mε διανυσματοποίηση (12 γραμμές κώδικα αντικαθίστανται από 1) clear D; tic D = C(C>0); toc Elapsed time is 0.02248 seconds.

Βελτιστοποίηση κώδικα 151 18.7 Παράλληλη επεξεργασία Οι τελευταίες εκδόσεις του MATLAB έχουν τη δυνατότητα παράλληλης επεξεργασίας. Η πιο απλή περίπτωση, αλλά πολύ συνηθισμένη, είναι κατανομή των επαναλήψεων ενός βρόχου στους πολλαπλούς πυρήνες ενός σύγχρονου επεξεργαστή. Οι αλλαγές που απαιτούνται στον κώδικα του προγράμματος στην περίπτωση αυτή είναι δύο: matlabpool: Αρχικά απαιτείται η δημιουργία της «κοινοπραξίας» (pool) των συστημάτων που θα εργαστούν παράλληλα (π.χ. οι πυρήνες), που λέγονται workers. parfor: Στη συνέχεια, πρέπει να χρησιμοποιηθούν βρόχοι parfor (μπορούν να α- ντικαταστήσουν κάποιους for, με παρόμοια χρήση αλλά κάποιους περιορισμούς): 1. Οι επαναλήψεις πρέπει να είναι μεταξύ τους ανεξάρτητες. 2. Η σειρά των επαναλήψεων είναι τυχαία και εξαρτάται από το πόσο γρήγορα τελειώνει κάθε worker κάθε επανάληψη, πριν του ανατεθεί η επόμενη. 3. Στο εσωτερικό του βρόχου δεν μπορούν να χρησιμοποιηθούν συναρτήσεις που δεν είναι αυστηρά υπολογιστικές (όπως οι plot, input, keyboard κλπ) 4. Ο δείκτης του βρόχου πρέπει να είναι ακέραιος αυξανόμενος με βήμα 1. Παράδειγμα: % Δημιουργία pool με workers όσους και πυρήνες matlabpool; % Βρόχος (με αυτόματη τελική τιμή μετρητή για χρήση όλων των πυρήνων) parfor i=1:matlabpool('size') c(:,i) = eig(rand(1000)); % Κλείσιμο pool matlabpool close; Ένα πρόγραμμα μπορεί να γραφτεί εκ των προτέρων με parfor (αντί για for) λαμβάνοντας υπ όψιν τους παραπάνω περιορισμούς ώστε να είναι έτοιμο για χρήση σε παράλληλο σύστημα, καθώς ακόμα κι αν δεν συμβεί αυτό ο χρόνος εκτέλεσης θα είναι τουλάχιστον ίδιος. Για τον υπολογισμό του κέρδους χρόνου με χρήση παράλληλης επεξεργασίας πρέπει να ληφθεί υπ όψιν ότι το άνοιγμα του pool απαιτεί περίπου 10-15sec και το κλείσιμο περίπου 3-5sec (κάτι που σημαίνει επίσης ότι σε περιπτώσεις δοκιμών του κώδικα ή αποσφαλμάτωσης είναι προτιμότερο το pool να μην κλείνει μεταξύ διαδοχικών εκτελέσεων του προγράμματος). Ανεξαρτήτως αυτού, ο χρόνος σε παράλληλη επεξεργασία δεν ελαττώνεται αντιστρόφως α- νάλογα με το πλήθος των workers (όπως ίσως θα περίμενε κανείς), καθώς επιπλέον χρόνος απαιτείται για την επικοινωνία μεταξύ του MATLAB και των workers. Για περισσότερα σχετικά με την παράλληλη επεξεργασία στο MATLAB βλ. κεφ. 16. 18.8 Άλλες τεχνικές επιτάχυνσης χρόνου εκτέλεσης Μερικές ακόμη τεχνικές για ελάττωση του χρόνου εκτέλεσης προγράμματος είναι:: Χρήση && και (short circuit AND, short circuit OR) αντί για & και ( 4.3): Αν η 1 η συνθήκη του τελεστή && είναι ψευδής, η 2 η δεύτερη δεν εξετάζεται (δεν απαιτείται). Παρομοίως, αν η 1 η συνθήκη του τελεστή είναι αληθής, η 2 η δεν εξετάζεται. Οι συναρτήσεις εκτελούνται γενικά ταχύτερα από τα scripts. Οι ανωτέρου επιπέδου συναρτήσεις αρχείων του MATLAB (save, load) λειτουργούν ταχύτερα από τις συναρτήσεις χαμηλότερου επιπέδου (fwrite, fread).

152 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 18.9 Βελτιστοποίηση μνήμης Στη συνέχεια αναφέρονται τεχνικές για αποτελεσματικότερη διαχείριση μνήμης. Σημειώνεται ότι κάποιες `από τις τεχνικές βελτιστοποίησης μνήμης έχουν ως αποτέλεσμα ελάττωση του χρόνου εκτέλεσης του προγράμματος, και άλλες αύξηση. Απελευθέρωση μεταβλητών (clear): Μεταβλητές που δεν χρησιμοποιούνται πλέον μπορούν να απελευθερωθούν με clear <μεταβλητή>. Χρήση κατάλληλου τύπου μεταβλητών (single, int, uint, logical): Όπου είναι δυνατόν (δηλαδή παντού, συνήθως) μπορούν να χρησιμοποιούνται μεταβλητές μικρότερων τύπων, αλλά κατά κανόνα με κόστος στην ταχύτητα εκτέλεσης: - Οι κινητής υποδιαστολής single συνήθως αρκούν (αντί double). - Οι τύποι ακεραίων έως 16-bit είναι συνήθως επαρκείς για ακέραιες μεταβλητές. Ειδικά για την πολύ συνηθισμένη περίπτωση των δεικτών ή μετρητών, οι uint8 και uint16 συνήθως αρκούν. Αντικατάσταση της ίδιας μεταβλητής μετά από πράξεις, αντί ανάθεσης σε νέα μεταβλητή (όπου αυτό είναι δυνατόν). Εκτός από το προφανές κέρδος σε μνήμη (αφού δεν δεσμεύεται νέα μεταβλητή), υπάρχει κέρδος και σε χρόνο. Παραδείγματα: Πράξεις με ανάθεση σε νέα μεταβλητή Πράξεις με ανάθεση στην ίδια μεταβλητή x = rand(5e3); y = x.^2; Elapsed time 1.09 sec function x2y x = rand(5e3); y = xsquare(x); x = rand(5e3); x = x.^2; function x2x x = rand(5e3); x = xsquare(x); Elapsed time 0.97 sec function y = xsquare(x) y = x.^2; Elapsed time 1.09 sec function x = xsquare(x) x = x.^2; Elapsed time 0.97 sec Ομαδοποίηση μεταβλητών σε πίνακες, σε περίπτωση που υπάρχουν πάρα πολλές μεταβλητές, για εξοικονόμηση μνήμης μέσω αποθήκευσης λιγότερων headers (σε κάθε μεταβλητή, εκτός από δεδομένα, αποθηκεύονται και πληροφορίες για τον τύπο, τις διαστάσεις και τα χαρακτηριστικά της σε μια περιοχή που λέγεται header). Χρήση πινάκων ως πεδία δομής, αντί για πίνακα με δομές (όπου είναι δυνατόν), καθώς στον πίνακα δομών αποθηκεύεται ένας header για κάθε στοιχείο του. Π.χ. : Πίνακας με δομές for i=1:1000 patient(i).weight = rand; patient(i).height = rand; whos Name Size Bytes Class x 1x1000 240128 struct Δομή με πίνακες for i=1:1000 patient.weight(i) = rand; patient.height(i) = rand; whos Name Size Bytes Class x 1x1 16352 struct

Βελτιστοποίηση κώδικα 153 Αποκερματισμός μνήμης: Η μνήμη που διατίθεται στο MATLAB από το λειτουργικό σύστημα κατά τη διάρκεια της λειτουργίας του τείνει να κατακερματιστεί σε μη συνεχόμενα τμήματα. Αυτό έχει ως αποτέλεσμα, εκτός από την αύξηση του χρόνου προσπέλασης των μεταβλητών, και την αδυναμία αποθήκευσης κάποιου πίνακα, αν αυτός είναι μεγαλύτερος από το μεγαλύτερο ελεύθερο συνεχόμενο τμήμα. Ελάττωση του κατακερματισμού μπορεί να επιτευχθεί με: - Αποθήκευση πρώτα των μεγαλύτερων πινάκων και μετά των μικρότερων (που είναι και ταχύτερο). - Σύμπτυξη μνήμης (pack): Μετά την απελευθέρωση (clear) πολλών μεταβλητών, η μνήμη είναι κατακερματισμένη. Η εντολή pack ομαδοποιεί τις κατειλημμένες θέσεις και δημιουργεί μεγάλα τμήματα ελεύθερης μνήμης, με αποτέλεσμα δυνατότητα για αποθήκευση ιδιαιτέρως μεγάλου μεγέθους πινάκων (δεδομένου ότι κάθε πίνακας αποθηκεύεται υποχρεωτικά σε συνεχόμενες θέσεις) αλλά και αύξηση της ταχύτητας αποθήκευσης μεταβλητών μεγάλου μεγέθους καθώς τα ελεύθερα συνεχόμενα τμήματα ανευρίσκονται ταχύτερα. - Επανεκκίνηση του MATLAB: Σε περιβάλλον Windows, αν οι δύο παραπάνω τεχνικές δεν βοηθήσουν, ίσως απαιτηθεί επανεκκίνηση του MATLAB για καλύτερη επανακατανομή της μνήμης. Χρήση εμφωλευμένων συναρτήσεων (nested functions, 11.9), για αποφυγή εισαγωγής μεγάλων πινάκων ως ορισμάτων εισόδου σε μια συνάρτηση, αν δεν είναι αναγκαίο, ώστε να μην δημιουργούνται αντίγραφα μεταβλητών στο workspace της συνάρτησης. Στο παρακάτω παράδειγμα, η συνάρτηση findelementsgreaterthan είναι εμφωλευμένη με αποτέλεσμα να «γνωρίζει» τον πίνακα A, που ορίζεται εξωτερικά: function main A = rand(1e3); function B = findelementsgreaterthan(t) B = find(a>t); B = findelementsgreaterthan(0.5); C = findelementsgreaterthan(0.7); Οι εμφωλευμένες συναρτήσεις μπορούν να οριστούν στο εσωτερικό άλλης συνάρτησης, τελειώνουν με (και τότε κάθε άλλη συνάρτηση του ίδιου m-file πρέπει να τελειώνει επίσης με ) και το χαρακτηριστικό τους είναι ότι μοιράζονται το workspace τους με το workspace της συνάρτησης μέσα στην οποία εμφωλεύονται. Έλεγχος μνήμης: Για τον έλεγχο της αποδοτικότητας των τεχνικών εξοικονόμησης μνήμης μπορούν να χρησιμοποιηθούν οι εντολές: >> whos >> [usr, sys] = memory; usr.memusedmatlab Η whos δείχνει το μέγεθος των μεταβλητών, ενώ η memory επιστρέφει το ποσό της μνήμης που έχει δεσμευτεί από αυτές. Αυτά τα δύο δεν ταυτίζονται πάντα, όπως φαίνεται από την επόμενη περίπτωση: Κατά την αντιγραφή ενός πίνακα αντιγράφεται μόνο ο δείκτης (pointer) του πίνακα στη μνήμη. Η αντιγραφή όλου του πίνακα γίνεται μόνο αν γίνει κάποια αλλαγή σε κάποιον από τους δύο πίνακες (και γι αυτό στην περίπτωση αυτή συνιστάται οι αλλαγές να γίνονται στο σημείο του κώδικα που πριν είναι αναγκαίες και όχι νωρίτερα). Π.χ.:

154 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB N = 1e7; Δημιουργία πίνακα και έλεγχος μνήμης του MATLAB: A=rand(N,1); [usr, sys] = memory; usr.memusedmatlab ans = 646905856 Αντιγραφή του πίνακα A στον B και έλεγχος μνήμης του MATLAB: B=A; [usr, sys] = memory; usr.memusedmatlab ans = 646905856 Η απλή αντιγραφή του πίνακα A στον B δεν επηρέασε το ποσό μνήμης του MATLAB, γιατί στην πραγματικότητα δεν έγινε αντιγραφή όλου του πίνακα αλλά μόνο του pointer. Διαγραφή των μισών στοιχείων του B και έλεγχος μνήμης του MATLAB: B(1:N/2) = []; [usr, sys] = memory; usr.memusedmatlab ans = 686907392 Παρά τη διαγραφή των μισών στοιχείων του B, το ποσό μνήμης του MATLAB είναι μεγαλύτερο, γιατί τώρα έχει γίνει η αντιγραφή του (νέου) πίνακα B στη μνήμη. Χρήση αραιών πινάκων (sparse matrices, βλ. και 9.14): Όταν το πλήθος των μηδενικών στοιχείων σε έναν πίνακα είναι μεγάλο (πρακτικά άνω του 75%), γίνεται σημαντική εξοικονόμηση μνήμης όταν ο πίνακας μετατραπεί σε αραιό (sparse). Οι αραιοί πίνακες δεν είναι διαφορετικοί, απλώς αλλάζει ο τρόπος αποθήκευσής τους στη μνήμη: Συγκεκριμένα, αποθηκεύονται μόνο τα μη μηδενικά στοιχεία με τους αντίστοιχους δείκτες τους. Οι πράξεις με τους αραιούς πίνακες γίνονται όπως και με τους πλήρεις. Μετατροπή πίνακα από πλήρη σε sparse: S = sparse(x) Μετατροπή πίνακα από sparse σε πλήρη: X = full(s) Δημιουργία sparse (ίσως η μνήμη να μην επαρκεί να δημιουργηθεί πρώτα ως πλήρης): S = sparse(i,j,s,m,n), όπου i = πίνακας με τους δείκτες των γραμμών των μη μηδενικών στοιχείων (ή ο αριθμός μιας γραμμής) j = πίνακας με τους δείκτες των στηλών των μη μηδενικών στοιχείων (ή ο αριθμός μιας στήλης) s = πίνακας με τα μη μηδενικά στοιχεία (ή ένας αριθμός, αν είναι ίδιος) Για δέσμευση nzmax μη μηδενικών στοιχείων: S = sparse(i,j,s,m,n,nzmax) Το nzmax πρέπει να είναι μεγαλύτερο από το πλήθος των μη μηδενικών στοιχείων (=length(s)). Με τον τρόπο αυτό γίνεται προδέσμευση μνήμης για ταχύτερη προσθήκη επιπλέον στοιχείων αργότερα. Παράδειγμα: % Δημιουργία sparse πίνακα N 3 με Ν μη μηδενικά στοιχεία (N μονάδες στη 2 η στήλη). Μετά, προσθήκη Ν τυχαίων στοιχείων. N = 100000; tic, x = sparse(1:n,2,1,n,3); for i=1:n, x(i,3) = rand; ; toc Elapsed time is 28.259130 seconds. % Το ίδιο παράδειγμα, αφού όμως γίνει δέσμευση για 2*N στοιχεία (τα N υπάρχοντα στη 2 η στήλη, και τα N που πρόκειται να προστεθούν στην 3 η στήλη). tic, x = sparse(1:n,2,1,n,3,2*n); for i=1:n, x(i,3) = rand; ; toc Elapsed time is 6.394125 seconds.

Βελτιστοποίηση κώδικα 155 18.10 Σύστημα υποδείξεων σφαλμάτων και βελτίωσης κώδικα MATLAB Στις τελευταίες εκδόσεις του, ο Editor του MATLAB έχει ενσωματωμένο σύστημα ανάλυσης του κώδικα M-Lint που προσφέρει υποδείξεις για επισήμανση συντακτικών σφαλμάτων (errors, με κόκκινη υπογράμμιση) καθώς και για συστάσεις βελτιστοποίησης του κώδικα (warnings, με πορτοκαλί υπογράμμιση). Επίσης, ενδεικτικές γραμμές αντίστοιχων χρωμάτων υπάρχουν σε ειδική κατακόρυφη στήλη στο δεξί μέρος του κειμένου, για εύκολη μετάβαση στη θέση του σφάλματος. Η κατακόρυφη στήλη εμφανίζει τις γραμμές των υποδείξεων που αντιστοιχούν σε ολόκληρο τον κώδικα, ώστε αυτές να εμφανίζονται ακόμα κι αν η θέση της υπόδειξης δεν είναι ορατή λόγω μεγάλου μεγέθους του κώδικα. Οι προτεινόμενες υποδείξεις του MATLAB είναι πιθανόν να αποτελούν επιλογές του προγραμματιστή, και κατά συνέπεια δεν πρέπει πάντα αν λαμβάνονται υπ όψιν. Επιλογή για το ποιες υποδείξεις θα εμφανίζονται μπορεί να γίνει από το File > Preferences > M-Lint.

19 Αποσφαλμάτωση Ως αποσφαλμάτωση (debugging) εννοείται ο εντοπισμός και η αφαίρεση των σφαλμάτων (bugs) από ένα πρόγραμμα. Η συγγραφή κώδικα προγράμματος χωρίς κανένα σφάλμα είναι σχεδόν αδύνατη, ακόμα και από έμπειρους προγραμματιστές. 19.1 Είδη σφαλμάτων Τα κυριότερα είδη σφαλμάτων που μπορεί να εμφανιστούν σε ένα πρόγραμμα είναι: Συντακτικά σφάλματα: Προκύπτουν από τη λανθασμένη γραφή ή χρήση μιας εντολής ή γραμμής κώδικα. Τα σφάλματα αυτά εμποδίζουν την εκτέλεση του προγράμματος και ε- ντοπίζονται αμέσως, καθώς επισημαίνονται από το MATLAB μαζί με κάποιο επεξηγηματικό μήνυμα σφάλματος στο Command Window. Π.χ. o fprint('hello'); (fprintf, όχι fprint) o fprintf('age is %d' a); (έχει παραλειφθεί το κόμμα πριν τη μεταβλητή a) o z = -3*(x+y^(-1/3); (έχουν ανοίξει 2 παρενθέσεις, αλλά έχει κλείσει μόνο 1) Σφάλματα χρόνου εκτέλεσης (run-time errors): Προκύπτουν κατά τη διάρκεια εκτέλεσης του προγράμματος, συνήθως από κάποιες μη αναμενόμενες από τον προγραμματιστή τιμές μεταβλητών. Παραδείγματα: o Αριθμητικά σφάλματα. Π.χ.: Διαίρεση με το μηδέν: for x=-5:5, y=y+1/x; o Υπερχείλιση ορίου μεταβλητής, υπερβαίνοντας προς τα πάνω τα όρια του τύπου μιας μεταβλητής. Π.χ.: Αν a=uint8(250); b=a+50, τότε η b αντί για 300, παίρνει την τιμή 255 (δηλ. το άνω όριο των uint8). o Υπερχείλιση μνήμης (π.χ. κατά τη μη ελεγχόμενη αύξηση του μεγέθους ενός πίνακα). Λογικά σφάλματα: Όταν το πρόγραμμα δεν επιτελεί (ή, ακόμα χειρότερα, δεν επιτελεί πάντα) το σκοπό για τον οποίο σχεδιάστηκε. Παραδείγματα: o Απώλεια ακρίβειας κατά τη μετατροπή τύπου μεταβλητών ή κατά την ακέραια διαίρεση. Π.χ.: Αν a=int8(10); b=int8(4); c=a/b, τότε η c παίρνει την τιμή 3. o Είσοδος σε ατέρμονα βρόχο. Π.χ.: x=-3.5; while(x~=0), x = x + 1; ) o Λογικώς λανθασμένη χρήση εντολών. Π.χ.: if (a<3 & a>7),..., o Αλγοριθμικά σφάλματα (χρήση λανθασμένης μεθόδου για εκτέλεση μιας εργασίας). Ο όρος «bug» για τα σφάλματα προγραμματισμού (και debugging για την αποσφαλμάτωση) έγινε ευρύτερα γνωστός μετά το 1947, οπότε ένα έντομο βραχυκύκλωσε κατά τη διάρκεια δοκιμών στο Πανεπιστήμιο Harvard τον Mark II, έναν από τους πρώτους προγραμματιζόμενους υπολογιστές, κατασκευασμένο με ηλεκτρονόμους (ρελέ) και φυσική καλωδίωση. Η παραπάνω εικόνα είναι από το ημερολόγιο καταγραφής συμβάντων του υπολογιστή (http://americanhistory.si.edu/collections/object.cfm?key=35&objkey=30).

Αποσφαλμάτωση 157 19.2 Συντακτικά σφάλματα Η εκτέλεση ενός προγράμματος μέσα από το περιβάλλον του MATLAB γίνεται μέσω interpreter και όχι compiler, κάτι που σημαίνει ότι το πρόγραμμα εκτελείται γραμμή-γραμμή, χωρίς προηγούμενη ανάλυση ολόκληρου του κώδικα (και χωρίς να δημιουργηθεί εκτελέσιμο αρχείο). Αυτό έχει ως αποτέλεσμα την πιθανή εμφάνιση συντακτικού σφάλματος κατά τη διάρκεια εκτέλεσης του προγράμματος, με συνέπεια την άμεση διακοπή του. Σε περίπτωση διακοπής της εκτέλεσης του προγράμματος λόγω συντακτικού σφάλματος, το MATLAB εμφανίζει στο Command Window ένα μήνυμα σφάλματος με γραμματοσειρά κόκκινου χρώματος. Το μήνυμα αναφέρει πάντοτε (α) τη θέση του σφάλματος στον κώδικα και (β) μια συνοπτική περιγραφή του. α) Θέση του σφάλματος Σφάλμα στο πρόγραμμα: Εμφανίζεται ο αριθμός της γραμμής ή και στήλης του κώδικα όπου υπάρχει το σφάλμα, που είναι ταυτόχρονα και σύνδεσμος (link), ώστε να γίνεται άμεσα η μετάβαση στην αντίστοιχη θέση του κώδικα με κλικ του ποντικιού. Στο επόμενο παράδειγμα το σφάλμα είναι στη σύνταξη της plot, στη γραμμή 43 του myprogram: Error in ==> myprogram at 43 plot('b'); Σφάλμα σε συνάρτηση που καλείται από το πρόγραμμα: Αν το σφάλμα είναι στο εσωτερικό συνάρτησης, εμφανίζεται με link και ο αριθμός της γραμμής όπου γίνεται η κλήση της συνάρτησης. Τότε, το σφάλμα πρέπει να αναζητηθεί είτε στη συνάρτηση, είτε στο πρόγραμμα από το οποίο καλείται. Στο επόμενο παράδειγμα το σφάλμα είναι στη σύνταξη της plot, στη γραμμή 61 της myfunction, που καλείται από τη γραμμή 43 του myprogram: Error in ==> myfunction at 61 plot('b'); Error in ==> myprogram at 43 myfunction(x); Σφάλμα σε συνάρτηση του MATLAB που καλείται από το πρόγραμμα: Μερικές φορές εμφανίζεται link για ένα σημείο στο εσωτερικό μιας έτοιμης συνάρτησης του MATLAB, λόγω συντακτικού σφάλματος κατά την κλήση της. Στην περίπτωση αυτή δεν πρέπει να γίνεται μετάβαση (με κλικ του ποντικιού) στο εσωτερικό της συνάρτησης του MATLAB, καθώς το σφάλμα πρέπει να εντοπιστεί στο σημείο όπου αυτή καλείται από το δικό μας πρόγραμμα. Στο επόμενο παράδειγμα το σφάλμα εμφανίζεται στη γραμμή 51 της συνάρτησης linkaxes του MATLAB, αλλά η αιτία του πρέπει να αναζητηθεί στη γραμμή 56 όπου καλείται από το myprogram: Error in ==> linkaxes at 51 h = handle(ax); Error in ==> myprogram at 56 linkaxes(ax,'xy'); Υπάρχουν και άλλες περιπτώσεις στις οποίες το σφάλμα δεν βρίσκεται εκεί όπου εμφανίζεται. Για παράδειγμα, όταν χρησιμοποιείται μια μεταβλητή που δεν έχει οριστεί προηγουμένως (μήνυμα:??? Undefined function or variable 'x'.), το σφάλμα εμφανίζεται στη γραμμή όπου γίνεται η προσπάθεια χρήσης της μεταβλητής, ενώ το αίτιο είναι ότι η μεταβλητή δεν έχει οριστεί σε κάποιο προηγούμενο σημείο του κώδικα. β) Περιγραφή του σφάλματος

158 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Εμφανίζεται μια συνοπτική περιγραφή με επεξήγηση του σφάλματος. Η επεξήγηση μερικές φορές είναι προφανής, άλλες όμως όχι, οπότε απαιτείται εξοικείωση ώστε να μπορέσει κάποιος να κατανοήσει την αιτία του σφάλματος. Μερικές συνηθισμένες περιπτώσεις, με την πιο πιθανή αιτία τους, είναι:??? Undefined function or variable 'foo'. Πιθανή αιτία: Δεν έχει οριστεί η μεταβλητή foo ή δεν υπάρχει η συνάρτηση foo (ή υ- πάρχουν, αλλά έχουν κληθεί με λάθος όνομα).??? Undefined function or method 'myfunction' for input... Πιθανή αιτία: Δεν υπάρχει η συνάρτηση myfunction (ή υπάρχει αλλά καλείται με λάθος όνομα). Unbalanced or unexpected parenthesis or bracket. Πιθανή αιτία: Έχει ξεχαστεί να κλείσει κάποια παρένθεση ή αγκύλη. The expression to the left of the equals sign is not a valid target for an assignment. Πιθανή αιτία: Έχει τοποθετηθεί μονό «=» αντί διπλό «==» σε συνθήκη. Not enough input/output arguments. Πιθανή αιτία: Κατά την κλήση της συνάρτησης τα ορίσματα εισόδου/εξόδου είναι λιγότερα από αυτά που υπάρχουν στον ορισμό της. At least one END is missing: the statement may begin here. Πιθανή αιτία: Κάποιο if, for, while κλπ δεν «κλείνει» με. Μερικές φορές χρησιμοποιείται από λάθος «else if» (2 λέξεις, αντί για «elseif», 1 λέξη), με αποτέλεσμα να δημιουργείται ένα νέο if που απαιτεί ένα ακόμη. Function definitions are not permitted in this context. ή...are not permitted at the prompt or in scripts. Πιθανή αιτία 1: Έχει γίνει ορισμός υποσυνάρτησης σε script (δηλ. σε πρόγραμμα που δεν είναι function). Διόρθωση: γράψτε ως πρώτη γραμμή του προγράμματος «function name», όπου name ένα οποιοδήποτε όνομα συνάρτησης. Πιθανή αιτία 2: Έχει γίνει ορισμός υποσυνάρτησης σε σημείο που δεν επιτρέπεται, π.χ. μέσα σε for (ή έχει ξεχαστεί να «κλείσει» το for με, οπότε το MATLAB «νομίζει» ότι η συνάρτηση ορίζεται μέσα στο for). Unexpected MATLAB expression. Πρόκειται για κάπως γενικό μήνυμα σφάλματος, που συχνά μπορεί να οφείλεται στο ότι δεν έχουν συνταχθεί σωστά τα ορίσματα μιας συνάρτησης (για παράδειγμα, έχει ξεχαστεί το κόμμα (,) ανάμεσα στα ορίσματα εισόδου, όπως στο fprintf('%d' x)) Εκτός από τα παραπάνω γενικά μηνύματα, υπάρχουν και ειδικότερα μηνύματα λόγω μη ορθής κλήσης συγκεκριμένων συναρτήσεων. Δύο παραδείγματα:??? Error using ==> plot Vectors must be the same lengths. Μη σωστή κλήση της plot. Πιθανή αιτία: Οι πίνακες με τις τιμές των x και y δεν έχουν ίδιο πλήθος τιμών.??? Error using ==> load Unable to read file filename.ext: No such file or directory. Μη σωστή κλήση της load. Πιθανή αιτία: Δεν υπάρχει το αρχείο filename.ext στο σωστό φάκελο.

Αποσφαλμάτωση 159 19.3 Εύρεση του σφάλματος: Διακοπή προγράμματος και απεικόνιση μεταβλητών Ο εντοπισμός των σφαλμάτων σε ένα πρόγραμμα γίνεται συνήθως με την προσωρινή διακοπή του προγράμματος σε διάφορα σημεία και την απεικόνιση των τιμών διαφόρων μεταβλητών, ώστε να διαπιστωθεί αν είναι οι αναμενόμενες. Ο «κλασσικός» τρόπος για εύρεση λαθών είναι: Εντολή pause σε κατάλληλα σημεία του προγράμματος: Η pause χωρίς παράμετρο οδηγεί σε προσωρινή διακοπή της ροής του προγράμματος, έως ότου πατηθεί κάποιο πλήκτρο από το πληκτρολόγιο. Εντολές απεικόνισης των τιμών των μεταβλητών: Σε κατάλληλα σημεία του προγράμματος τοποθετούνται εμβόλιμες εντολές απεικόνισης διαφόρων μεταβλητών (π.χ. disp ή παράλειψη του «;» από εντολές ανάθεσης) με σκοπό τον έλεγχο των τιμών τους. 19.4 Εύρεση του σφάλματος: Η λειτουργία αποσφαλμάτωσης του MATLAB Εκτός από τον παραπάνω «κλασσικό» τρόπο, το περιβάλλον MATLAB διαθέτει ενσωματωμένη λειτουργία αποσφαλμάτωσης, που κάνει λειτουργικότερο και πολύ αποτελεσματικότερο τον έλεγχο της ροής του προγράμματος για εντοπισμό σφαλμάτων. Τα χαρακτηριστικά του συστήματος αποσφαλμάτωσης του MATLAB είναι: Προσωρινή διακοπή της ροής του προγράμματος και είσοδος σε κατάσταση αποσφαλμάτωσης. Βηματική εκτέλεση των εντολών του προγράμματος. Πλήρης έλεγχο του περιβάλλοντος, του πληκτρολογίου και των μεταβλητών κατά τη διάρκεια της κατάστασης αποσφαλμάτωσης. Προσωρινή διακοπή της ροής του προγράμματος Η προσωρινή διακοπή της ροής του προγράμματος γίνεται είτε με την προ-τοποθέτηση ε- νός ή περισσοτέρων «σημείων διακοπής» (breakpoints) στις επιθυμητές γραμμές του κώδικα, είτε μέσω κατάλληλης εντολής: Τοποθέτηση σημείων διακοπής (breakpoints): Πριν εκτελεστεί το πρόγραμμα, τοποθετούνται σημεία διακοπής, με τη σχετική επιλογή του μενού Debug, ή με το πλήκτρο F12 στο πληκτρολόγιο, ή με κλικ του ποντικιού στο αριστερό μέρος των επιθυμητών γραμμών διακοπής. Τότε, τα breakpoints επισημαίνονται με κόκκινες κουκίδες. Διακοπή με την εντολή dbstop: dbstop in mfile, όπου mfile ένα m-file του MATLAB. Η εντολή dbstop in mfile μπορεί να δοθεί στο Command Window ή ως εντολή του προγράμματος. Τότε, μόλις κληθεί το mfile από το πρόγραμμα, το MATLAB εισέρχεται σε κατάσταση αποσφαλμάτωσης. dbstop in nonmfile, όπου nonmfile το όνομα π.χ. μιας υποσυνάρτησης. Η εντολή dbstop in nonmfile πρέπει να δοθεί ως εντολή του προγράμματος (της κύριας συνάρτησης). Τότε, μόλις κληθεί η υποσυνάρτηση nonmfile από το πρόγραμμα, το MATLAB εισέρχεται σε κατάσταση αποσφαλμάτωσης. dbstop if error. Η εντολή dbstop if error μπορεί να δοθεί στο Command Window ή ως εντολή του προγράμματος. Τότε, μόλις συμβεί σφάλμα ικανό να τερματίσει την εκτέλεση του προγράμματος (run-time error), το MATLAB εισέρχεται σε κατάσταση αποσφαλμάτωσης.

160 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Είσοδος σε κατάσταση αποσφαλμάτωσης (debug mode) Στη συνέχεια, όταν γίνει η εκτέλεση του προγράμματος (Debug Run ή F5), η ροή του θα διακοπεί προσωρινά στη γραμμή εντολής που περιέχει το σημείο διακοπής (χωρίς αυτή να εκτελεστεί). Η γραμμή στην οποία έχει γίνει η διακοπή επισημαίνεται με ένα πράσινο βέλος στο αριστερό μέρος (βλέπε σχήμα). Το MATLAB μπαίνει τότε σε κατάσταση αποσφαλμάτωσης (debug mode), και στο Command Window εμφανίζεται το σύμβολο "K>>", που δηλώνει ο χρήστης έχει τον έλεγχο του πληκτρολογίου (keyboard) και μπορεί να εκτελέσει οποιαδήποτε εντολή. Επίσης, υπάρχουν οι ακόλουθες επιλογές στο μενού Debug (όπως φαίνεται στο προηγούμενο σχήμα): Βηματική εκτέλεση της ροής του προγράμματος κατά το debugging Συνέχεια (Debug Continue ή F5): Το πρόγραμμα συνεχίζει την εκτέλεσή του μέχρι το επόμενο σημείο διακοπής (ή μέχρι το τέλος, αν δεν υπάρχει σημείο διακοπής). Βηματική εκτέλεση (Debug Step ή F10): Το πρόγραμμα εκτελείται γραμμή γραμμή. Βηματική εκτέλεση μέσα στις συναρτήσεις (Debug Step In ή F11): Το πρόγραμμα ε- κτελείται γραμμή γραμμή, μπαίνοντας και «μέσα» στις συναρτήσεις ώστε να εκτελεστούν κι αυτές γραμμή-γραμμή. Η άμεση έξοδος από μια συνάρτηση, πριν από το τέλος της, γίνεται με Debug Step Out ή Shift+F11. Έξοδος από τη λειτουργία αποσφαλμάτωσης και διακοπή εκτέλεσης του προγράμματος: Shift+F5 (ή δίνεται η εντολή dbquit). 19.5 Σύστημα υποδείξεων σφαλμάτων και βελτίωσης κώδικα MATLAB Στις τελευταίες εκδόσεις του, ο Editor του MATLAB έχει ενσωματωμένο σύστημα ανάλυσης του κώδικα M-Lint που προσφέρει υποδείξεις για επισήμανση συντακτικών σφαλμάτων (errors, με κόκκινη υπογράμμιση) καθώς και για συστάσεις βελτιστοποίησης του κώδικα (warnings, με πορτοκαλί υπογράμμιση). Επίσης, ενδεικτικές γραμμές αντίστοιχων χρωμάτων υπάρχουν σε ειδική κατακόρυφη στήλη στο δεξί μέρος του κειμένου, για εύκολη μετάβαση στη θέση του σφάλματος. Η κατακόρυφη στήλη εμφανίζει τις γραμμές των υποδείξεων που αντιστοιχούν σε ολόκληρο τον κώδικα, ώστε αυτές να εμφανίζονται ακόμα κι αν η θέση της υπόδειξης δεν είναι ορατή λόγω μεγάλου μεγέθους του κώδικα. Οι προτεινόμενες υποδείξεις του MATLAB είναι πιθανόν να αποτελούν επιλογές του προγραμματιστή, και κατά συνέπεια δεν πρέπει πάντα αν λαμβάνονται υπ όψιν. Επιλογή για το ποιες υποδείξεις θα εμφανίζονται μπορεί να γίνει από το File > Preferences > M-Lint.