Class Hub
Lab · 1 of 6·~30 min

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.

Τελείωσες αυτή τη σελίδα;

Φόρτωση σχολίων…
Lab 1 — Εισαγωγή στο MATLAB · Signal Processing Class Hub