Matlab - Intro
Matlab - Intro
A.A. 2006-2007
INTRODUZIONE A MATLAB
Casi particolari: M=1 (vettore riga); N=1 (vettore colonna); M=N=1 (scalare)
2
PERCHE USEREMO MATLAB ?
Matlab ha in se' centinaia di funzioni che possono essere built-in (es. det,
inv, ...) o incluse in toolbox opzionali (es. funzione remez nel Signal
Processing Toolbox) la cui licenza si acquista a parte.
Nei programmi che scriviamo in Matlab di solito richiamiamo queste funzioni (o
altre scritte da noi !). Grazie a queste funzioni, scrivere un programma in
Matlab per risolvere un problema ingegneristico che coinvolge calcolo
scientifico risulta molto pi semplice e veloce che usare linguaggi come
Fortran, Pascal, C, ...
Poich il codice Matlab viene scritto in file di testo, immediatamente
trasferibile ad altre piattaforme dove Matlab installabile (UniX, Mac,
Windows, VAX, ...).
Un codice Matlab viene di fatto interpretato, ma anche teoricamente
possibile compilarlo tramite il Matlab Compiler (che per in questo corso non
useremo mai) rendendo cos al contempo chiuso il sorgente e pi veloce
3
lesecuzione.
OPERAZIONI DI ASSEGNAZIONE
Dalla Command Window si possono assegnare valori a variabili in modo
intuitivo.
Osservazioni
Se non metto il punto e virgola (;) dopo
lassegnazione, Matlab fa un eco
Matlab non richiede la dichiarazione delle variabili.
Matlab case-sensitive
I nomi delle variabili sono a piacere (ma non
possono cominciare con un numero, includere
spazi e caratteri speciali, es. *, e non dovrebbero
coincidere con nomi riservati di comandi e funzioni,
es. pi)
Il contenuto della memoria di lavoro si chiama
workspace
Per vedere cosa ho nel workspace: who o whos
(who+size) 6
Osservazione:
A = [1 2 3; 4 5 6; 7 8 9] e
A = [...
123
456
789]
creano la stessa matrice 3 X 3 di nome A
Osservazione:
A = [1 2;3 4] + i*[5 6;7 8] e
A = [1+5i 2+6i;3+7i 4+8i]
creano la stessa matrice 2 X 2 ad elementi complessi.
A=[...
2 2 10 3
7 1 -3 4
1 5 6 -4]
10
Una matrice molto grande come ad es. dati (40 X 4) nellesempio sotto
pu essere salvata in un file di testo es. dati.dat e richiamabile nel
workspace con il comando load dati.dat
11
12
DIMENSIONE DELLE VARIABILI
Vettori
length(X) restituisce la lunghezza del vettore X
Matrici
[M,N]=size(X) righe e colonne della matrice X
size(X,1) numero di righe della matrice X
size(X,2) numero di colonne della matrice X
13
COMANDO FORMAT
Internamente, Matlab usa sempre doppia precisione. Per lesterno, si
possono usare vari formati:
format short
pi
ans =
format short virgola fissa, 5 cifre 3.1416
format short e
pi
format short e virgola mobile, 5 cifre. ans =
3.1416e+000
format long e virgola mobile, 15 cifre.
format long e
pi
ans = 14
3.141592653589793e+000
GESTIONE DI STRINGHE
Definizione e concatenamento
di stringhe
A='pinco'
B='pallino'
C=[A ' ' B]
Conversione di numeri in
stringhe
E=67
ES=num2str(E)
P=[C ES]
15
16
17
Ogni volta che Matlab viene chiuso il workspace viene perso. Comandi utili:
save <File> salva nel file File.mat tutte le variabili del workspace
load <File> carica nel workspace tutte le variabili presenti in File.mat
save <File> <Variabili> salva nel file File.mat le variabili in Variabili
load <File> <Variabili> carica nel workspace le variabili Variabili del file File.mat
18
RIEPILOGO
19
20
Per generare un vettore A di N elementi equispaziati tra Min e Max,
posso anche usare il comando:
A = linspace(Min, Max, N)
Il comando
A=logspace(Min, Max, N)
genererebbe invece N valori equispaziati su scala logaritmica
21
u=15+5*rand(50,1)
vettore colonna di lunghezza 50 con elementi tratti da una distribuzione
uniforme tra 15 e 20
22
RIEPILOGO
23
ALTRI ESEMPI
24
ESEMPI DI OPERAZIONI SULLE MATRICI
Trasposizione di matrice
Esempio:
>> a=2*eye(2)
a=
2 0
0 2
Esempio:
>> a=ones(2,3);
>> b=ones(2,3);
>> a+b
ans =
2 2 2
2 2 2
26
Naturalmente, quando si richiede di eseguire somma, differenza e prodotto,
le dimensioni delle matrici coinvolte devono essere compatibili. Ad
esempio, se usassimo a e b della slide precedente:
>> a*b
??? Error using ==> *
Inner matrix dimensions must agree.
>> a*b'
ans =
3 3
3 3
27
Elevamento a potenza
Per esempio:
>> x=ones(2,2);
>> x^2
ans =
2 2
2 2
>> x.^2
ans =
1 1
1 1
28
Altro esempio
>> x=[-1,2];
>> x^2
??? Error using ==> ^
Matrix must be square.
>> x.^2
ans =
1 4
29
Osservazione:
Mettere il . prima
delloperatore cambia
loperazione drasticamente
perch significa elemento
per elemento
30
Divisione
equivale a a*inv(b)
31
det(X) : determinante di X.
rank(X) : rango di X.
trace(X): traccia di X.
inv(X) : matrice inversa di X.
eig(X) : autovalori di X.
poly(X) : polinomio caratteristico di X.
32
norm(X, p): norma p di X (matrice o vettore che sia)
Esempi: min, max, sort
33
colonne di V = autovettori di a
autovalori di a
34
Esempi: lu
35
Manipolazione di matrici
36
RIEPILOGO
37
Funzioni matematiche
cos, sin, cosh, sinh, tan, tanh, asin, asinh, acos, acosh, ...
log, log10, log2, exp,
abs, mod,
sqr, sqrt,
round, floor, ceil,
sign
38
Si possono cos calcolare funzioni di matrici:
>> a=zeros(1,2)
a=
0 0
>> b=cos(a)
b=
1 1
x=
39
RIEPILOGO
40
GESTIONE DI POLINOMI
Valutazione:
Radici:
41
42
Nellhelp, per soli motivi grafici, la funzione viene scritta in maiuscolo,
ma va usata comunque in minuscolo !!!
44
COMANDO diary (=big brother )
45
47
TIPI DI M-FILES
Scripts: sono files di comandi. Non hanno variabili in entrata e in uscita e
operano sulle variabili del workspace
% Questo file calcola la radice degli elementi di
% una matrice a, se a>0, altrimenti stampa un messaggio di errore
if a>=0
a=sqrt(a)
Attenzione: nel workspace deve essere stata definita una
else
variabile a
disp('errore')
end
E buona abitudine sia negli scripts che nelle functions inserire dei commenti
I commenti sono segnalati da %: Matlab ignora tutti i caratteri dellintera riga
dopo il %
Le prime righe di commento di uno script o di una function diventano parte dell
help online
50
GESTIONE DELLA WORKING DIRECTORY
>> what analogo a dir, ma mostra solo i file .m, .mat, .mdl
51
OPERATORI RELAZIONALI
Gli operatori relazionali pi comuni sono:
== uguale
~= diverso da
< minore di
<= minore o uguale
Si usano nelle strutture if o while oppure per in operazioni di verifica (vd
esempi sotto)
Esempi:
>> x=2;
>> x==0 (questa relazione e falsa:)
ans =
0
>> x==2 (questa relazione vera)
ans =
1 52
Gli operatori relazionali possono essere applicati anche alle matrici:
53
eq - Equal ==
ne - Not equal ~=
lt - Less than <
gt - Greater than >
le - Less than or equal <=
ge - Greater than or equal >=
54
OPERATORI LOGICI
Gli operatori logici pi comuni sono:
& and logico
| or logico
~ not logico
Esempi:
>> x=1; y= -1;
>> x>0 & y>0 (questa relazione falsa)
ans =
0
>> x>0 | y>0 (questa relazione vera)
ans =
55
1
56
USO DEGLI OPERATORI LOGICI SU MATRICI
57
STRUTTURE DI PROGRAMMAZIONE
58
STRUTTURA IF ELSEEND
Struttura:
if espressione
istruzioni
else Esempio:
istruzioni
end
if mod(x,2)==0
disp(numero est pari)
else
disp(numero dispari)
end
59
if espressione
istruzioni Esempio:
elseif espressione
if a>0
istruzioni
else disp(a positivo);
istruzioni elseif a == 0
end disp(a nullo);
else
disp(a negativo);
end 60
CICLO FOR END
Il ciclo for ha la struttura:
Esempio
s=0;
for i=1:10 s=0;
s=s+i; for i=1:2:10
end s=s+i;
end
calcola la somma dei numeri interi61 dispari
calcola la somma dei primi 10 numeri interi (55)
minori di 10 (25)
while espressione
istruzioni
end
Esempio
Esempio 2
i=1;
x=input('voto esame (0 per finire)');
sommavoti=0;
n=0;
while i<5
while x~=i=i+1;0
end
sommavoti=sommavoti+x;
n=n+1;
i
x=input('voto esame (0 per finire)');
>> i
end
i=
media=sommavoti/n;
disp(['la media calcolata est=' num2str(media)])
5 62
I cicli possono essere uno dentro laltro.
64
Oss. trucchi per migliorare la velocita
T=0.05;
for i=0:100
t(i+1)=i*T+1;
y(i+1)=log(t(i+1));
end %i
Fa la stessa cosa di
t=(0:1:100)
y=log(t+1)
65
66
GRAFICI
67
>> x=[0:0.01:2];
>> f=cos(4*x).*exp(x);
>> plot(x,f)
68
ISTRUZIONE PLOT
Una serie temporale (senza asse ascisse)
plot(y)
Una funzione
Con i circoletti
plot(t,y,'o')
Circoletti + linea
plot(t,y,'o',t,y)
Circoletti + linea rossa
plot(t,y,'o',t,y,'r')
Circoletti+linea rossa tratteggiata
plot(t,y,'o',t,y,'r--') 69
Piu' figure
figure(1)
plot(t1,y1)
figure(2)
70
plot(t2,y2)
ISTRUZIONE SUBPLOT
Listruzione subplot(M,N,K) crea una figura contenente M*N riquadri, distribuiti
su M righe ed N colonne. Lindice K indica che il plot che segue, con annessi
title, xlabel, etc.., si riferisce al K-esimo riquadro (con K che pu assumere
valori fra 1 e M*N)
figure(n) : apre la figura n. Se la figura n gia esistente, la rende la figura attiva, ovvero
quella su cui i plot avranno effetto.
close: chiusura finestra grafica corrente
close all: chiusura di tutte le finestre grafiche
close (n) : chiude la figura n
clf: cancellazione grafici, riquadri etc dalla figura corrente
title(stringa) : Inserisce il titolo nella figura attiva. stringa pu contenere sequenze LaTeX.
ylabel(stringa) : aggiunge del testo allasse delle ordinate.
xlabel(stringa) : aggiunge del testo allasse delle ascisse.
ylabel('concentration c_{a}(t)')
xlabel('concentration c^{b}(t)')
73
40
35
30
bar([0:.25:1],[10:10:50]) 25
20
15
10
5
0
-0.2 0 0.2 0.4 0.6 0.8 1 1.2
350
150
0
30 35 40 45 50 55 60 65
hist(50+4*randn(1,5000),50)
74
stem(x,y): adatto quando si 1
0.8
discreto 0.2
x=[0:0.1:2*pi]; -0.2
-0.4
y=sin(x); -0.6
stem(x,y) -0.8
-1
0 1 2 3 4 5 6 7
76
Esempi semplici di M-file
Esempio 1
% qui posso mettere tutti i commenti che mi pare
t=(0:1:100)';
y=5*exp(-0.05*t);
ts=(0:5:100)';
ys=5*exp(-0.05*ts);
plot(t,y,'r--',ts,zs,'bo')
grid
title('curva e campioni rumorosi')
xlabel('tempo')
ylabel('concentrazione')
77
Esempio 2
% esempio di programma che disegna
% 5 decay esponenziali sovrapposti
% nb: comando hold on, hold off, pause
t=(0:0.01:10)';
tau0=0.5;
figure(1)
hold on
for k=1:5
tau=k*tau0;
y=exp(-t/tau);
plot(t,y)
pause
end
hold off
78
Esempio 3
% esempio di programma che disegna
% decay esponenziali, uno dopo l'altro e a volont, sulla stessa
figura
% NB comandi while ed input
t=(0:0.01:10)';
tau0=0.5;
ancora='s'
k=1;
figure(1)
clf
hold on
while ancora=='s'
tau=k*tau0;
y=exp(-t/tau);
plot(t,y)
ancora=input('Vuoi continuare (s/n) ? ')
k=k+1
end
hold off 79
Esempio 4
% esempio di programma che disegna
% 5 decay esponenziali su 5 subplot
% comandi eval, num2str, e subplot
t=(0:0.01:10)';
tau0=0.5;
figure(1)
for k=1:5
tau=k*tau0;
y=exp(-t/tau);
stringa1=['subplot(5,1,' num2str(k) ')'];
eval(stringa1)
plot(t,y)
end
80