Lab 1 — Εισαγωγή στο MATLAB
Τι είναι το MATLAB
MATrix LABoratory. Όλα είναι πίνακας. Ένας αριθμός είναι ένας 1×1 πίνακας. Ένα διάνυσμα είναι ένας 1×N ή N×1 πίνακας. Ένα σήμα στο χρόνο είναι ένα 1×N διάνυσμα. Αυτή η ομοιομορφία είναι που κάνει το MATLAB τόσο βολικό για επεξεργασία σήματος — αν ξέρεις άλγεβρα πινάκων, ξέρεις MATLAB.
Το περιβάλλον έχει τρία βασικά πάνελ:
- Command Window — εδώ γράφεις εντολές με το prompt
>>. Όταν πατήσεις Enter, η εντολή εκτελείται και βλέπεις το αποτέλεσμα. - Workspace — δείχνει όλες τις μεταβλητές που έχεις δηλώσει μέχρι στιγμής. Με διπλό κλικ ανοίγεις τον Variable Editor και βλέπεις τις τιμές σαν spreadsheet.
- Current Directory / File Browser — οι φάκελοι με τα
.mαρχεία σου.
Δύο βασικές εντολές που θα τις χρησιμοποιείς συνέχεια:
clear % διαγράφει ΟΛΕΣ τις μεταβλητές από το workspace
clc % καθαρίζει την οθόνη — οι μεταβλητές παραμένουν
Πίνακες & διανύσματα
Δηλώνεις έναν πίνακα
Με αγκύλες [ ]. Κόμμα ή κενό για στοιχεία της ίδιας γραμμής, ερωτηματικό για νέα γραμμή.
>> A = [16 3; 5 10]
A =
16 3
5 10
Ένα διάνυσμα-γραμμή είναι απλώς ένας 1×N πίνακας:
>> x = [1 2 5 1]
x =
1 2 5 1
Ένας τόνος (') είναι ο ανάστροφος (transpose):
>> y = x'
y =
1
2
5
1
Πίνακες με βήμα — η colon notation
>> 1:5 % βήμα 1 (default)
ans =
1 2 3 4 5
>> 0:0.25:1 % συγκεκριμένο βήμα
ans =
0 0.2500 0.5000 0.7500 1.0000
>> -1:1:7 % start : step : end
ans =
-1 0 1 2 3 4 5 6 7
Συναρτήσεις-εργαλεία για κατασκευή πινάκων:
zeros(M, N) % MxN πίνακας με μηδενικά
ones(M, N) % MxN πίνακας με 1
rand(M, N) % ομοιόμορφα κατανεμημένα στο (0,1)
randn(M, N) % κανονικά κατανεμημένα, μ=0, σ=1
eye(N) % NxN ταυτοτικός πίνακας
linspace(a,b,N) % N ισαπέχουσες τιμές από a μέχρι b (συμπεριλαμβανομένων)
Indexing — η πιο συχνή ερώτηση στις εξετάσεις
Το indexing στο MATLAB ξεκινάει από το 1, όχι το 0. Αυτό αν είσαι από προγραμματισμό σε Python/C, χτυπάει συνέχεια.
>> x = [10 20 30 40 50];
>> x(1) % πρώτο στοιχείο
ans = 10
>> x(end) % τελευταίο στοιχείο (special keyword)
ans = 50
>> x(2:4) % στοιχεία από 2 έως 4 (inclusive!)
ans =
20 30 40
Για 2D πίνακες με δύο indices A(row, col):
>> A = [1 2 3; 5 1 4; 3 2 -1];
>> A(2, 3) % γραμμή 2, στήλη 3
ans = 4
>> A(3, :) % ολόκληρη γραμμή 3
ans =
3 2 -1
>> A(:, 2) % ολόκληρη στήλη 2
ans =
2
1
2
Το : σημαίνει «όλα τα στοιχεία στη διάσταση αυτή». Το διαβάζεις σαν «παίρνε τα όλα».
[ ] για concatenation, ( ) για indexing
Δύο διαφορετικές χρήσεις. Συχνά οι αρχάριοι τα μπερδεύουν.
% Concatenation — βάζω πίνακες δίπλα-δίπλα ή πάνω-κάτω
a = [1 2];
b = [3 4];
c = [a b] % οριζόντια → [1 2 3 4]
d = [a; b] % κάθετα → [1 2; 3 4]
% Indexing — διαλέγω στοιχεία από έναν πίνακα
x = [0 0 1 1 1 1];
y = x(2) % το 2ο στοιχείο: 0
z = x(2:4) % τα στοιχεία 2-4: [0 1 1]
Χρήσιμες πληροφορίες για ένα διάνυσμα/πίνακα
size(A) % [γραμμές, στήλες]
[m, n] = size(A);
length(v) % αριθμός στοιχείων σε διάνυσμα (= max(size))
numel(A) % συνολικός αριθμός στοιχείων
who % λίστα μεταβλητών στο workspace
whos A % λεπτομερή στοιχεία της μεταβλητής A
Πράξεις: η μεγαλύτερη παγίδα — * vs .*
Αυτό είναι το κορυφαίο σημείο που οι φοιτητές κάνουν λάθος. Είναι και κορυφαίο θέμα εξέτασης.
Πράξεις πινάκων (αλγεβρικές)
A + B % πρόσθεση (στοιχείο-προς-στοιχείο, ίδιες διαστάσεις)
A - B % αφαίρεση
A * B % πολλαπλασιασμός ΠΙΝΑΚΩΝ — γραμμή · στήλη, χρειάζεται συμβατές διαστάσεις
A / B % A * inv(B)
A \ B % inv(A) * B — λύσιμο γραμμικού συστήματος
A^2 % A * A — πολλαπλασιασμός πινάκων με τον εαυτό του
Στοιχείο-προς-στοιχείο πράξεις (element-wise)
Βάζεις τελεία . μπροστά:
A .* B % στοιχείο-προς-στοιχείο πολλαπλασιασμός
A ./ B % στοιχείο-προς-στοιχείο διαίρεση
A .^ 2 % κάθε στοιχείο στο τετράγωνο
Πράξεις με διανύσματα διαφορετικών διαστάσεων
Για πρόσθεση/αφαίρεση τα διανύσματα πρέπει να έχουν ίδιο μέγεθος. Αν ένα είναι γραμμή και το άλλο στήλη:
row = [1 2 3]; % 1×3
column = [4; 5; 6]; % 3×1
row + column % WARNING: παλιότερα ήταν error, σε νέες εκδόσεις κάνει broadcasting
% Σωστή χρήση:
row + column' % και τα δύο 1×3
row' + column % και τα δύο 3×1
Built-in συναρτήσεις βιβλιοθήκης
Το MATLAB έχει εκατοντάδες έτοιμες. Οι πιο χρήσιμες για το μάθημα:
| Κατηγορία | Συναρτήσεις |
|---|---|
| Τριγωνομετρικές | sin, cos, tan, asin, acos, atan, atan2 |
| Εκθετικές/Λογάριθμοι | exp, log, log2, log10, sqrt |
| Μιγαδικοί | abs, angle, real, imag, conj |
| Στρογγυλοποίηση | fix, floor, ceil, round |
| Στατιστικές | max, min, mean, median, std, var, sum, prod |
| Σήματα | fft, ifft, conv, filter, freqz, sinc |
Plotting — πώς εμφανίζεις σήματα
Η εντολή plot για συνεχή σήματα
x = -pi:0.01:pi;
y = sin(x);
plot(x, y)
grid on
title('sin(x)')
xlabel('x (rad)')
ylabel('y')
Δύο σήματα στο ίδιο γράφημα:
y1 = sin(x);
y2 = cos(x);
plot(x, y1, x, y2) % διαφορετικά χρώματα αυτόματα
legend('sin', 'cos')
Ή με hold on (συσσώρευση):
plot(x, y1)
hold on
plot(x, y2)
legend('sin', 'cos')
hold off
Η εντολή stem για διακριτά σήματα
n = 0:20;
x = cos(pi*n/3);
stem(n, x)
title('cos(n\pi/3)')
xlabel('n')
stem ζωγραφίζει μια κάθετη γραμμή σε κάθε δείγμα, με κουκίδα στην κορυφή — αυτή είναι η οπτική σύμβαση για διακριτά σήματα.
Πολλαπλά γραφήματα — subplot
Για να βάλεις δύο plots στο ίδιο figure window, ένα κάτω από το άλλο:
x = -pi:0.01:pi;
subplot(2, 1, 1) % 2 γραμμές × 1 στήλη, τρέχουσα θέση = 1
plot(x, sin(x))
title('sin')
subplot(2, 1, 2)
plot(x, cos(x))
title('cos')
Το subplot(2,1,1) διαβάζεται «2 γραμμές, 1 στήλη, διάλεξε την 1η θέση». Παλιότερη γραφή subplot(211) σημαίνει το ίδιο πράγμα.
Scripts vs Functions — κορυφαία ερώτηση εξέτασης
Στο MATLAB γράφεις κώδικα σε αρχεία .m. Υπάρχουν δύο είδη τέτοιων αρχείων.
Scripts
Μια λίστα εντολών. Δουλεύει σαν να τις πληκτρολόγησες μία-μία στο command window. Έχει πρόσβαση στο workspace και αλλάζει τις μεταβλητές του.
% αρχείο: myScript.m
x = 1:10;
y = x.^2;
plot(x, y)
Στο command window:
>> myScript % τρέχει όλες τις εντολές, το x και y μένουν στο workspace
Functions
Έχουν inputs και outputs, και δικό τους τοπικό workspace — οι μεταβλητές μέσα στη function δεν επηρεάζουν το έξω.
% αρχείο: randint.m (πρέπει το αρχείο να έχει το ίδιο όνομα με τη function!)
function a = randint(m, n)
% This function generates an mxn matrix of random integers between 0 and 9
a = floor(10 * rand(m, n));
end
Καλείται:
>> A = randint(5, 3); % φτιάχνει 5×3 πίνακα με τυχαίους ακέραιους 0-9
Όταν θέλεις πολλαπλά outputs, βάζεις τα ονόματα σε αγκύλες:
function [a, b, c] = myFunc(x, y)
a = x + y;
b = x - y;
c = x * y;
end
και την καλείς:
>> [s, d, p] = myFunc(3, 4); % s=7, d=-1, p=12
Anonymous functions — μικρά function χωρίς αρχείο
Όταν θες μια απλή function χωρίς να φτιάξεις ξεχωριστό αρχείο, υπάρχει συντομογραφία:
>> square = @(x) x.^2;
>> square(5)
ans = 25
>> f = @(x) sin(4*x) - log(x);
>> f(0.5)
ans = 1.6024 % sin(2) − ln(0.5) ≈ 0.9093 + 0.6931 (το MATLAB log είναι ο φυσικός λογάριθμος)
Το @(x) σημαίνει «δημιουργώ μια function με όρισμα x». Μπορεί να έχει πολλαπλά ορίσματα: f = @(x, y) x.^2 + y.^2.
Τα anonymous functions είναι απίστευτα χρήσιμα στο Lab 3 όπου ορίζουμε «συστήματα» σαν συναρτήσεις.
Flow control — for, if, while
for loop
for k = 1:10
x(k) = cos(k);
end
αλλά ισοδύναμα (και πολύ πιο γρήγορα) με vectorization:
k = 1:10;
x = cos(k);
if statement
if a <= 2
b = 1;
elseif a >= 4
b = 2;
else
b = 3;
end
Τελεστές σύγκρισης: ==, ~= (όχι ίσο), <, >, <=, >=. Όχι = — το = είναι ανάθεση τιμής.
while loop
n = 0;
while n < 10
n = n + 1;
end
Quick recap
Ό,τι μάθαμε εδώ θα το δούμε σε κάθε επόμενο lab. Πριν προχωρήσεις, βεβαιώσου ότι είσαι άνετος/η με:
- Δήλωση πίνακα με
[ ; ], indexing με( ). - Δημιουργία διανύσματος χρόνου με
:ήlinspace. *vs.*— πότε χρειάζεσαι τελεία.plotγια συνεχή,stemγια διακριτά,subplotγια πολλά γραφήματα.- Διαφορά script vs function. Anonymous function με
@(x). - Vectorization αντί για for-loop.
Lab 2 — Συνεχή & διακριτά σήματα →
Φτιάχνουμε χρονικά διανύσματα, ζωγραφίζουμε cosines, βηματικές συναρτήσεις, ράμπες, ορθογώνιους παλμούς. Υπολογίζουμε ενέργεια αριθμητικά με trapz.
Τελείωσες αυτή τη σελίδα;