400 likes | 677 Views
Introduzione a Matlab. Emanuele Maiorana Corso di Trasmissioni Numeriche. Roadmap. Saranno presentate le caratteristiche di base del sistema MATLAB TM (MATrix LABoratory) Operazioni elementari su scalari, vettori e matrici Script Funzioni Visualizzazione Demo Simulink. Intro.
E N D
Introduzione a Matlab Emanuele Maiorana Corso di Trasmissioni Numeriche
Roadmap • Saranno presentate le caratteristiche di base del sistema MATLABTM (MATrix LABoratory) • Operazioni elementari su scalari, vettori e matrici • Script • Funzioni • Visualizzazione • Demo • Simulink
Intro MATLAB è uno strumento di analisi dati e di visualizzazione largamente usato da ingegneri elettronici e non per attività di ricerca e simulazione. MATLAB utilizza funzioni esattamente come script C (o C++), consentendo agli utilizzatori anche di crearne di propri. La differenza fondamentale dal C è che le funzioni MATLAB sono scritte specificatamente per operazioni su grandi array, e si basa su una rappresentazione vettoriale di ogni variabile. L’utilizzo di MATLAB, a differenza del C, utilizza pesantemente la memoria del computer, e i tempi di elaborazione sono molto elevati. Di contro, offre una facilità di utilizzo e una intuitività delle funzioni molto maggiore.
Help Finestra di Workspace e Directory Modifica cartella di lavoro Chiusura Finestra Inserimento comandi e funzioni Inserimento comandi Utilizzo comandi precedenti Barra separatrice (modificabile) Interfaccia grafica
Commenta le linee selezionate e specifica lo stile di formattazione nel menu Text Trova e sostituisci stringhe Impostando Breackpoints si può mettere in pausa i programmi durante l’esecuzione e valutarne l’andamento Tenendo il cursore su una variabile viene mostrato il suo valore attuale Edit window • Ambiente di editing degli M-files (scripts e functions) • Puo’ essere usato qualsiasi editor di testo • Matlab dispone di un text-editor integrato
Comandi di recupero informazioni • On-line help • helpargomento: fornisce l’help sull’argomento indicato • helpwin: help interattivo completo • Workspace information • who, whos: elenca le variabili correntemente in uso • clear: rimuove tutte le variabili in uso • clear x,y,z • clear all • Directory information • pwd: mostra la directory di lavoro corrente • cd: cambia la directory di lavoro corrente • dir: mostra il contenuto della directory di lavoro corrente • ls: stesso comportamento di dir
Inserimento comandi • Per inserire comandi, basta digitare il comando al prompt. • Es.1: • >> pi • ans = • 3.1416 • >> • Matlab crea una variabile ans a cui assegna il valore richiesto (in questo caso pi greco) • Es.2: • >> help DCT • DCT Discrete cosine transform. • Y = DCT(X) returns the discrete cosine transform of X. • The vector Y is the same size as X and contains the • discrete cosine transform coefficients. • Y = DCT(X,N) pads or truncates the vector X to length N • before transforming. • If X is a matrix, the DCT operation is applied to each • column. This transform can be inverted using IDCT. • See also fft, ifft, idct. • Reference page in Help browser • doc dct
Grandezze Scalari Esempi di comandi >> 13*9 ans = 117 >> sqrt(167) ans = 12.9228 >> sin(pi/6) ans = 0.5000 >> i ans = 0 + 1.0000i La variabile ans viene utilizzata da MATLAB per la memorizzazione il risultato più recente non assegnato ad altre variabili i e j se non assegnate rappresentano l’unità immaginaria
Assegnazione variabili Esempi di assegnazione scalari e vettori/matrici >> x=5.5 x = 5.5000 >> y=x^2 y = 30.2500 >> z=y-x z = 24.7500 >> a=[1 2 3 4 5 6] a = 1 2 3 4 5 6 >> b=[1 ; 2 ; 3 ; 4 ; 5 ; 6] b = 1 2 3 4 5 6 >> A = [1 2 3; 4 5 6; 7 8 9] A = 1 2 3 4 5 6 7 8 9 >>
Operazioni sulle Variabili Operazioni fondamentali >>B = [ 1 2 3 4 5 6 7 8 9] B = 1 2 3 4 5 6 7 8 9 >> isequal(A,B) ans = 1 >> size(A) ans = 3 3 Si può utilizzare il tasto ENTER anche se l’espressione non è ancora completa, ma MATLAB non la esegue fino al suo completamento Funzione Booleana: restituisce 1 se le variabili sono uguali, 0 in caso contrario Restituisce le dimensioni della matrice, nell’ordine di righe e colonne
Operazioni sulle Variabili Operazioni fondamentali Ordine: prima righe, poi colonne Il carattere : viene utilizzato per indicare un intero intervallo (tutte le righe in questo caso) Matrice Trasposta >> A(2,3) ans = 6 >> A(:,2) ans = 2 5 8 >> A' ans = 1 4 7 2 5 8 3 6 9 >>
Operazioni sulle Variabili Operazioni fondamentali Matrice Inversa; può restituire errore nel caso di matrici singolari o quasi singolari Prodotto Righe per Colonne tra due matrici Prodotto Puntuale: si ottiene premettendo il carattere . all’operazione da realizzare. L’operazione viene effettuata elemento per elemento >> inv(A) ans = 1.0e+016 * 0.3152 -0.6304 0.3152 -0.6304 1.2609 -0.6304 0.3152 -0.6304 0.3152 >> A*B ans = 30 36 42 66 81 96 102 126 150 >> A.*B ans = 1 4 9 16 25 36 49 64 81
Operazioni sulle Variabili Operazioni fondamentali >> A^2 ans = 30 36 42 66 81 96 102 126 150 >> A.^2 ans = 1 4 9 16 25 36 49 64 81 >> >> C = [1 2 3; 4 5 6] C = 1 2 3 4 5 6 >> C^2 ??? Error using ==> mpower Matrix must be square. >> C.^2 ans = 1 4 9 16 25 36 >> Esempio di operazione di potenza su una matrice. L’operazione può essere fatta direttamente solo nel caso di matrici quadrate Utilizzando l’operatore puntuale si ottiene l’operazione elemento per elemento
Vettori e Matrici In MATLAB è importante ricordare che tutti i vettori sono indicizzati partendo da 1. x(1) Nel caso di sequenze con riferimento temporale assoluto sarà necessario prevedere un secondo riferimento dei tempi. Es.: x(n) = sin(n/2)[u1 (n+10)-u1(n-11)] >> nx = -10:10; >> x = sin(pi/2*nx) x = Columns 1 through 11 -0.0000 -1.0000 0.0000 1.0000 -0.0000 -1.0000 0.0000 1.0000 …
Notazione a colonna • Il carattere : indica un ciclo implicito, usato per creare vettori: • >> x=1:5 • x = • 1 2 3 4 5 • >> • Si può introdurre anche un incremento non intero: • >> x=1:.1:2 • x = • 1.0000 1.1000 1.2000 1.3000 1.4000 1.5000 1.6000 1.7000 1.8000 1.9000 2.0000 • Es.: Visualizzare la funzione x(n) = sin(n/2)[u1 (n+10)-u1(n-11)]
Matrici • Per inserire matrici, si usano parentesi quadre: • >> a=[2, 3; 1, 2] • a = • 2 3 • 1 2 • >> • Non e’ necessario dimensionare la matrice: la memoria richiesta e’ allocata automaticamente. • Per evitare la visualizzazione automatica della risposta è necessario • terminare il comando con un ; • >> a=[2, 3; 1, 2]; • >> • non produce nessun output.
Matrici • E’ possibile costruire matrici automaticamente: • >> a=zeros(2) • a = • 0 0 • 0 0 • >> • mentre: • >> a=zeros(2,3) • a = • 0 0 0 • 0 0 0 • >> • Funzioni di Matlab (come zeros) accettano un numero variabile di elementi in input. • ones (genera matrici di 1) • rand (genera matrici di numeri casuali) • eye (genera le matrici identità)
Operazioni su vettori Matlab esegue automaticamente le operazioni algebriche sulle matrici: • >> a=ones(2,3); • >> b=ones(2,3); • >> a+b • ans = • 2 2 2 • 2 2 2 • >> • o anche: • >> a=2*eye(2) • a = • 2 0 • 0 2 • >>
Funzioni di matrici • >> a=zeros(1,2) • a = • 0 0 • >> b=cos(a) • b = • 1 1 • >> • Per calcolare una potenza invece devo agire sulle singole • componenti. Questo si ottiene con l’operatore . (punto): • >> x=[-1,2]; • >> x^2 • ??? Error using ==> mpower • Matrix must be square. • >> x.^2 • ans = • 1 4
Funzioni di matrici • Per manipolare l’orientamento delle matrici si possono utilizzare le funzioni: • >> flipud(A) • ans = • 7 8 9 • 4 5 6 • 1 2 3 • >> fliplr(A) • ans = • 3 2 1 • 6 5 4 • 9 8 7 • >> rot90(A) • ans = • 3 6 9 • 2 5 8 • 1 4 7
Operatori relazionali • Sono utilizzabili in MATLAB i seguenti operatori relazionali • == : uguale • ~= : diverso da • < : minore di • <= : minore o uguale • Esempio: • >> x = 2; • >> x == 0 • ans = • 0 >> x == 2 ans = 1 >> x ~= 3 ans = 1
Operatori relazionali • Possono essere applicati anche alle matrici: • >> a=[1 2; 0 -1]; • >> a > 0 • ans = • 1 1 • 0 0 • >> a >= 0 • ans = • 1 1 • 1 0 • >>
Cicli IF • Il ciclo basato su if ha la struttura: • if expression • statements • end • L’utilizzo di elseif necessita la seguente struttura • if expression1 • statements1 • elseif expression2 • statements2 • else • statements3 • end • Es.: • if ((attendance >= 0.90) && (grade_average >= 60)) • pass = 1; • end;
Cicli FOR • Il ciclo for ha la struttura: • for variable = expression • statements • end • Di solito espressione è un vettore: • >> s=0; • >> for i=1:10 • s=s+i; • end • >> s • s = • 55 • >> • calcola la somma dei primi 10 numeri interi
Cicli annidati • I cicli for possono essere uno dentro l’altro. Es.: • >> n=4; • >> for i=1:n • for j=1:i • a(i,j) = 1; • end • end • crea una matrice triangolare inferiore: • >> a • a = • 1 0 0 0 • 1 1 0 0 • 1 1 1 0 • 1 1 1 1 • Es.: • >> a = zeros(k,k) % Preallocate matrix • for m = 1:k • for n = 1:k • a(m,n) = 1/(m+n -1); • end • end • >> a • a = • 1.0000 0.5000 0.3333 • 0.5000 0.3333 0.2500 • 0.3333 0.2500 0.2000
Cicli annidati • L’utilizzo dei cicli for, applicato su Matrici in MATLAB, è particolarmente pesante per l’elaborazione. • Esempio: utilizzo della funzione tic toc • >> tic; for i = 1:10ˆ6, sin(i);end; toc; • Elapsed time is … seconds. • >> tic; i=1:10ˆ6; sin(i); toc; • Elapsed time is … seconds.
Cicli WHILE … END • Il ciclo while ha la seguente struttura • while expression • statements • end • Esempio • >> i=1; • >> while i<5 • i=i+1; • end • >> i • i = • 5 • Es.: • >> eps = 1; • while (1+eps) > 1 • eps = eps/2; • end • eps = eps*2 • >> eps • eps = • 2.2204e-016
M-files • Un file .m è un programma riconoscibile da Matlab. • La scrittura di files .m permette di: • testare un algoritmo • ottenere una documentazione del lavoro svolto • riutilizzo dei programmi cambiando solo i dati • distribuzione del codice
Scripts - Functions • Una funzione MATLAB è una parola di codice che accetta in ingresso diversi parametri, e restituisce degli output dopo un’elaborazione • Scripts M-files: sono files di comandi. Non hanno variabili in entrata e in uscita e operano sulle variabili del workspace • Function M-files: sono files di comandi, che hanno argomenti in entrata e in uscita. Le variabili interne a questi programmi non influenzano le variabili del workspace • Non assegnare a nessuno script o funzione il nome di funzioni predefinite o il nome di una variabile usata!!!
Esempio % Script di esempio TSES_01_script.m % Disegno del valore assoluto della funzione sin(2*pi*freq*t) % su mille campioni equispaziati nell’intervallo t [0,1). Tmax = 1; % Durata samples = 1000; % Numero campioni delta = Tmax / samples; % DeltaT freq = 1; t = 0:delta:Tmax-delta; s = abs(sin(2*pi*freq*t)); % for i = 1:samples; % t(i) = (i-1) * delta; % s(i) = abs(sin(2*pi*freq*t(i))); % end; plot (t,s); grid on; title('ABS(Sin)'); xlabel('Tempo (Sec.)'); ylabel('Ampiezza');
Funzioni Funzione: si crea come uno script – ma concettualmente molto diversa!!! Il file contenente la funzione DEVE avere estensione .m e DEVE avere lo stesso nome della funzione La funzione puo’ ricevere e restituire dei risultati. Il passaggio dei parametri avviene per valore IMPORTANTE: le variabili definite all’interno della funzione hanno visibilita’ locale e NON possono essere riferite dalla shell Uso della dichiarazione global per l’utilizzo delle variabili nel Workspace su tutti i programmi
Esempio • function [xmin,xmax]=minmax(a,m,n) • %MINMAX(A,M,N) calcola l'elemento minimo, XMIN, e l’elemento • % massimo, XMAX della matrice A con M righe ed N colonne • %xmin=-Inf; xmax=Inf; • for i=1:m • for j=1:n • if a(i,j) > xmax • xmax = a(i,j); • end • if a(i,j) < xmin • xmin = a(i,j); • end • end • end • Dove si trova l’errore nella funzione? • Come si può migliorarla passando solamente la matrice a?
Dichiarazione di una funzione • function [out1,out2,…]=funz(in1,in2,….) • Gli argomenti in output vanno a sinistra dell’ =, fra [ ] • Gli argomenti in input vanno a destra dell’ = , fra ( ) • Posso usare un numero di argomenti minore di quello indicato nella definizione della function, sia in entrata che in uscita. • Es.: a=funz(b), assegna a “in1” il valore “b”, e ad “a” il valore “out1”
Grafici • Per ottenere un grafico si devono effettuare i seguenti passi: • Preparare un vettore di ascisse • Preparare un vettore di ordinate • Fare il grafico • Esempio: grafico di cos(4x)*exp(x), su [0,2] • >> x=0:0.01:2; • >> f=cos(4*x).*exp(x); • >> plot(x,f) • Il comando figure crea una nuova finestra per immagini, consentendo di visualizzare diversi comandi plot
Grafico di circonferenza • >> t=0:0.01:2*pi; • >> x=cos(t); • >> y=sin(t); • >> plot(x,y,'g+') • >> axis equal
Grafico di Sinusoide • Questo esempio utilizza l’operatore colonna per creare una vettore di x valori inclusi tra 0 e 2, e successivamente ne calcola il seno, per poi graficare il risultato. • x = 0:pi/100:2*pi; • y = sin(x); • plot(x,y) • Lo script seguente edita gli assi della figura • xlabel('x = 0:2\pi') • ylabel('Sine of x') • title('Plot of the Sine Function','FontSize',12)
Grafici Multipli • y2 = sin(x-.25); • y3 = sin(x-.5); • plot(x,y,x,y2,x,y3) • legend('sin(x)','sin(x-.25)','sin(x-.5)')
DEMO • Matrici • Basic Matrix Operations • Matrix Manipulation • Integer Arithmetic Examples • Graphs and Matrices • Grafici • 2-D plots • 3-D plots • 3-D Surface Plots • Images and Matrices • Viewing a Penny • Quake • Toolboxes Communication • Bit Error Rate Analysis Tool (utilizzo di Simulink) • Eye Diagram and Scatter Plot • Signal Processing • Modulation/Demodulation
Simulink • Simulink è un pacchetto software di MATLAB che fornisce le funzionalità necessarie per: • la modellizzazione • la simulazione • l’analisi dei sistemi dinamici • E’ in grado di supportare: • sistemi lineari e non lineari • sistemi tempo discreto, tempo continuo o ibridi. • I modelli necessari per le simulazioni sono realizzabili utilizzando i blocchi funzionali forniti da MATLAB, che sono anche modificabili per le esigenze degli utenti.
Consigli fondamentali • Nella moltiplicazione di due matrici che rappresentano una immagine, fare attenzione a scrivere .* invece che *, dato che quest’ultimo sarebbe interpretato come moltiplicazione righe per colonne • Ricordarsi di inserire il carattere ; al termine di un comando, specialmente quando si lavora con immagini o video • Cercare di evitare il più possibile numerosi cicli for, e in special modo cicli annidati