ημιουργία και διαχείριση πινάκων Για να δημιουργήσουμε έναν πίνακα στο MATLAB μπορούμε να γράψουμε A = [ 2 3 ; 7 9 0 ; - 0 5; -2-3 9 -] βλέπουμε ότι αμέσως μας επιστρέφει τον πίνακα που ορίσαμε A = 2 3 7 9 0-0 5-2 -3 9 - Ο πίνακας γράφεται μέσα σε [ ] σε γραμμές οι οποίες ξεχωρίζουν με το ; Αν στο τέλος της εντολής βάλουμε το ;(semicolon) δεν εμφανίζεται αμέσως μετά ο πίνακας αλλά μπορούμε να τον αναζητήσουμε γράφοντας Α A = [ 2 3 ; 7 9 0 ; - 0 5; -2-3 9 -]; A A = 2 3 7 9 0-0 5-2 -3 9 - Με τον τρόπο αυτό μπορούμε να ορίσουμε πίνακες με διαφορετικές διαστάσεις Όπως έναν πίνακα γραμμή v=[- 3 5]; v v = - 3 5 Με Α μπορούμε να πάρουμε τον ανάστροφο του πίνακα Α. Γράφοντας v θα πάρουμε τον πίνακα στήλη που αντιστοιχεί στον v. v' - 3 5 Μπορούμε να μάθουμε την διάσταση ενός πίνακα με την εντολή size( ) size(a) πραγματικά ο Α είναι ένας πίνακας επί. Αν γράψουμε [m,n]=size(a)
m = n = τότε η μεταβλητή m περιέχει το πλήθος των γραμμών του πίνακα Α και η μεταβλητή n το πλήθος των στηλών. Εφαρμογή Να ορίσετε πίνακα Α με 3 γραμμές και στήλες και να ζητήσετε το μέγεθος του. Να δημιουργήσετε τον ανάστροφο Α ποιο είναι το μέγεθος του. Εξετάστε αν ο πίνακας Α+Α είναι συμμετρικός. Αν έχουμε πίνακα γραμμή ή στήλη μπορούμε να βρούμε το πλήθος των στοιχείων του με την εντολή length( ). n = length(v); n n = Για να δούμε συγκεκριμένο στοιχείο του πίνακα γράφουμε Α(γραμμή, στήλη), A(,) A(2,3) 0 Μπορούμε να δούμε συγκεκριμένες γραμμές ή στήλες. Για να δούμε την πρώτη γραμμή θυμόμαστε ότι όλα τα στοιχεία της έχουν δεύτερη συντεταγμένη. A(:,) 7 - -2 Με τη χρήση του : (colon) σαν πρώτη συντεταγμένη παίρνουμε όλες τις τιμές που αυτή παίρνει, στην συγκεκριμένη περίπτωση από έως. Αν θελήσουμε να δημιουργήσουμε έναν πίνακα Β διάστασης 2 x που να περιέχει την δεύτερη και την τρίτη γραμμή του πίνακα Α, θα γράψουμε Β = Α ( 2:3, : ). Εφαρμογή Πως θα πάρουμε το πάνω αριστερά 2 επί 2 κομμάτι του Α ; Θα ορίσουμε δύο διανύσματα x και y ( διάστασης n=7) και θα βρούμε το εσωτερικό τους γινόμενο, 2
το οποίο ορίζεται ως εξής n=7; x = [ 3 5 7 9 0-2]; y = [ 0 - -2 7-0]; sum = 0; for i = :n sum = sum + x(i)*y(i); sum sum = 78 n x. y xiyi i Εφαρμογή Τι θα συμβεί αν στο τέλος της γραμμής sum = sum + x(i)*y(i) ; αφαιρέσουμε το ; Ορίστε ένα διάνυσμα v με 0 στοιχεία και βρείτε το άθροισμα των στοιχείων του. Με την εντολή rand(5,) δημιουργούμε έναν πίνακα 5 επί με τυχαίους αριθμούς στο διάστημα [0, ]. Η εντολή round( ) στρογγυλεύει στον πλησιέστερο ακέραιο αριθμό. Έτσι με την ακόλουθη εντολή δημιουργούμε έναν πίνακα 5 επί με τυχαίους ακέραιους από το 0 έως το 00. A=round(rand(5,)*00) A = 6 20 2 2 35 20 75 85 8 60 5 53 27 93 20 20 7 67 ημιουργούμε άλλον ένα πίνακα Β διάστασης επί 7 B=round(rand(,7)*00) B = 8 83 30 30 38 50 82 2 50 9 5 86 90 66 68 7 9 5 85 82 3 38 3 68 70 59 6 29 Τι κάνει η εντολή randint; 3
Θα βρούμε το γινόμενο τους C = A B, το c ij στοιχείο του πίνακα αυτού ορίζεται ως: c a b. ij is sj s C=zeros(5,7); for i = :5 for j = :7 C(i,j) = 0 ; for s=: C(i,j) = C(i,j) + A(i,s)*B(s,j); Αν στο κενό μεταξύ πρώτου και δεύτερου γράψουμε C εμφανίζεται ο πίνακας C καθώς δημιουργείται. Συγκρίνετε με το να γράψουμε το C μεταξύ δεύτερου και τρίτου. Βλέπουμε ότι ο πίνακας C δημιουργείται γραμμή γραμμή. Πως θα τον δημιουργήσουμε στήλη στήλη ; Επίσης μπορούμε να βρούμε τον πίνακα γράφοντας C = A*B. Θα μπορούσαμε να χρησιμοποιήσουμε εδώ ένα m file μέσα στο οποίο να γράψουμε μια συνάρτηση (function) με την οποία να υπολογίζεται το γινόμενο δύο πινάκων εφόσον αυτό υπάρχει. Πρέπει πρώτα να ελέγξουμε αν είναι δυνατός αυτός ο πολλαπλασιασμός, θα πρέπει για να ορίζεται ο πίνακας γινόμενο C το πλήθος των στηλών του Α να είναι ίσο με το πλήθος των γραμμών του Β. Από την επιλογή File (πάνω αριστερά) στο παράθυρο εργασίας του MATLAB επιλέγουμε New -> M-file. function C = ginomeno(a,b) [m,k] = size(a) ; [l,n] = size(b) ; if k~=l error('wrong dimensions') else C = zeros(m,n) ; for i = :m for j = :n C(i,j) = 0 ; for s = :k ; C(i,j) = C(i,j) + A(i,s)*B(s,j) ;
To M-file το σώζουμε με την ονομασία ginomeno.m Τώρα αφού ορίσουμε δυο πίνακες Α και Β καλούμε τη συνάρτηση ginomeno ως εξής ginomeno(a,b) στην οθόνη μας εμφανίζεται το γινόμενο των Α και Β. Μπορούμε να αναθέσουμε το γινόμενο σε κάποια μεταβλητή για να είναι διαθέσιμο αργότερα γράφοντας AB = ginomeno(a,b) ; Συναρτήσεις για τη διαχείριση πινάκων length(x) επιστρέφει αριθμό, αν το x είναι διάνυσμα το πλήθος των στοιχείων του, αν το x είναι πίνακας τη μεγαλύτερη διάσταση. size(x) επιστρέφει δύο αριθμούς τις διαστάσεις του πίνακα x [m, n]=size(x) m γραμμές του x, n στήλες του x. zeros(m,n) δημιουργεί μηδενικό πίνακα με m γραμμές και nστήλες. zeros(n) όπως το zeros(n,n) ones(m, n) δημιουργεί πίνακα με m γραμμές και nστήλες με όλα τα στοιχεία του ίσα με τη μονάδα. ones(n) όπως το ones(n,n) eye(m,n) δημιουργεί πίνακα με διάστασης m επί n με μονάδες στην κύρια διαγώνιο και μηδέν στις υπόλοιπες θέσεις. eye(n) δημιουργεί μοναδιαίο πίνακα n επί n. rand(m,n) ημιουργεί πίνακα διάστασης m επί n με τυχαίους αριθμούς από την ομοιόμορφη κατανομή στο [0,] diag(x) δημιουργεί πίνακα με διαγώνια στοιχεία τα στοιχεία του διανύσματος x Α ο ανάστροφος του πίνακα Α inv(a) Ο αντίστροφος του πίνακα Α det(a) η ορίζουσα του πίνακα Α 5
Άσκηση Να γράψετε συνάρτηση MATLAB με όρισμα εισόδου ένα διάνυσμα x η οποία να επιστρέφει: το μέγεθος του n, το άθροισμα των στοιχείων του (xsum), το μέσο όρο των στοιχείων του (xavg), το μέγιστο στοιχείο (xmax) και τη θέση του (pxmax), το ελάχιστο στοιχείο (xmin) και τη θέση του (pxmin). Function [ n,xsum,xavg,xmax,pxmax,xmin,pxmin] = ask(x) Άσκηση 2 Να γράψετε συνάρτηση MATLAB με όρισμα εισόδου έναν πίνακα Α η οποία να επιστρέφει: το μέγεθος του m,n, διάνυσμα το οποίο θα περιέχει το άθροισμα των στοιχείων κάθε γραμμής (line_s), διάνυσμα το οποίο θα περιέχει το άθροισμα των στοιχείων κάθε στήλης (line_c), το άθροισμα όλων των στοιχείων του Α (suma) διάνυσμα το οποίο θα περιέχει το μέγιστο στοιχείο κάθε γραμμής (line_max), διάνυσμα το οποίο θα περιέχει τη θέση του μέγιστου στοιχείου κάθε γραμμής (pline_max), διάνυσμα το οποίο θα περιέχει το ελάχιστο στοιχείο κάθε γραμμής (line_min), διάνυσμα το οποίο θα περιέχει τη θέση του ελάχιστου στοιχείου κάθε γραμμής (pline_min), 6