Υπολογιστική Επιστήμη & Τεχνολογία Εξέταση Αυγούστου 2015 Διάρκεια 2.5 ώρες 1. Ιεραρχίες μνήμης (1μ) Γράψτε αλγόριθμο σε MATLAB που να υπολογίζει τα αθροίσματα των στηλών ενός τετραγωνικού πίνακα N N γνωρίζοντας ότι τελικά ο αλγόριθμος αυτός θα υλοποιηθεί σε γλώσσα C. Η C αποθηκεύει τους δισδιάστατους πίνακες ανά γραμμές, άρα ο αλγόριθμος πρέπει να διατρέχει τον πίνακα ανά γραμμές. % A πίνακας NxN colsum = zeros(1, N); for i = 1:N for j = 1:N colsum(j) = colsum(j) + A(i,j); 2. Monte Carlo (1.5μ) Επιλέγουμε με τυχαίο τρόπο δύο σημεία πάνω στον μοναδιαίο κύκλο. Ποια είναι η πιθανότητα η χορδή που τα ενώνει να έχει μήκος μεγαλύτερο από 1; Ένα τυχαίο σημείο του κύκλου ορίζεται από τη γωνία τις ακτίνας του με τον άξονα των x (συνημιτόνων). function p = chordlenν() % N - Αριθμός πειραμάτων % p - Η ζητούμενη πιθανότητα % Επιλέγουμε με τυχαίο τρόπο τις γωνίες που σχηματίζουν τα τυχαία % σημεία 1 και 2 με τον άξονα των x. theta1 = 2*pi*randΝ(, 1); theta2 = 2*pi*randΝ(, 1); % Οι συντεταγμένες του σημείου 1 για τα N πειράματα. x1 = cos(theta1); y1 = sin(theta1); % Οι συντεταγμένες του σημείου 2 για τα N πειράματα. x2 = cos(theta2); y2 = sin(theta2); %%%-- A τρόπος (με for) --%%% 1
hits = 0; for i = Ν1: if sqrt((x1(i)-x2(i))^2 + (y1(i)-y2(i))^2) > 1 hits = hits + 1; p = hitsν/; %%%-- B τρόπος (χωρίς for) --%%% % p = sum(sqrt((x1-x2).^2 + (y1-y2).^2) > 1)/N; 3. Αριθμητική υπολογιστών (1μ) (αʹ) Ποια είναι η δυαδική αναπαράσταση των αριθμών z = x 512 και z (x τα 3 τελευταία ψηφία του Α.Μ. σας), σε υπολογιστή με 10 bits και στα συστήματα αναπαράστασης (i) συμπλήρωμα ως προς 2, και (ii) πλεόνασμα κατά 512. (βʹ) Έστω ένα σύστημα- παιχνίδι κινητής υποδιαστολής με m = 4 και e = 1. Ποια είναι η αναπαράσταση των αριθμών 150.1, 0.00042, -10.042 στο σύστημα αυτό; Δώστε ένα παράδειγμα δύο αριθμών οι οποίοι έχουν ακριβή αναπαράσταση στο σύστημα αυτό, ενώ το άθροισμά τους δεν έχει. (αʹ) Έστω x = 123. Μετατρέπουμε με κάποιον από τους γνωστούς τρόπους (διαφάνεια 5 στις σημειώσεις) τον z = 512 x = 512 123 = 389 σε δυαδικό και κρατάμε μόνο τα τελευταία 10 bits: z = 389 10 = 0110000101 2. (i) συμπλήρωμα ως προς 2: z = 0110000101 2, z = 1001111011 2 (διαφάνεια 10). (ii) Το πλεόνασμα κατά 512 είναι το συμπλήρωμα ως προς το 2 με το πρόσημο αντετραμμένο: z = 1110000101 2, z = 0001111011 2 (διαφάνεια 11). (βʹ) 150.1 1.501 10 2, 0.00042 4.200 10 4, 10.042 1.004 10 1. Οι αριθμοί 1 = 1.000 10 0 και 0.0001 = 1.000 10 4 έχουν ακριβή αναπαράσταση στο σύστημα αυτό, ενώ το άθροισμα τους 1.0001 1.000 10 0, δεν έχει. 4. Αραιοί πίνακες (1.5μ) (αʹ) Να επιλέξετε έναν τυχαίο και αραιό πίνακα 6 4 με ακριβώς 10 μη-μηδενικά στοιχεία και να τον αποθηκεύσετε με το σύστημα των συντεταγμένων. (βʹ) Να γράψετε αλγόριθμο πολλαπλασιασμού συμμετρικού αραιού πίνακα με διάνυσμα, όταν είναι αποθηκευμένο μόνο το κάτω τριγωνικό μέρος του πίνακα με το σύστημα CRS. (αʹ) Έστω τότε 4.6 0 4.7 0 3.5 0 8.8 0 A = 0 0 2.7 0 0.5 1.6 0 0 0 7.3 3.9 0 0 0 0 3.3 2
val = [4.6 4.7 3.5 8.8 2.7 0.5 1.6 7.3 3.9 3.3] row = [1 1 2 2 3 4 4 5 5 6] col = [1 3 1 3 3 1 2 2 3 4] (βʹ) Κώδικας για y = Ax, όπου A αραιός συμμετρικός πίνακας με αποθηκευμένο το κάτω τριγωνικό μέρος του με το σύστημα CRS: n = length(start) - 1; y = zeros(n,1); for i = 1:n for k = start(i):start(i+1)-1 j = col(k); y(i) = y(i) + val(k)*x(j); if i ~= j y(j) = y(j) + val(k)*x(i); 5. Αλυσίδες Markov (1μ) Γράψτε συνάρτηση MATLAB που να ελέγχει αν ένας πίνακας είναι πίνακας Markov. Η συνάρτησή σας θα πρέπει να δέχεται τον ελάχιστο δυνατό αριθμό παραμέτρων και να επιστρέφει μία λογική (boolean) τιμή. Ένας πίνακας Markov πρένει να είναι (i) συμμετρικός, (ii) τα στοιχεία του, ως πιθανότητες, να έχουν τιμές στο διάστημα [0, 1], και (iii) το άθροισμα κάθε στήλης του να είναι 1. Α τρόπος (χωρίς πράξεις σε επίπεδο πινάκων) function ismarkov = testmarkov(m) % M - Ο πίνακας που θα ελεγχθεί ismarkov = true; [m, n] = size(m); % Έλεγχος συμμετρίας if m ~= n return for i = 1:n for j = 1:i-1 if M(i,j) ~= M(j,i) return % Έλεγχος μεγέθους τιμών 3
for i = 1:n for j = i+1:n % στο άνω τριγωνικό μέρος λόγω συμμετρίας if M(i,j)<0 M(i,j)>1 return; % Έλεγχος αθροίσματος στηλών for j = 1:n sum = 0; for i = 1:n sum = sum + M(i,j); if sum > 1 return; Β τρόπος (με πράξεις σε επίπεδο πινάκων) function ismarkov = testmarkov(m) % M - Ο πίνακας που θα ελεγχθεί ismarkov =... (size(m,1)==size(m,2) && all(all(m==m ))) &&... % συμμετρία all(all((m>=0 & M<=1))) &&... % μέγεθος τιμών all(all(abs(sum(m)-1)<=eps)); % άθροισμα στηλών 6. Τυχαίοι περίπατοι (1μ) Έστω τυχαία ανάβαση σε σκάλα με N σκαλοπάτια. Η ανάβαση ξεκινάει στη βάση της σκάλας με σκοπό να καταλήξει στην κορυφή. Ευρισκόμενος σε ένα ενδιάμεσο σκαλοπάτι, η ανάβαση μεταβαίνει ισοπίθανα σε ένα από τα 2 γειτονικά της σκαλοπάτια. Γράψτε μια συνάρτηση howmany = steps(n), που προσομοιώνει την τυχαία αυτή ανάβαση και καταγράφει την επισκεψιμότητα κάθε σκαλοπατιού (πόσες φορές ο περίπατος βρέθηκε σε έναν δεδομένο σκαλοπάτι). Η συνάρτησή σας πρέπει επίσης να πλοτάρει ένα ραβδόγραμμα με την επισκεψιμότητα κάθε σκαλοπατιού. Είναι ουσιαστικά ένας τυχαίος περίπατος σε μια διάσταση (ένα ευθύγραμμο τμήμα) με N ενδιάμεσους σταθμούς. function howmany = steps(n) NN = N + 2; howmany = zeros(nn, 1); x = 1; howmany(x) = 1; while x ~= NN if x == 1, x = x + 1; else p = rand(1); if p < 0.5 4
x = x - 1; else x = x + 1; howmany(x) = howmany(x) + 1; bar(howmany); 7. Προσομοίωση (1μ) Θεωρήστε ότι στο πρόβλημα καταδίωξης ταύρου-οδοιπόρου υπάρχει και ένας δεύτερος ταύρος που ξεκινάει από μια διαφορετική θέση από εκείνη του πρώτου και καταδιώκει και αυτός τον οδοιπόρο. Θεωρήστε ακόμα ότι οι δύο ταύροι κινούνται με διαφορετικές αλλά σταθερές ταχύτητες και ότι η ταχύτητα του πεζοπόρου είναι επίσης σταθερή. Πως τροποποιείται ο αλγόριθμος καταδίωξης με τα νέα δεδομένα? Να γράψετε τον τροποποιημένο αλγόριθμο σαν συνάρτηση MATLAB, με κατάλληλες παραμέτρους εισόδου/εξόδου. function saved = pursuit(xb1, yb1, vb1, xb2, yb2, vb2, xh, vh, xf, dt) % xb1, yb1, vb1 - Θέση και ταχύτητα ταύρου 1 % xb2, yb2, vb2 - Θέση και ταχύτητα ταύρου 2 % xh, vh - Θέση και ταχύτητα οδοιπόρου % xf - Θέση φράχτη % dt - χρονικό βήμα προσομοίωσης t = 0; s1 = sqrt((xb1-xh)^2+yb1^2); s2 = sqrt((xb2-xh)^2+yb2^2); while xh<xf && s1>1 && s2>1 t = t + dt; xb1 = xb1 + (xh-xb1)*vb1*dt/s1; yb1 = yb1 - yb1*vb1*dt/s1; xb2 = xb2 + (xh-xb2)*vb2*dt/s2; yb2 = yb2 - yb2*vb2*dt/s2; xh = xh + vh*dt; s1 = sqrt((xb1-xh)^2+yb1^2); s2 = sqrt((xb2-xh)^2+yb2^2); if xh >= xf, saved = true; else saved = false; 8. MATLAB structs (1μ) Συμπληρώστε την παρακάτω συνάρτηση έτσι ώστε να λειτουργεί σύμφωνα με τις προδιαγραφές της: function Q = ThirdVertex(P1,P2) % Τα P1 και P2 είναι διακριτά σημεία με την ίδια συντεταγμένη y. % Το Q είναι ένα σημείο τέτοιο ώστε τα P1, P2 και Q να ορίζουν % ένα ισόπλευρο τρίγωνο. Η συντεταγμένη y του Q πρέπει να είναι % μεγαλύτερη από τη συντεταγμένη y των P1 και P2. 5
Θεωρήστε ότι τα πεδία της δομής ενός σημείου είναι τα x και y. Χρησιμοποιούμε τη βοηθητική συνάρτηση MakePoint από το βιβλίο. function Q = ThirdVertex(P1,P2) side = abs(p1.x - P2.x); % Μήκος πλευράς xq = (P1.x + P2.x)/2; yq = P1.y + 0.5*side*tan(pi/3); Q = MakePoint(xQ, yq); 9. Επεξεργασία εικόνας (1μ) Γράψτε μια συνάρτηση DisplayMosaic(P, q, r) που να εμφανίζει ένα μωσαϊκό q r της εικόνας που κωδικοποιείται στο το ασπρόμαυρο jpeg αρχείο P. Η εικόνα που εμφανίζεται δηλαδή θα πρέπει να αποτελείται από q r αντίγραφα της αρχικής εικόνας, διατεταγμένα σε q γραμμές και r στήλες. Α τρόπος function DisplayMosaic(P, q, r) photo = imread(p); [nr, nc] = size(photo); mosaic = zeros(nr*q, nc*r, uint8); for i = 1:q istart = (i-1)*nr + 1; i = i*nr; for j = 1:r jstart = (j-1)*nc + 1; j = j*nc; mosaic(istart:i, jstart:j) = photo; imshow(mosaic); Β τρόπος function DisplayMosaic(P, q, r) photo = imread(p); temp = []; for j = 1:r temp = [temp photo]; mosaic = []; for i = 1:q mosaic = [mosaic; temp]; imshow(mosaic); Γ τρόπος function DisplayMosaic(P, q, r) photo = imread(p); mosaic = repmat(photo, q, r); imshow(mosaic); 6
10. Επεξεργασία ήχου (1μ) Γράψτε συνάρτηση error = SoundSlice(infile, Tstart, T, outfile) που να αποκόπτει από το wav αρχείο infile το ηχητικό στιγμιότυπο ανάμεσα στις χρονικές στιγμές Tstart και T και να το αποθηκεύει στο αρχείο outfile. Η συνάρτησή σας να ελέγχει αν οι δεδομένες χρονικές στιγμές Tstart, T είναι μέσα στα όρια της ηχογράφησης (error = 0) ή όχι (error = 1). Θεωρήστε χωρίς έλεγχο ότι Tstart < T. Θεωρούμε ότι και οι δυο ηχογραφήσεις έχουν τον ίδιο ρυθμό δειγματοληψίας. error = SoundInsert(infile, Tstart, T, outfile) [sound, rate] = wavread(infile); error = 0; n = length(sound); % Διάρκεια ηχογράφησης σε sec T = (n-1)/rate; % Έλεγχος ορίων if Tstart < 0 T > T error = -1; return % Θέσεις στο διάνυσμα που αντιστοιχούν στα Tstart, T. istart = Tstart*rate + 1; i = T*rate + 1; % Νέο διάνυσμα δειγμάτων. newsound = sound(istart:i); wavwrite(newsound, rate, 8, outfile); 7