ΕΡΓΑΣΤΗΡΙΟ ΣΥΣΤΗΜΑΤΩΝ ΑΥΤΟΜΑΤΟΥ ΕΛΕΓΧΟΥ ΕΙΣΑΓΩΓΗ ΣΤΟ MATLAB 1. Εισαγωγή Το λογισμικό MATLAB είναι ένα προγραμματιστικό περιβάλλον υψηλού επιπέδου το οποίο περιλαμβάνει μια πληθώρα εργαλείων που βρίσκουν εφαρμογή σε πολλές περιοχές του μηχανικού. Το χαρακτηριστικό του MATLAB είναι η ύπαρξη πολλών συναρτήσεων, οργανωμένων σε μεγάλες βιβλιοθήκες (toolboxes) που απλοποιούν σημαντικά την επίλυση τεχνικών προβλημάτων. Το MATLAB μπορεί να χρησιμοποιηθεί σε πολλές εφαρμογές, όπως στην επίλυση μαθηματικών προβλημάτων, στην επεξεργασία σημάτων, εικόνας, στην προσομοίωση κυκλωμάτων ισχύος ή τηλεπικοινωνιακών συστημάτων καθώς και στην ανάλυση και στον σχεδιασμό συστημάτων ελέγχου. Για μια πλήρη πληροφόρηση αναφορικά με τις δυνατότητες του MATLAB μπορείτε να ανατρέξετε στο URL: http://www.mathworks.com/products/matlab, ενώ στο URL http://www.mathworks.com/matlabcentral παρέχεται ένα πλήθος από παραδείγματα. Προτείνεται επίσης η ανάγνωση του http://www.mathworks.com/help/techdoc/matlab_product_page2.html. Στο παρόν εγχειρίδιο θα καλυφθούν μόνο οι βασικές εντολές του MATLAB που θα πρέπει να γνωρίζουν οι φοιτητές για την εκτέλεση των εργαστηριακών ασκήσεων. Μετά την εκτέλεση του MATLAB, εμφανίζεται το παρακάτω βασικό παράθυρο χρήσης του MATLAB. Το παράθυρο αυτό, μπορεί να διαμορφωθεί ανάλογα με τις εκάστοτε απαιτήσεις του χρήστη και στη βασική του μορφή περιέχει τα βασικά μενού, το παράθυρο εισαγωγής εντολών (Command Window), τον τρέχοντα φάκελο με τα προγράμματα του χρήστη (Current Folder), τις τιμές των μεταβλητών που βρίσκονται στη μνήμη του MATLAB (Workspace) και τέλος τις εντολές που έχουν εκτελεστεί (Command History). 1
Στα πλαίσια του εργαστηρίου Συστημάτων Αυτομάτου Ελέγχου, θα χρησιμοποιήσουμε το βασικό πακέτο εντολών που εμπεριέχονται στο Control System Toolbox. Όλα τα πακέτα των εγκατεστημένων προγραμμάτων του MATLAB, μπορεί να τα δει ο χρήστης με την εντολή HELP, στο βασικό παράθυρο εισαγωγής εντολών. Για επιπλέον πληροφορίες για τις εντολές που περιέχει ένα toolbox, ο χρήστης θα πρέπει να επιλέξει help <toolboxname>.για παράδειγμα, η χρήση της εντολής >>help matfun θα δώσει το παρακάτω αποτέλεσμα: >> help matfun Matrix functions - numerical linear algebra. Matrix analysis. norm - Matrix or vector norm. normest - Estimate the matrix 2-norm. rank - Matrix rank. det - Determinant. trace - Sum of diagonal elements. null - Null space. orth - Orthogonalization. rref - Reduced row echelon form. subspace - Angle between two subspaces. Linear equations. / and / - Linear equation solution; use "help slash". linsolve - Linear equation solution with extra control. inv - Matrix inverse. rcond - LAPACK reciprocal condition estimator cond - Condition number with respect to inversion. condest - 1-norm condition number estimate. normest1-1-norm estimate. chol - Cholesky factorization. cholinc - Incomplete Cholesky factorization. ldl - Block LDL' factorization. lu - LU factorization. luinc - Incomplete LU factorization. qr - Orthogonal-triangular decomposition. lsqnonneg - Linear least squares with nonnegativity constraints. pinv - Pseudoinverse. lscov - Least squares with known covariance. Eigenvalues and singular values. eig - Eigenvalues and eigenvectors. svd - Singular value decomposition. gsvd - Generalized singular value decomposition. eigs - A few eigenvalues. svds - A few singular values. poly - Characteristic polynomial. polyeig - Polynomial eigenvalue problem. condeig - Condition number with respect to eigenvalues. hess - Hessenberg form. schur - Schur decomposition. qz - QZ factorization for generalized eigenvalues. ordschur - Reordering of eigenvalues in Schur decomposition. ordqz - Reordering of eigenvalues in QZ factorization. ordeig - Eigenvalues of quasitriangular matrices. Matrix functions. expm - Matrix exponential. logm - Matrix logarithm. sqrtm - Matrix square root. funm - Evaluate general matrix function. 2
Factorization utilities qrdelete - Delete a column or row from QR factorization. qrinsert - Insert a column or row into QR factorization. rsf2csf - Real block diagonal form to complex diagonal form. cdf2rdf - Complex diagonal form to real block diagonal form. balance - Diagonal scaling to improve eigenvalue accuracy. planerot - Givens plane rotation. cholupdate - rank 1 update to Cholesky factorization. qrupdate - rank 1 update to QR factorization. που είναι οι βασικές εντολές που περιέχονται στο πακέτο matfun. Η εντολή >>help <command name>, μας δίνει πληροφορίες για την λειτουργία της εντολής, καθώς επίσης και τον τρόπο σύνταξης αυτής. Για παράδειγμα η εντολή >>help rank (υπολογισμός τάξης πίνακα) θα δείξει: >> help rank RANK Matrix rank. RANK(A) provides an estimate of the number of linearly indepent rows or columns of a matrix A. RANK(A,tol) is the number of singular values of A that are larger than tol. RANK(A) uses the default tol = max(size(a)) * eps(norm(a)). Class support for input A: float: double, single Overloaded methods: gf/rank rptcp/rank Reference page in Help browser doc rank Για επιπλέον τεκμηρίωση των διαθέσιμων toolbox και συναρτήσεων, ο χρήστης μπορεί να επιλέξει από το βασικό μενού του MATLAB το μενού Help και στη συνέχεια Product Help. Στο παράθυρο που εμφανίζεται υπάρχει πεδίο αναζήτησης ενώ στην καρτέλα Contents βρίσκονται σε μορφή δένδρου όλα τα toolbox του MATLAB. Για κάθε toolbox υπάρχει η αντίστοιχη τεκμηρίωση, παραδείγματα, Demos, καθώς και η πλήρης λίστα των συναρτήσεων που αυτό περιέχει. Παρακάτω φαίνεται ένα τμήμα της λίστας των συναρτήσεων του Control System Toolbox. 3
2. Μεταβλητές στο MALAB Το MATLAB, όπως και όλες οι γλώσσες προγραμματισμού, περιλαμβάνει μεταβλητές που μπορούν να χρησιμοποιούνται σε αριθμητικές ή λογικές εκφράσεις. Οι κυριότεροι τύποι των μεταβλητών είναι οι αριθμοί διπλής ακρίβειας (double), τα αλφαριθμητικά (char) και λογικές μεταβλητές (logical). Οι μεταβλητές δεν χρειάζεται να οριστούν προτού χρησιμοποιηθούν. Τα ονόματα τους πρέπει να ξεκινούν από γράμμα και να συνεχίζουν με αριθμούς, γράμματα ή κάτω παύλες (underscores). Θα πρέπει να σημειωθεί ότι τα ονόματα των μεταβλητών είναι case sensitive δηλαδή το κεφαλαίο Α αναπαριστά άλλον μεταβλητή από το μικρό α. Για την ανάθεση τιμής σε μια μεταβλητή χρησιμοποιείται ο τελεστής =. Για παράδειγμα, η εντολή >>a=1 ορίζει την μεταβλητή a ως αριθμό διπλής ακρίβειας (double) και της δίνει την τιμή 1. Η εντολή >>b=3+5j ορίζει το b ως τον μιγαδικό αριθμό 3+5j. Αντίθετα η εντολή >>str='abc123' ορίζει την μεταβλητή str ως αλφαριθμητική (char) και της δίνει την τιμή abc123. Όλα τα αλφαριθμητικά στο MATLAB πρέπει να περικλείονται με μονά εισαγωγικά. Οι λογικές μεταβλητές μπορούν να λάβουν μόνο τις τιμές true (αληθές) ή false (ψευδές). Η εντολή >>flag=true ορίζει τη λογική μεταβλητή flag και της δίνει την τιμή true. Όλες οι μεταβλητές που βρίσκονται στη μνήμη του MATLAB περιλαμβάνονται στο Workspace. Εκεί ο χρήστης μπορεί να λάβει πληροφορίες για κάθε μεταβλητή ή και να επεξεργαστεί την τιμή της. Κάποιες πληροφορίες που περιέχονται στο Workspace είναι ο τύπος της κάθε μεταβλητής, η διάστασή της (στην περίπτωση που η μεταβλητή είναι πίνακας ή διάνυσμα), το μέγιστο και το ελάχιστο στοιχείο της κτλ. Για τον καθαρισμό του Workspace και τη διαγραφή όλων των μεταβλητών που υπάρχουν στη μνήμη του MATLAB μπορεί να χρησιμοποιηθεί η εντολή clear. Για τη διαγραφή μιας συγκεκριμένης μεταβλητής ο χρήστης μπορεί να πληκτρολογήσει clear <ονομα_μεταβλητης>. Προφανώς με την επανεκκίνηση του MATLAB όλες οι μεταβλητές του Workspace σβήνονται. 3. Τρόποι λειτουργίας του MALAB Το MATLAB μπορεί να χρησιμοποιηθεί σε 'interactive' ή σε 'batch' τρόπο λειτουργίας. Στον πρώτο τρόπο λειτουργίας, ο χρήστης γράφει εντολές στο παράθυρο εντολών του MATLAB, δηλαδή στο Command Window και εκτελούνται άμεσα μόλις πατηθεί το πλήκτρο Enter. Στον δεύτερο τρόπο ο χρήστης γράφει ένα πρόγραμμα (m file) και οι εντολές εκτελούνται πολλές μαζί. Για παράδειγμα η εντολή >>a=2.25 εκτελούμενη στο παράθυρο εντολών, θα έχει το εξής αποτέλεσμα: >> a=2.25 a = 2.2500 4
Να σημειωθεί ότι η χρήση του σημείου ζεύξης ' ; ' στο τέλος κάθε εντολής αποκρύπτει τα αποτελέσματα εκτέλεσης της από την εμφάνιση τους στην οθόνη (παρότι η εντολή εκτελείται). Έτσι η εντολή >>a=2.25; θα έδινε ως αποτέλεσμα: >> a=2.25; >> Παρατηρούμε ότι σε αυτή την περίπτωση η τιμή που καταχωρήθηκε στην μεταλβητή a δεν εμφανίζεται εκ νέου στην οθόνη. Ένας εύκολος λοιπόν τρόπος για την εκτύπωση της τιμής μιας μεταβλητής στο Command Window είναι η εκτέλεση του ονόματος της μεταβλητής. Για παράδειγμα πληκτρολογώντας a και πατώντας Enter παίρνουμε την τιμή του a: >> a a = 2.2500 Η χρήση παρενθέσεων σε σύνθετους τύπους ακολουθεί την ίδια τακτική με τις γλώσσες προγραμματισμού. Για παράδειγμα η εντολή (2*(3+a)+8)/a πολλαπλασιάζει την ποσότητα 3+a επί 2, προσθέτει 8 και τέλος διαιρεί δια a. Το αποτέλεσμα καταχωρείται σε μια νέα μεταβλητή b: >> b=(2*(3+a)+8)/a b = 8.2222 Στον batch τρόπο λειτουργίας του, ο χρήστης γράφει ουσιαστικά ένα πρόγραμμα σε ένα m-αρχείο. Για τη δημιουργία ενός τέτοιου αρχείου ο χρήστης πρέπει να επιλέξει από το κεντρικό μενού File και στη συνέχεια New και Script, όπως φαίνεται και στο παρακάτω σχήμα: 5
Στη συνέχεια, θα εμφανιστεί το παρακάτω παράθυρο, που στην ουσία αποτελεί τον editor του MATLAB, στον οποίο μπορούμε να γράφουμε ολοκληρωμένα προγράμματα. Για την εκτέλεση των προγραμμάτων δεν χρειάζεται κάποια λειτουργία compile όπως σε άλλες γλώσσες προγραμματισμού. Το μόνο που χρειάζεται είναι το απλό πάτημα του κουμπιού Run ή η την επιλογή των εντολών που ο χρήστης επιθυμεί να εκτελέσει και το πάτημα του πλήκτρου F9 (Αντιστοιχεί στην επιλογή του μενού Text > Evaluate Selection). Προσοχή θα πρέπει να δοθεί στο γεγονός ότι όταν ο χρήστης εκτελεί ένα αρχείο με το κουμπί Run, το MATLAB θα πρέπει να γνωρίζει από πριν την τοποθεσία του αρχείου που δημιουργεί ο χρήστης. Επομένως σε αυτή την περίπτωση ο χρήστης θα πρέπει να σώσει το αρχείο μέσα στο Current Folder του MATLAB. Ένας εναλλακτικός τρόπος για την εκτέλεση ενός αρχείου είναι ο χρήστης να γράψει στο Command Window το όνομα του αρχείου και να πατήσει Enter. 4. Διανύσματα στο MALAB Για τον ορισμό ενός διανύσματος v = (1 2 3 4 5) στο MATLAB χρησιμοποιούμε την παρακάτω εντολή, με το διάνυσμα δοσμένο μέσα σε αγκύλες: >> v=[1,2,3,4,5] v = 1 2 3 4 5 6
ή εναλλακτικά >> v=[1 2 3 4 5] v = 1 2 3 4 5 Για να έχουμε το διάνυσμα γραμμένο κατά στήλες, μπορούμε να χρησιμοποιήσουμε το ανάστροφο τελεστή ( )' και έτσι έχουμε: >> v' ans = 1 2 3 4 5 Για να πάρουμε ένα στοιχείο του διανύσματος γράφουμε v(index) όπου index ο δείκτης του στοιχείου. Το πρώτο στοιχείο κάθε διανύσματος έχει δείκτη 1. Επομένως η εντολή v(1) επιστρέφει 1, όπως φαίνεται παρακάτω: >> v(1) ans = 1 Για να διαλέξουμε, συγκεκριμένα μέρη από το διάνυσμα, χρησιμοποιούμε την άνω κάτω τελεία, με την παρακάτω σύνταξη. Για παράδειγμα, ας θεωρήσουμε ότι θέλουμε να πάρουμε από το διάνυσμα v, μόνο τα στοιχεία από την 3 μέχρι και την 5 στήλη και να τα αποδώσουμε σε ένα άλλο διάνυσμα m. Για τον σκοπό αυτό η εντολή που θα χρησιμοποιηθεί θα είναι η: >> m=v(3:5) m = 3 4 5 Στην περίπτωση που θέλαμε τα στοιχεία του διανύσματος v ανά 2, θα χρησιμοποιούσαμε την παρακάτω εντολή >>v(1:2:5) ans = 1 3 5 7
Για να λάβουμε το τελευταίο στοιχείο του διανύσματος, χρησιμοποιούμε τη δεσμευμένη λέξη : >>v() ans = 5 5. Πίνακες στο MALAB Για να ορίσουμε έναν πίνακα, θα πρέπει απλώς στον προηγούμενο ορισμό διανυσμάτων, να προσθέσουμε παραπάνω διαστάσεις. Οι επιπλέον διαστάσεις προστίθενται με το ερωτηματικό ';'. Για παράδειγμα η παρακάτω εντολή ορίζει έναν πίνακα A διαστάσεων τρία επί τρία: >> A=[1 2 3; 2 4 5;6 7 8] A = 1 2 3 2 4 5 6 7 8 Επίσης, μπορούμε να ορίσουμε έναν πίνακα στήλη με στήλη ( ο προηγούμενος ορισμός ήταν σειρά σειρά), όπως για παράδειγμα: >> B=[[1 2 3]' [2 4 5]' [6 7 8]'] B = 1 2 6 2 4 7 3 5 8 Ο ανάστροφος ενός πίνακα Α δίνεται από την εντολή Α'. Για τον προηγούμενο πίνακα Α η εντολή αυτή θα δώσει: >> A' ans = 1 2 6 2 4 7 3 5 8 Για να επιλέξουμε έναν υπό πίνακα συμβολισμό ':' ως εξής: από έναν πίνακα, χρησιμοποιούμε και πάλι τον 8
>> A(1:3,2:3) ans = 2 3 4 5 7 8 Που αντιστοιχεί στις σειρές με δείκτη ένα έως τρία και στις στήλες με δείκτη δύο έως τρία του πίνακα Α. Επιπλέον για να πάρουμε ένα μεμονωμένο στοιχείο από έναν πίνακα χρησιμοποιούμε την παρακάτω εντολή: >> A(2,3) ans = 5 Με την ίδια λογική, για να πάρουμε την πρώτη στήλη του πίνακα Α χρησιμοποιούμε την εντολή >> A(:,1) ans = 1 2 6 ενώ για την πρώτη σειρά την εντολή >> A(1,:) ans = 1 2 3 Εκτός από τους ορισμούς πινάκων, που μπορεί να προβεί ο χρήστης, το MATLAB, έχει έτοιμες εντολές για την δημιουργία συνηθισμένων πινάκων όπως είναι οι παρακάτω: eye(p) δημιουργεί έναν p x p μοναδιαίο πίνακα zeros(p) δημιουργεί έναν p x p μηδενικό πίνακα ones(p) δημιουργεί έναν p x p πίνακα με άσσους rand(p) δημιουργεί έναν p x p πίνακα με τυχαία στοιχεία στο διάστημα (0,1). Τα στοιχεία αυτά ακολουθούν ομοιόμορφη κατανομή. Όλες οι παραπάνω εντολές μπορούν να δημιουργήσουν μη τετραγωνικούς πίνακες, αν ο χρήστης δώσει δύο ορίσματα αντί για ένα. Για παράδειγμα η εντολή zeros(5,1) δημιουργεί ένα διάνυσμα 1 επί 5, με μηδενικά στοιχεία. Κάποιες επιπλέον χρήσιμες εντολές που μπορούν να εφαρμοστούν σε πίνακες ή διανύσματα είναι 9
οι εξής: min(a) Το ελάχιστο στοιχείο του Α max(a) Το μέγιστο στοιχείο του Α size(a) Οι διαστάσεις του Α (επιστρέφει ένα διάνυσμα δύο στοιχείων με τον αριθμό των γραμμων και τον αριθμό των στηλών του Α) length(a) Το μήκος του διανύσματος Α. Ισοδυναμεί με την εντολή max(size(a)) 6. Οι τελεστές του MATLAB Σε αυτή την ενότητα παρουσιάζονται συνοπτικά οι βασικοί τελεστές του MATLAB. Οι τελεστές χωρίζονται σε αριθμητικούς, συσχετιστικούς και λογικούς. Οι πρώτοι υλοποιούν τις απλές αριθμητικές πράξεις, όπως η πρόσθεση και η αφαίρεση, οι δεύτεροι συγκρίσεις και οι τρίτοι λογικές πράξεις. Αριθμητικοί + Πρόσθεση - Αφαίρεση * Πολλαπλασιασμός / Διαίρεση \ Αριστερή Διαίρεση (χρησιμοποιείται σε πίνακες) ^ Δύναμη ' Ανάστροφος Πίνακας. Τελεστής στοιχείο επί στοιχείο Συσχετιστικοί < Μικρότερο > Μεγαλύτερο <= Μικρότερο ή Ίσο >= Μεγαλύτερο ή Ίσο == Ίσο ~= Διάφορο 10
Λογικοί & AND OR ~ Συμπλήρωμα xor( ) && XOR Βαθμωτό AND Βαθμωτό OR Οι τελεστές του MATLAB μπορούν να εφαρμοστούν σε βαθμωτά, διανυσματικά μεγέθη ή πίνακες. Στις περιπτώσεις των διανυσμάτων και των πινάκων τα αντίστοιχα μεγέθη πρέπει να συμφωνούν. Εξαιρείται η περίπτωση πράξης διανύσματος ή πίνακα με ένα βαθμωτό στοιχείο. Τότε το MATLAB εκτελεί την πράξη σε κάθε ένα στοιχείο του πίνακα. Για παράδειγμα η εντολή [1 2 3] + 1 επιστρέφει >> [1 2 3] + 1 ans = 2 3 4 οπότε παρατηρούμε ότι ισοδυναμεί με την εντολή [1 2 3] + ones(1,3). Παρόμοια ισχύουν και για τους συσχετιστικούς και τους λογικούς τελεστές. Αντίθετα, αν προσπαθήσουμε να προσθέσουμε δύο πίνακες ή διανύσματα διαφορετικών διαστάσεων παίρνουμε το αντίστοιχο σφάλμα. >> [1 2 3] + [1 2]??? Error using ==> plus Matrix dimensions must agree. Κάποιες πράξεις όπως ο πολλαπλασιασμός και η διαίρεση δεν ορίζονται στους πίνακες ως στοιχείο επί στοιχείο. Σε περίπτωση που επιθυμούμε η αντίστοιχη πράξη να γίνει στοιχείο επί στοιχείο, τοποθετούμε μπροστά τον τελεστή στοιχείο επι στοιχείο '.' Τα παρακάτω παραδείγματα κάνουν εμφανή τη χρήση του: >> A=[1 3 5; -2 4 6; -1 8 7] A = 1 3 5-2 4 6-1 8 7 >> B=A^2 B = -10 55 58-16 58 56-24 85 92 >> C=A.^2 11
C = 1 9 25 4 16 36 1 64 49 Ο πίνακας Β ισούται με το τετράγωνο του Α, δηλαδή με Α*Α. Αντιθέτως ο πίνακας C περιλαμβάνει το τετράγωνο του κάθε στοιχείου του πίνακα Α επειδή η πράξη γίνεται στοιχείο επί στοιχείο. Παρόμοιο αποτέλεσμα θα είχαμε πάρει αν ορίζαμε C=A.* A. Στο δεύτερο παράδειγμα ορίζονται δύο διανύσματα τα a και b. Ο πολλαπλασιασμός a*b δεν μπορεί να επιτευχθεί επειδή οι διαστάσεις τους δεν είναι κατάλληλες. Αντίθετα, ο πολλαπλασιασμός στοιχείου επί στοιχείου a.*b δίνει ένα έγκυρο αποτέλεσμα. >> a=[10 11 12] a = 10 11 12 >> b=[1 2 4] b = 1 2 4 >> a*b??? Error using ==> mtimes Inner matrix dimensions must agree. >> a.*b ans = 10 22 48 Οι συσχετιστικοί τελεστές μπορούν να εφαρμοστούν σε βαθμωτά μεγέθη, διανύσματα ή πίνακες και επιστρέφουν πάντα μία λογική μεταβλητή αντίστοιχου μεγέθους. Στο παρακάτω παράδειγμα το κάθε στοιχείο του c είναι 1 (true) αν το αντίστοιχο στοιχείο του a είναι μικρότερο του b. >> a=[5 25 105] a = 5 25 105 >> b=[10 5 1] b = 10 5 1 >> c=a<b c = 1 0 0 12
7. Χρήσιμες Συναρτήσεις για Αριθμητικούς Υπολογισμούς Το MATLAB έχει σχεδιαστεί για να εκτελεί με πολύ μεγάλη άνεση αριθμητικούς υπολογισμούς, ιδιαίτερα με πίνακες και διανύσματα. Κάποιες χρήσιμες συναρτήσεις είναι οι εξής: Συνάρτηση inv(a) det(a) diag(a) [v,d]=eig(a) sin(x) cos(x) tan(x) asin(x) acos(x) atan(x) atan2(y,x) sqrt(x) Περιγραφή Αντίστροφος Πίνακα Ορίζουσα Πίνακα Διαγώνιος Πίνακα Ιδιοτιμές και Ιδιοδιανύσματα Ημίτονο Συνημίτονο Εφαπτομένη Αντίστροφο Ημίτονο Αντίστροφο Συνημίτονο Αντίστροφη Εφαπτομένη Αντίστροφη Εφαπτομένη που επιστρέφει τη γωνία και στα τέσσερα τεταρτημόρια Τετραγωνική Ρίζα log10(x) Λογάριθμος με βάση το 10 log(x) exp(x) abs(x) angle(x) Λογάριθμος με βάση το e Εκθετική συνάρτηση Απόλυτη Τιμή Μέτρο μιγαδικού αριθμού Γωνία μιγαδικού αριθμού floor(x) Στρογγυλοποίηση του x προς τα κάτω ( floor(3.9)= 3 ) ceil(x) Στρογγυλοποίηση του x προς τα πάνω ( ceil(3.1)= 4 ) round(x) mod(a,b) [Tout,Yout] = ode45(odefun,tspan,y0) x = fsolve(fun,x0) Στρογγυλοποίηση του x (round(3.1)=3, round(3.9)=4, round(3.5)=4 ) Το υπόλοιπο της ακέραιας διαίρεσης του α δια του b (modulus). Επίλυση συστήματος (μη γραμμικών) διαφορικών εξισώσεων με τη μέθοδο Runge-Kutta. Το σύστημα πρέπει να είναι γραμμένο στη μορφή ẏ=f ( y,u,t), και δίνεται στον handler odefun. Yout πίνακας του οποίου κάθε στήλη του - Yout(:,i) - αντιστοιχεί στο διάνυσμα y τη χρονική στιγμή Tout(i), tspan διάνυσμα που περιέχει την αρχική και την τελική τιμή του χρόνου t στον οποίον λύνουμε το σύστημα και y0 το διάνυσμα των αρχικών συνθηκών του y. Επίλυση συστήματος μη γραμμικών εξισώσεων της μορφής f(x)=0 (όπου το x είναι γενικά διάνυσμα). Η λύση που 13
επιστρέφεται είναι πάντα εκείνη που βρίσκεται πιο κοντά στο x0. Θα πρέπει να σημειωθεί ότι οι περισσότερες από τις παραπάνω συναρτήσεις μπορούν να πάρουν ως όρισμα τόσο βαθμωτούς αριθμούς όσο και διανύσματα ή πίνακες. Στις δύο τελευταίες περιπτώσεις οι συναρτήσεις δρουν σε κάθε στοιχείο ξεχωριστά και επιστρέφουν διάνυσμα ή πίνακα ίδιας μορφής με τον εισαγόμενο. Για παράδειγμα, ο παρακάτω κώδικας υπολογίζει το συνημίτονο ενός διανύσματος δέκα τυχαίων γωνιών από 0 έως 2π. Στη συνέχεια υπολογίζεται η απόλυτη τιμή τους. >> theta=2*pi*rand(1,10) theta = Columns 1 through 5 4.1201 0.2244 5.3352 5.8685 4.2646 Columns 6 through 10 4.7610 4.6692 2.4644 4.1185 1.0756 >> s=sin(theta) s = Columns 1 through 5-0.8297 0.2225-0.8122-0.4029-0.9014 Columns 6 through 10-0.9988-0.9991 0.6266-0.8288 0.8799 >> a=abs(s) a = Columns 1 through 5 0.8297 0.2225 0.8122 0.4029 0.9014 Columns 6 through 10 0.9988 0.9991 0.6266 0.8288 0.8799 >> 8. Εντολές Ελέγχου Ροής Οι εντολές ελέγχου ροής στο MATLAB είναι η if και η switch οι οποίες λειτουργούν όπως και στις περισσότερες γλώσσες προγραμματισμού. Χάριν συντομίας, θα αναφερθούμε μόνο στην if. Η γενική σύνταξη της εντολής if είναι η εξής if <συνθήκη1> <εντολές1> elseif <συνθήκη2> <εντολές2> 14
else <εντολές3> Η εντολή if λειτουργεί ως εξής: Αν η λογική συνθήκη 1 ισχύει, δηλαδή δίνει αποτέλεσμα true, εκτελούνται οι εντολές 1. Αλλιώς, αν ισχύει η λογική συνθήκη 2 εκτελούνται οι εντολές 2. Διαφορετικά, αν δεν ισχύει ούτε η συνθήκη 1 ούτε η συνθήκη 2 εκτελούνται οι εντολές 3. Τα πεδία elseif και else δεν είναι απαραίτητα για τη λειτουργία της if. Αντίθετα, απαραίτητη είναι η τοποθέτηση της λέξης στο τέλος των εντολών. 9. Βρόχοι Επανάληψης Οι επαναληπτικές εργασίες υλοποιούνται στο MATLAB με τις εντολές for και while. Η σύνταξη της εντολής for φαίνεται παρακάτω: for <δείκτης> = <διάνυσμα> <εκφράσεις> Στον βρόχο for οι εκφράσεις επαναλαμβάνονται n φορές όπου n η διάσταση του διανύσματος. Σε κάθε επανάληψη ο δείκτης παίρνει την επόμενη τιμή του διανύσματος μέχρι να φτάσει και στην τελευταία. Για παράδειγμα ο κώδικας for i=1:5 i δίνει σε κάθε επανάληψη στο i την επόμενη τιμή του διανύσματος 1:5 το οποίο είναι η συντομογραφία του διανύσματος [1 2 3 4 5]. Επομένως ο βρόχος εκτελείται για i από 1 έως 5 με βήμα 1. Ουσιαστικά αυτό που κάνει ο κώδικας είναι να τυπώνει την τιμή του i σε κάθε επανάληψη, οπότε θα τυπώσει τους αριθμούς i=1,i=2,i=3,i=4 και i=5. Ομοίως η εκτέλεση της παρακάτω εντολής εκτελεί έναν βρόχο για i από 10 έως 0 με βήμα -2 και δίνει ως αποτέλεσμα: >> for i=10:-2:0 i i = 10 i = 8 15
i = 6 i = 4 i = 2 i = 0 Στο παρακάτω παράδειγμα υπολογίζονται και τυπώνονται οι δέκα πρώτες τιμές της εξόδου του διακριτού συστήματος y(k)= y(k 1)+4 u(k 1) 2 με εισόδους u=(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8) και αρχική τιμή y(1)=1. u=[0:0.1:0.8]; y(1)=1; for k=2:10 y(k)=y(k-1)+4*u(k-1)^2; y Η εντολή while συντάσσεται ως εξής: while <συνθήκη> <εντολές> Οι εντολές εκτελούνται όσο η συνθήκη είναι αληθής. Το παραπάνω παράδειγμα μπορεί να γραφεί με τον βρόχο while ως εξής: u=[0:0.1:0.8]; y(1)=1; k=2 while k<=10 y(k)=y(k-1)+4*u(k-1)^2; k=k+1; y 16
10. Σχεδιασμός Γραφικών Το MATLAB μπορεί πολύ εύκολα να σχεδιάσει γραφικές παραστάσεις με την εντολή plot. Η εντολή αυτή συντάσσεται στη συνηθισμένη μορφή της ως εξής: plot(x,y,s) Όπου x το διάνυσμα με τις τιμές του άξονα x και y το διάνυσμα με τις τιμές του άξονα y. Στην περίπτωση που τα x,y είναι πίνακες, τότε η εντολή απεικονίζει την κάθε στήλη του πίνακα y ως προς την κάθε στήλη του πίνακα x. Η μεταβλητή s είναι ένα αλφαριθμητικό στο οποίο ορίζονται κάποιες ιδιότητες της γραφικής παράστασης. Η χρήση της είναι προαιρετική. Αποτελείται από ένα αλφαριθμητικό ενός έως τριών στοιχείων, το οποίο συντίθεται με βάση τον παρακάτω πίνακα: Χρώμα Εμφάνιση Σημείων Είδος Γραμμης b blue. point - solid g green o circle : dotted r red x x-mark -. dashdot c cyan + plus -- dashed m magenta * star (none) no line y yellow s square k black d diamond w white v triangle (down) ^ triangle (up) < triangle (left) > triangle (right) p h pentagram hexagram Για παράδειγμα η εντολή plot(x,y,'g*--') σχεδιάζει την καμπύλη που ορίζεται από τα διανύσματα x,y. Το κάθε σημείο αναπαρίσταται με αστερίσκο, ενώ τα σημεία ενώνονται μεταξύ τους με πράσινη διακεκομμένη γραμμή. Επίσης η εντολή plot(x,y,'r') σχεδιάζει την καμπύλη που ορίζεται από τα διανύσματα x,y με κόκκινο χρώμα. Στην περίπτωση που το όρισμα s παραληφθεί, η εντολή plot σχεδιάζει την καμπύλη με το προεπιλεγμένο μπλε χρώμα. Στο παρακάτω παράδειγμα σχεδιάζεται το ημίτονο μίας γωνίας από μηδέν έως 2π. Τα σημεία των διανυσμάτων αναπαρίστανται με τρίγωνα ενώ μεταξύ τους ενώνονται με ευθεία γραμμή. 17
th=0:pi/8:2*pi; y=sin(th); plot(th,y,'r^-') Περισσότερες πληροφορίες για τη σύνταξη της συνάρτησης μπορείτε να λάβετε πληκτρολογώντας τις εντολές help plot ή και doc plot. Για να ορίσουμε σε ποιο παράθυρο θα σχεδιάσει η εντολή plot, χρησιμοποιούμε, πριν από την εντολή plot, την εντολή figure(n) όπου n ένας ακέραιος αριθμός. Ο αριθμός αυτός υποδηλώνει την ονομασία του παραθύρου. Για παράδειγμα η εντολή figure(3) θα ανοίξει ένα καινούριο παράθυρο με τίτλο Figure 3. Αν η εντολή αυτή παραληφθεί, το MATLAB θα γράψει στο προηγούμενο παράθυρο(figure) που άνοιξε. Εάν κανένα παράθυρο δεν είναι ανοικτό, θα δημιουργήσει αυτόματα το παράθυρο Figure 1 (όπως στο προηγούμενο παράδειγμα). Η εντολή αυτή είναι ιδιαίτερα χρήσιμη στην περίπτωση που θέλουμε να σχεδιάσουμε πολλές γραφικές παραστάσεις σε πολλά παράθυρα. Για κάθε ένα παράθυρο ο χρήστης μπορεί να ορίσει ιδιότητες, χρησιμοποιώντας τις εντολές που φαίνονται στον παρακάτω πίνακα: hold on / hold off grid on/ grid off axis title(str) xlabel(str) ylabel(str) subplot(m,n,p) Με την εντολή hold on οι επόμενες εντολές απεικόνισης (πχ. plot) που θα εκτελεστούν θα γράψουν πάνω στις προηγούμενες γραφικές παραστάσεις. Ενεργοποιεί/Απενεργοποιεί την εμφάνιση πλέγματος Ορίζει τις ιδιότητες των αξόνων Ορίζει τον τίτλο του παραθύρου. Ορίζει την λεζάντα του άξονα x Ορίζει την λεζάντα του άξονα y Χωρίζει το παράθυρο σε m επί n μικρότερα παράθυρα και ορίζει το p (αριθμημένο από αριστερά προς τα δεξιά) ως 18
leg clf ενεργό Δημιουργεί υπόμνημα Σβήνει τα περιεχόμενα αλλά και τις ιδιότητες του figure. Το παρακάτω παράδειγμα κάνει χρήση πολλών από των παραπάνω εντολών. Παρατηρήστε ότι οι σειρές που αρχίζουν με το σύμβολο % αποτελούν σχόλια. th=0:pi/180:4*pi; y1=220*sqrt(2)*sin(th); y2=220*sqrt(2)*sin(th+2*pi/3); y3=220*sqrt(2)*sin(th+4*pi/3); figure(10) hold on grid on %Ορίζω τον x άξονα από 0 έως 12 και τον y από -320 έως 320 %Στην περίπτωση που παραληφθεί η εντολή αυτή οι άξονες ορίζονται αυτόματα. axis([0 12-320 +320]) title('three Phase Power Supply') xlabel('phase [rad]') ylabel('voltage [V]') plot(th,y1) %Επειδή έχω ορίσει hold on οι καινούριες γραφικές παραστάσεις %θα σχεδιαστούν πάνω στις προηγούμενες. plot(th,y2,'g') plot(th,y3,'r') %Η εντολή leg πρέπει να χρησιμοποιείται μετά τις εντολές plot leg('phase 1','Phase 2','Phase 3') Η εκτέλεση του παραπάνω κώδικα δίνει την εξής γραφική παράσταση: 19
Στην περίπτωση που επιθυμούμε την διαίρεση του κυρίου παραθύρου σε τρία μικρότερα παράθυρα όπου το καθένα να αναπαριστά την κυματομορφή κάθε φάσης ξεχωριστά, ο κώδικας που θα χρησιμοποιήσουμε είναι: th=0:pi/180:4*pi; y1=220*sqrt(2)*sin(th); y2=220*sqrt(2)*sin(th+2*pi/3); y3=220*sqrt(2)*sin(th+4*pi/3); figure(1) subplot(1,3,1) plot(th,y1) axis([0 12-320 +320]) xlabel('phase [rad]') ylabel('voltage [V]') grid on subplot(1,3,2) plot(th,y2,'g') axis([0 12-320 +320]) xlabel('phase [rad]') ylabel('voltage [V]') grid on subplot(1,3,3) plot(th,y3,'r') axis([0 12-320 +320]) xlabel('phase [rad]') ylabel('voltage [V]') grid on Παρατηρήστε ότι οι ιδιότητες πρέπει να οριστούν για κάθε υπογράφημα ξεχωριστά, ενώ τοποθετούνται αμέσως μετά την εντολή plot. Το γράφημα που εμφανίζεται με την εκτέλεση των παραπάνω εντολών είναι το εξής: Στο MATLAB υπάρχει η δυνατότητα δημιουργίας μιας κινούμενης εικόνας με τον συνδυασμό των εντολών clf και pause. Η εντολή pause σταματάει την εκτέλεση του προγράμματος έως ότου ο 20
χρήστης πατήσει ένα πλήκτρο. Αν γραφεί στη μορφή pause(t) σταματάει την εκτέλεση για t δευτερόλεπτα. Στο παρακάτω παράδειγμα φαίνεται μία τελεία να κινείται ωρολογιακά. Το πρόγραμμα διακόπτεται αν ο χρήστης, έχοντας επιλέξει το Command Window, πατήσει Ctrl και C. theta=0:pi/180:2*pi; i=1; r=1; while true %Το k παίρνει συνεχώς τιμές από 1 έως length(theta) k=mod(i,length(theta)); if k==0 k=length(theta); x=r*cos(theta(k)); y=r*sin(theta(k)); plot(x,y,'g.') axis([-1 1-1 1]) %Για να αυξηθεί η ταχύτητα, μειώστε το χρόνο του pause. pause (0.01) clf i=i+1; %Μεταβάλλοντας την ακτίνα του κύκλου σε κάθε επανάληψη, ουσιαστικά εκτελώ spiral. r=(r+1000)/(r+1000+i) Τέλος παρουσιάζονται κάποιες χρήσιμες εντολές που λειτουργούν παρόμοια με την plot: semilogx(x,y,s) Παρόμοια με την plot μόνο που ο άξονας x σχεδιάζεται με λογαριθμική κλίμακα semilogy(x,y,s) Παρόμοια με την plot μόνο που ο άξονας y σχεδιάζεται με λογαριθμική κλίμακα loglog(x,y,s) Σχεδιάζει τα δεδομένα των ορισμάτων x,y σε πλήρως λογαριθμικούς άξονες. plot3 (x,y,z,s) Η εντολή plot στον τρισδιάστατο χώρο. Τα σημεία των αξόνων x,y,z ορίζονται στα διανύσματα x,y,z. 11. Συναρτήσεις Κάθε εντολή του MATLAB αποτελεί ουσιαστικά και μια συνάρτηση που βρίσκεται στον σκληρό δίσκο. Οι συναρτήσεις του MATLAB είναι γενικά αρχεία προέκτασης.m τα οποία έχουν την παρακάτω μορφή: function [όρισμα_εξόδου_1, όρισμα_εξόδου2,..., όρισμα_εξόδου_n] = όνομα_συνάρτησης (όρισμα_εισόδου_1, όρισμα_εισόδου_2,... όρισμα_εισόδου_m) Τα ορίσματα εισόδου και εξόδου μπορεί να είναι βαθμωτά ή πίνακες, οποιασδήποτε μορφής. Η 21
λέξη κλειδί είναι απαραίτητη στην περίπτωση που θέλουμε να ορίσουμε σε ένα αρχείο.m περισσότερες από μία συναρτήσεις. Οι συναρτήσεις καλούνται στο πρόγραμμα ακριβώς με τον τρόπο που εκτελούνται οι διάφορες εντολές: [όρισμα_εξόδου_1, όρισμα_εξόδου2,..., όρισμα_εξόδου_n] = όνομα_συνάρτησης (όρισμα_εισόδου_1, όρισμα_εισόδου_2,... όρισμα_εισόδου_m) Για να εκτελεστούν οι συναρτήσεις πρέπει να βρίσκονται είτε στον Current Folder, είτε στο Path του MATLAB. Το Path είναι η λίστα με τις διαδρομές όλων των φακέλων στους οποίους βρίσκονται τα αρχεία του MATLAB. Η πρόσθεση ενός καινούριου φακέλου μπορεί να γίνει από το μενού File>Set Path. 12. Κυψέλες, Δομές και Συνένωση Πινάκων Στην ενότητα αυτή παρουσιάζονται τρία στοιχεία του MATLAB, οι κυψέλες, οι δομές και η λειτουργία συνένωσης πινάκων που ο στόχος τους είναι να απλοποιούν, πολλές φορές σημαντικά, το έργο του προγραμματιστή. Κυψέλες (Cells) Οι κυψέλες είναι μία μορφή δεδομένων που επιτρέπει την συνένωση ετερόκλιτων στοιχείων σε έναν πίνακα. Ένα στοιχείο μπορεί να οριστεί ως κυψέλη αν τοποθετηθεί μέσα σε αγκύλες {}. Για παράδειγμα η έκφραση a={1} ορίζει την μεταβλητή a ως μια κυψέλη που περιέχει τον πραγματικό αριθμό 1. Ομοίως οι εκφράσεις a={ones(2)} και a={'abc'} ορίζουν με κυψέλη με περιεχόμενα έναν μοναδιαίο πίνακα δύο επί δύο και ένα αλφαριθμητικό abc. Έχοντας οριστεί ως κυψέλη, η μεταβλητή a δεν μπορεί να χρησιμοποιηθεί σε πράξεις. Για τη μετατροπή της σε μορφή αριθμού/πίνακα χρησιμοποιείται η συνάρτηση cell2mat(). Να σημειωθεί ότι η συνάρτηση αυτή λειτουργεί και για αλφαριθμητικά. Οι πίνακες που περιλαμβάνουν κυψέλες μπορούν να διευθυνσιοδοτηθούν με δύο τρόπους: Ο πρώτος είναι με χρήση παρενθέσεων ως εξής: b=a(1). Το αποτέλεσμα που θα προκύψει θα είναι κυψέλη. Ο δεύτερος τρόπος είναι με χρήση αγκίστρων ως εξής: b=a{1}. Σε αυτή την περίπτωση το αποτέλεσμα που προκύπτει είναι πίνακας, επομένως εξαλείφεται η ανάγκη χρήσης της εντολής cell2mat. Η χρησιμότητα των κυψελών μπορεί να φανεί στην εφαρμογή όπου θέλουμε να ομαδοποιήσουμε διανύσματα ή πίνακες διαφορετικού μήκους σε έναν μεγαλύτερο πίνακα. Έστω για παράδειγμα ότι έχουμε πίνακες 2 επί n i στοιχείων που περιλαμβάνουν τα σημεία x (στην πρώτη σειρά) και τα σημεία y (στη δεύτερη σειρά) κάποιων πολυγώνων. Το κάθε πολύγωνο περιλαμβάνει έναν διαφορετικό (n i ) αριθμό σημείων x,y. Αν θέλουμε να ομαδοποιήσουμε τα πολύγωνα σε έναν πίνακα, πρέπει να χρησιμοποιήσουμε αναγκαστικά κυψέλες (ή δομές). Το παρακάτω παράδειγμα δημιουργεί πολύγωνα τριών έως επτά κορυφών και τα αποθηκεύει σε ένα διάνυσμα κυψελών. Στη συνέχεια τα τυπώνει με τυχαίο χρώμα, το κάθε ένα σε ένα διαφορετικό figure. Η εντολή axis equal ορίζει ίδια κλίμακα και στους δύο άξονες. 22
r=2; for i=1:5 th=0:2*pi/(i+2):2*pi; x=r*cos(th); y=r*sin(th); polygon_i=[x;y]; POLYGONS(i)={polygon_i}; for i=1:length(polygons) figure(i) axis equal pol=cell2mat(polygons(i)); plot(pol(1,:),pol(2,:),'color',[rand rand rand]) Δομές (Structures) Στο MATLAB υπάρχει η δυνατότητα χρήσης δομών (structures) όπως και στις περισσότερες γλώσσες προγραμματισμού. Για να οριστεί ένα πεδίο δομής χρησιμοποιείται ο τελεστής της τελείας. Ο παρακάτω κώδικας, παρμένος από την βοήθεια του MATLAB, παρουσιάζει τον τρόπο δημιουργίας μιας δομής patients με στοιχεία name, billing, test. patient.name = 'John Doe'; patient.billing = 127.00; patient.test = [79 75 73; 180 178 177.5; 172 170 169]; patient Η εκτέλεση του παραπάνω κώδικα δίνει την εξής έξοδο: patient = name: 'John Doe' billing: 127 test: [3x3 double] Υπάρχει επίσης η δυνατότητα δημιουργίας πίνακα δομών. Στο προηγούμενο παράδειγμα, θα ορίζαμε στοιχεία για έναν δεύτερο ασθενή, ως εξής: patient(2).name = 'Ann Lane'; patient(2).billing = 28.50; patient(2).test = [68 70 68; 118 118 119; 172 170 169]; Μετά την εκτέλεση των παραπάνω εντολών ο patient είναι ένας πίνακας δύο στοιχείων, με περιεχόμενα δομές. 23
Συνένωση Πινάκων (Concatenation) Μία επίσης πολύ χρήσιμη δυνατότητα του MATLAB είναι η συνένωση πινάκων και η δημιουργία μεγαλύτερων. Αυτό επιτυγχάνεται πολύ εύκολα, χρησιμοποιώντας τους γνωστούς τελεστές με τους οποίους δημιουργούνται οι πίνακες. Για παράδειγμα, δύο διανύσματα σειράς a,b μπορούν να συνενωθούν σε ένα μεγαλύτερο με την εντολή c=[a b]. Το διάνυσμα c θα είναι κι αυτό διάνυσμα σειράς και θα έχει μήκος ίσο το άθροισμα των μηκών των a,b. Εναλλακτικά, αν τα διανύσματα a,b έχουν ίσο μήκος, θα μπορούσαμε χρησιμοποιώντας την εντολή c=[a;b] να ορίσουμε το c ως έναν πίνακα που στην πρώτη σειρά του να έχει το διάνυσμα a και στη δεύτερη το διάνυσμα b. Με τον ίδιο ακριβώς τρόπο μπορούν να ενωθούν πολλοί πίνακες. Για παράδειγμα η εντολή A=[eye(2) 2*eye(2);3*eye(2) -eye(2)] δίνει έναν καινούριο πίνακα τέσσερα επί τέσσερα, όπως φαίνεται παρακάτω. A = 1 0 2 0 0 1 0 2 3 0-1 0 0 3 0-1 Η λειτουργία της συνένωσης πινάκων λειτουργεί με πίνακες όλων των ειδών, όπως πίνακες δομών, κυψελών, ενώ επίσης μπορεί να επιτελέσει και συνένωση (merging) αλφαριθμητικών. Το MATLAB δίνει επίσης τη δυνατότητα στον προγραμματιστή να ορίσει μία μεταβλητή να ισούται με τον κενό πίνακα ([]). Ο κενός πίνακας έχει διαστάσεις μηδέν επί μηδέν. Ο συνδυασμός του κενού πίνακα με την λειτουργία συνένωσης πινάκων δίνει στον προγραμματιστή τη δυνατότητα να χειρίζεται πίνακες των οποίων δεν γνωρίζει εξ αρχής το μέγεθος. Παράδειγμα αποτελεί ο παρακάτω κώδικας, που δημιουργεί ένα διάνυσμα a 50 τυχαίων στοιχείων και στη συνέχεια αποθηκεύει σε ένα καινούριο διάνυσμα το b όσα στοιχεία είναι μικρότερα από 0.5. Παρατηρήστε ότι το μήκος του b συνεχώς αλλάζει, επομένως έχει δημιουργηθεί μία δυναμική δομή δεδομένων.. a=rand(50,1); b=[]; for i=1:length(a) if a(i)<0.5 b=[b a(i)]; Παρόμοιο αποτέλεσμα θα είχαμε πετύχει χρησιμοποιώντας τη δυνατότητα του MATLAB να κάνει indexing με λογικές μεταβλητές. Σε αυτή την περίπτωση, αν ένα διάνυσμα λογικών μεταβλητών και ίσων στοιχείων με το a μπει ως δείκτης του, τότε επιστρέφονται τα στοιχεία που βρίσκονται στις θέσεις όπου το λογικό διάνυσμα είναι true. Ο παρακάτω κώδικας είναι ισοδύναμος με τον προηγούμενο. a=rand(50,1); b=a(a<0.5); 24
Το διάνυσμα λογικών μεταβλητών είναι η παράσταση a<0.5. Κάθε στοιχείο του διανύσματος αυτού είναι true αν το αντίστοιχο στοιχείο του a είναι μικρότερο από 0.5. Επομένως το b ισούται με τα στοιχεία του a που είναι μικρότερα του 0.5. Τέλος, αναφέρεται η δυνατότητα του MATLAB να σβήσει ένα ή περισσότερα στοιχεία ενός πίνακα ή ενός διανύσματος με χρήση της εντολής <μεταβλητή>=[]. Για παράδειγμα, στον παραπάνω κώδικα η εντολή b(1:3)=[] θα σβήσει τα πρώτα τρία στοιχεία του διανύσματος b. Ως τελευταίο παράδειγμα δίνεται μία συνάρτηση που σβήνει τις όμοιες σειρές από έναν πίνακα. function mat_in=deletesamerows(mat_in) s=size(mat_in); i=1; while i<=s(1) j=1; while j<=s(1) if i~=j if all(mat_in(i,:)==mat_in(j,:)) mat_in(j,:)=[]; j=j-1; s(1)=s(1)-1; j=j+1; i=i+1; Η εντολή all() δίνει ως αποτέλεσμα true αν όλα τα στοιχεία του λογικού διανύσματος mat_in(i,:) ==mat_in(j,:) είναι αληθή. Αντίστοιχη είναι και η εντολή any. 25