Sei sulla pagina 1di 13

Capitolo 1

Introduzione alluso di Matlab


Lobiettivo di questo capitolo ` e quello di fornire gli elementi di base del linguaggio Matlab (MATrix LABoratory), necessari per lo studio e la sperimentazione dei concetti di elaborazione numerica dei segnali. Chi fosse interessato ad una guida completa pu` o trovare il manuale, disponibile in formato elettronico, al sito http://www.mathworks.com/access/helpdesk/ ` consigliabile accendere il computer durante la lettura di help/techdoc/matlab.shtml. E queste righe, ed avviare Matlab in modo da poter provare direttamente su linea di comando le istruzioni introdotte di seguito.

1.1

Variabili e operazioni elementari

La variabile base in Matlab ` e la matrice, che pu` o essere denita1 nel seguente modo: >> A = [1,2,3; 4,5,6] Il carattere , (virgola) (che pu` o anche essere omesso) separa gli elementi appartenenti ad una stessa riga della matrice, mentre ; (punto e virgola) separa le diverse righe. Il comando precedente denisce una matrice A, di dimensioni 2 3, ed assegna alla prima riga i valori ` importante sottolineare che, a dierenza di {1, 2, 3}, ed alla seconda i valori {4, 5, 6}. E altri linguaggi di programmazione, non ` e necessario specicare il tipo della variabile usata, ma questo risulta implicitamente denito in seguito allassegnazione dei valori che deve assumere.2 Per accedere ad un elemento della matrice basta fornire lindice di riga e quello di colonna; ad esempio, il comando >> a = A(1,3)
Nel seguito, i comandi Matlab verranno indicati in carattere truetype, mentre il simbolo >> rappresenta il prompt della nestra Matlab, e non va ovviamente digitato. Per migliore leggibilit` a del codice Matlab, si includono anche degli spazi bianchi, che per` o sono opzionali (tranne quando sono utilizzati come separatori di numeri). 2 Va osservato peraltro che tutte le variabili numeriche sono memorizzate in Matlab in formato double, ovvero in doppia precisione
1

Introduzione alluso di Matlab denisce la nuova variabile a ed assegna ad essa il valore 3 (riga 1, colonna 3 di A).3 Si noti che, se a questi comandi si fa seguire ;, si impedisce al Matlab di stampare a video loutput del comando impartito. Daltra parte, ` e sempre possibile visualizzare lo stato di una variabile digitandone il nome (senza punto e virgola), ed ` e anche possibile visualizzare linsieme di tutte le variabili presenti in memoria, e la loro dimensione, attraverso il comando whos o cancellarle mediante il comando clear. Pi` u precisamente, il comando >> whos; mostra linsieme delle variabili denite, il loro tipo, e la loro occupazione di memoria; invece con il comando >> clear a; si cancella la variabile a dalla memoria; clear all cancella tutte le variabili denite (in pratica inizializza Matlab, e quindi va utilizzato con cautela). Casi particolari di matrice sono la variabile scalare (matrice costituita da un solo elemento) ed il vettore (matrice costituita da una sola riga o da una sola colonna); in particolare, il comando >> b = 3; denisce la variabile scalare b e vi assegna il valore 3, mentre il comando >> c = [1,2,3,4,5,6]; denisce un vettore riga di 6 elementi con valori {1,2,3,4,5,6}; se al posto delle virgole si lasciano degli spazi si ottiene lo stesso risultato. Analogamente a quanto accade con le matrici, con il comando c(4) si accede al valore di posto 4. Viceversa, il comando >> c = [1;2;3;4;5;6]; denisce un vettore bf colonna di 6 elementi. Il comando c = [1,2,3,4,5,6] pu` o essere abbreviato con c = [1:1:6] che genera tutti i numeri fra 1 e 6 (inclusi) con passo 1. Nel caso particolare in cui, come adesso, il passo sia unitario, lo si pu` o omettere, e scrivere direttamente c = [1:6]. Loperatore : (due punti) ` e anche molto utile per estrarre una sottomatrice da una matrice. Supponiamo per esempio di aver denito una matrice D di dimensioni 9 8; il comando >> D(2:5,1:3);
In Matlab, a dierenza di altri linguaggi di programmazione (es. C, C++), gli indici delle matrici e dei vettori partono da 1 e non da 0.
3

1.1 Variabili e operazioni elementari estrae una matrice 4 3 da D le cui righe vanno dalla seconda alla quinta, mentre le colonne vanno dalla prima alla terza. Il comando >> D(2,:) estrae la seconda riga dalla matrice, per estrarre la seconda colonna basta digitare D(:,2). Il comando >> D(:) genera un vettore colonna 72 1 costituito dalle righe di D concatenate assieme. Di seguito si elencano alcuni operatori molto utili per la manipolazione di matrici. >> C = [A,B]; denisce la matrice C aancando le due matrici A e B, che devono avere lo stesso numero di righe. >> C = [A;B]; denisce la matrice C sovrapponendo le due matrici A e B, che devono avere lo stesso numero di colonne. >> A = zeros(N,M); denisce una matrice con N righe ed M colonne con elementi tutti nulli. >> A = ones(N,M); denisce una matrice con N righe ed M colonne con elementi tutti unitari. >> A = eye(N); denisce una matrice identit` a quadrata di N righe ed N colonne. >> B = A.; denisce B come trasposto di A. >> B = A; denisce B come hermitiano (trasposto e coniugato) di A (per le matrici reali lhermitiano coincide con il trasposto). Essendo la variabile base una matrice, le operazioni aritmetiche sono implicitamente denite come operazioni sulle matrici. Questo signica che il comando A*B eettua la moltiplicazione matriciale (righe per colonne) tra A e B, e quindi il numero di colonne di A deve

Introduzione alluso di Matlab essere uguale al numero di righe di B. Si ricordi inoltre che tale operazione non gode della propriet` a commutativa, per cui bisogna stare molto attenti sia allordine con cui si realizza, sia alle dimensioni delle due matrici. In ogni caso ` e possibile eettuare la moltiplicazione puntuale (elemento per elemento) tra due matrici delle stesse dimensioni, corrispondente alla moltiplicazione dei valori che si trovano nella stessa posizione della matrice. Per fare ci` o, basta anteporre il . (punto) alloperatore *. Questa regola vale in generale, cio` e ogni volta che si antepone il punto davanti ad un operatore aritmetico loperazione non ` e pi` u di tipo matriciale. Ad esempio, con la notazione >> A^2 si eettua la moltiplicazione matriciale di A con s e stessa; se si vuole semplicemente elevare al quadrato tutti gli elementi di A bisogna scrivere >> A.2 Esistono numerose funzioni che permettono di estrarre utili informazioni dalle matrici, di seguito se ne mostrano alcune: >> [M,N] = size(A); restituisce in M ed N il numero di righe e di colonne della matrice A; digitando semplicemente size(A) tali dimensioni vengono mostrate su schermo. >> L = length(a); restituisce in L la lunghezza (numero di elementi) del vettore a. >> B = fliplr(A); inverte lordine delle righe della matrice A: in pratica ogni riga viene riessa (ip) da sinistra a destra. >> B = flipud(A); inverte lordine delle colonne della matrice A: in pratica ogni colonna viene riessa (ip) dallalto al basso. >> min(A) se A ` e un vettore ne restituisce il valore minimo; se ` e una matrice calcola i minimi lungo ogni colonna e li restituisce in un vettore riga. Per ottenere il minimo della matrice usare min(min(A)) oppure min(A(:)). Il comando max(A) opera allo stesso modo per il massimo. >> mean(A)

1.2 Lhelp in linea del Matlab restituisce il valor medio, funziona come min(A). In particolare, se A ` e una matrice, mean(mean(A)) oppure mean(A(:)). restituisce il valor medio dellintera matrice. >> std(A) restituisce la deviazione standard, funziona come min(A); si noti per` o che, se A ` e una matrice, std(std(A)) restituisce la deviazione standard delle deviazioni standard calcolate lungo ogni colonna, mentre std(A(:)) restituisce la deviazione standard di tutti gli elementi della matrice. >> B = cos(A); denisce B come la matrice contenente il coseno di ogni elemento di A, la funzione cos opera quindi elemento per elemento. Si noti che la funzione elementare coseno ha di default un argomento che ` e di tipo matrice. Questa considerazione vale per numerose funzioni matematiche, come abs, log, sign, exp, e consente di semplicare molto la scrittura dei programmi.

1.2

Lhelp in linea del Matlab

Luso del Matlab ` e estremamente facilitato dallhelp in linea che permette di conoscere quali funzioni sono disponibili nel Matlab e nei suoi toolbox, cosa fanno e come devono essere usate. Il comando >> help invoca lhelp in linea di Matlab e restituisce la lista di argomenti sui quali ` e possibile avere informazioni; ` e una buona idea usarlo almeno una volta. Il comando >> help help spiega come usare lhelp e indica altri utili comandi, ad es. lookfor. Inne, il comando >> help <topic/command> invoca lhelp su un particolare argomento o comando, e suggerisce una lista di argomenti o comandi correlati con quello richiesto. Provate a digitare help seguito dalle funzioni che avete gi` a provato a usare, come mean, min, max, ... per vericarne il funzionamento ed avere altre utili indicazioni. Ad esempio il comando help ops visualizza una lista di tutti gli operatori (somma, prodotto, etc.) disponibili in Matlab. Utilizzate sempre lhelp in linea quando avete dubbi su come deve essere usato un determinato comando.

Introduzione alluso di Matlab

1.3

Costrutti di programmazione

Matlab possiede tutti i principali costrutti di programmazione (if, for, while, switch, si veda lhelp in linea). Per una programmazione eciente, tuttavia, bisogna osservare che Matlab ` e un linguaggio interpretato e non compilato, vale a dire che ogni istruzione deve essere trasformata in comandi pi` u semplici da un interprete al momento dellesecuzione, e poi eseguita. Questo fatto si riette in una maggiore lentezza di esecuzione rispetto ad un linguaggio compilato. Tuttavia, Matlab possiede istruzioni molto potenti per la manipolazione di vettori e matrici. Se riuscite a fare ricorso il pi` u possibile a queste istruzioni, evitando di utilizzare cicli for che accedono singolarmente a ciascun elemento di un vettore o di una matrice, i tempi di esecuzione miglioreranno sensibilmente. Come esempio, si considerino i seguenti tre metodi per sommare tutti gli elementi di una matrice A: Metodo 1: Metodo 2: Metodo 3: Asum=sum(A(:));

Asum=sum(sum(A)); [M,N] = size(A); Asum=0; for i = 1:M for j = 1:N Asum = Asum + A(i,j); end; end;

Il primo metodo ` e equivalente al codice della programmazione convenzionale (Fortran, Pascal, C, C++) e fa uso di un doppio ciclo for per scorrere tutti gli elementi della matrice. Il secondo usa la funzione sum di Matlab che funziona come min, e va quindi usata due volte se applicata ad una matrice, a meno di non concatenare le righe di tale matrice in un vettore con loperatore :. Questultima soluzione (terzo metodo) ` e la pi` u eciente: la funzione sum viene richiamata una sola volta e non sono presenti cicli for. La sequenza di espressioni che avete appena digitato su linea di comando pu` o anche essere memorizzata in un le di testo ed essere eseguita come uno script. Ci` o signica che bisogna creare un M-le in cui scrivere i comandi che vogliamo che vengano eseguiti. Per fare ci` o` e conveniente, dalla nestra del Matlab, seguire il percorso File/New/M-file e si pu` o subito cominciare a scrivere il codice. Dopo averlo salvato con estensione .m, basta digitare il suo nome da linea di comando e il programma verr` a eseguito. In alternativa si possono creare delle vere e proprie funzioni che realizzano le operazioni di cui abbiamo bisogno e che non sono gi` a presenti in Matlab. Facciamo subito un esempio scrivendo la funzione (banale) per il calcolo della somma degli elementi di una matrice. function s = matsum(A) % MATSUM somma tutti gli elementi di una matrice % % A: matrice di ingresso % s: somma degli elementi della matrice in uscita

1.3 Costrutti di programmazione [M N] = size(X); % controllo sulle dimensioni della matrice if( M == 1 & N == 1 ) error (Ingresso non corretto) end; s = sum(X(:)); LM-le che contiene la funzione deve avere il nome della funzione stessa, cio` e in questo caso andr` a chiamato matsum.m, per eseguirla basta richiamare il comando matsum(A) da linea di comando.4 Inoltre digitando help matsum verr` a visualizzato tutto ci` o che avete scritto nel commento iniziale usando il carattere % per descrivere il comportamento della funzione. Cercate quindi di documentare sempre e in modo appropriato le funzioni che scrivete in modo che possano essere utilizzate facilmente. Un metodo spesso usato per evitare i cicli for ` e quello di vettorizzare le operazioni logiche. Vediamolo con un esempio. Supponiamo di voler scrivere una funzione che eettua loperazione di saturazione dei dati (amplicatore reale), vale a dire se i dati contenuti in un vettore superano un certo valore limite (in modulo) essi vengono resi uguali proprio a tale valore. function y = clip(x, Limit) % CLIP satura i valori di x(n) al valore Limit % quando |x(n)| > Limit allora x(n)=Limit % % x: vettore di ingresso % Limit: valore di saturazione % y: vettore di uscita N = length(x); for n = 1:N if( abs(x(n)) > Limit ) x(n) = sign(x(n)) * Limit; end; end; y = x; Questo codice pu` o essere scritto in maniera pi` u eciente, dato che il ciclo for contiene un test logico, che pu` o essere convertito in unoperazione su vettori. Infatti risulta molto semplice eseguire controlli sui valori di vettori o matrici. Supponiamo per esempio di voler rendere nulli tutti gli elementi negativi del seguente vettore >> x = [1 2 -3 3 -2 1 4 0 -1];
A patto di trovarsi nella stessa directory dove si trova lM-le (utilizzate il comando cd per cambiare directory) oppure di avere inserito tale directory nel matlabpath (si veda lhelp in linea).
4

Introduzione alluso di Matlab ` suciente creare un vettore maschera i cui elementi valgono 1 quando gli elementi di x E sono positivi, 0 altrimenti, usando il seguente comando: >> mask = x > 0; Inne basta moltiplicare ogni elemento di x con quello corrispondente di mask per ottenere un nuovo vettore in cui gli elementi negativi sono trasformati in valori nulli: >> y = mask .* x; Queste stesse considerazioni si possono ripetere per la funzione clip, per cui facendo riferimento al codice precedente, tutto il ciclo pu` o essere riscritto in una unica istruzione vettoriale, come: function y = clip(x, Limit) % CLIP satura i valori di x(n) al valore Limit % quando |x(n)| > Limit allora x(n)=Limit % % x: vettore di ingresso % Limit: valore di saturazione % y: vettore di uscita y = Limit * (x > Limit) - Limit * (x < -Limit) + x.*(abs(x) <= Limit); Il numero di operazioni aritmetiche necessarie in questultimo caso ` e pari a 3N moltiplicazioni e 2N addizioni, dove N ` e il numero totale di elementi di x, superiore a quello del codice scritto precedentemente (si noti che vengono comunque calcolati valori di uscita per tutte e tre le condizioni logiche). Tuttavia questultima espressione deve essere interpretata una sola volta a dierenza del ciclo presente nella funzione clip, in cui le tre espressioni presenti devono essere interpretate ben N volte. In alternativa al mascheramento si pu` o usare la funzione find, non necessariamente pi` u eciente, che determina la lista degli indici in un vettore per cui una determinata condizione ` e vericata. Per esempio, il comando >> find(x > Limit) restituisce la lista degli indici in corrispondenza dei quali il vettore x ` e maggiore del valore Limit. Il codice precedente pu` o essere allora riscritto nel modo seguente: function y = clip(x, Limit) % CLIP satura i valori di x(n) al valore Limit % quando |x(n)| > Limit allora x(n)=Limit % % x: vettore di ingresso % Limit: valore di saturazione % y: vettore di uscita

1.4 Alcuni suggerimenti generali per la programmazione in Matlab y = x; index = find(y > Limit); y(index) = Limit * ones(size(index)); index = find(y < -Limit); y(index) = -Limit * ones(size(index)); Vericate che questo codice funziona e cercate di capire il perch e.

1.4

Alcuni suggerimenti generali per la programmazione in Matlab

1. Scrivete funzioni brevi, ma usate nomi lunghi e descrittivi per le variabili ed i nomi delle funzioni (in Matlab potete usare no a 32 caratteri). 2. Create un codice indentato e ben commentato, scoprirete presto quanto sia utile avere una buona documentazione dei programmi che si vogliono usare. 3. Evitate il pi` u possibile i cicli for. 4. Per il debugging esaminate le variabili create nellambiente di lavoro con il comando whos. 5. Fate attenzione alluso delle parentesi tonde (per le operazioni aritmetiche) e quadre (per formare vettori o matrici). 6. Attenzione anche alluso delle lettere maiuscole e minuscole (per Matlab sono diverse). 7. Usate il comando help, potreste scoprire che la funzione che avete intenzione di scrivere esiste gi` a!

1.5

Comandi per la graca

Matlab possiede numerosi comandi per la graca (digitare help graphics per una lista dei comandi pi` u utilizzati). Di seguito si forniscono brevi cenni introduttivi su alcuni comandi di uso comune. Il comando >> stem(x,y) rappresenta gracamente i valori del vettore y come impulsi discreti centrati in corrispondenza dei valori del vettore x. Ad esempio, la sequenza di comandi >> x1 = [1,2,3,4]; y1 = [5,7,2,9]; >> stem(x1,y1) produce loutput di Fig.1.1. Si noti luso del separatore ; per scrivere pi` u istruzioni su una stessa riga. Per riempire i pallini utilizzare il comando stem(x,y, filled). Il comando >> plot(x,y)

10
9

Introduzione alluso di Matlab

1.5

2.5

3.5

Figura 1.1: Il comando stem. restituisce il graco del vettore y in funzione del vettore x (interpolando linearmente i punti). ` possibile scegliere il tipo di linea, i simboli ed il colore del graco aggiungendo delle opzioni E nellargomento del comando. Ad esempio, la sequenza di comandi >> x1 = [1,2,3,4]; y1 = [5,7,2,9]; >> plot(x1,y1,-om) genera loutput di Fig.1.2 (digitare help plot per visualizzare tutte le opzioni disponibili). Il comando
9

1.5

2.5

3.5

Figura 1.2: Il comando plot.

>> bar(x,y)

1.5 Comandi per la graca restituisce il diagramma a barre del vettore y in funzione di x. Se y ` e una matrice M N, vengono diagrammate le colonne di y come M gruppi di N barre verticali. Ad esempio, la sequenza di comandi >> x2 = [1,2,3,4]; >> y2 = [[2,5,8];[2,4,6];[1,9,7];[2,2,2]]; >> bar(x2,y2) genera loutput di Fig.1.3. Il comando
9

11

Figura 1.3: Il comando bar.

>> hist(x) produce listogramma di x, ovvero divide i valori di x in 10 classi equispaziate, e conta il numero di elementi appartenenti a ciascuna classe. Ad esempio, la sequenza di comandi >> x3 = [2,2,5,6,3,4,4,4,2,2,8,6]; >> hist(x3) genera loutput di Fig.1.4. Il comando subplot consente di visualizzare pi` u graci allinterno della stessa nestra. Pi` u precisamente, il comando >> subplot(m,n,p) suddivide la nestra in m n quadranti e posiziona il graco corrente nella posizione pesima. Ad esempio, la sequenza di comandi (utilizzate il tasto freccia in alto per richiamare rapidamente i comandi gi` a inseriti): >> x1 = [1,2,3,4]; y1 = [5,7,2,9]; >> x2 = [1,2,3,4];

12
4

Introduzione alluso di Matlab

3.5

2.5

1.5

0.5

Figura 1.4: Il comando hist. >> >> >> >> >> >> y2 = [[2,5,8];[2,4,6];[1,9,7];[2,2,2]]; x3 = [2,2,5,6,3,4,4,4,2,2,8,6]; subplot(2,2,1); stem(x1,y1) subplot(2,2,2); plot(x1,y1,-om) subplot(2,2,3); bar(x2,y2) subplot(2,2,4); hist(x3)

genera loutput di Fig.1.5 (si noti che subplot(2,1,1) pu` o essere abbreviato con subplot(211)). Il comando
10 8 6 4 2 0 9 8 7 6 5 4 3 1 2 3 4 2 1 2 3 4

10 8 6

2 4 2 0 1

Figura 1.5: Il comando subplot.

>> axis([xmin xmax, ymin, ymax])

1.6 Come spostarsi nellambiente Matlab consente di impostare la scala degli assi di un graco tra i valori xmin e xmax per lasse delle ascisse, e tra ymin e ymax per lasse delle ordinate. Il comando >> figure(h) crea una gura alla quale viene assegnato lindice (handle) h. Il comando >> close chiude la gura visualizzata a schermo (generalmente lultima generata). Il comando close(h) chiude la gura corrispondente allindice h, mentre close(all) chiude tutte le gure aperte.

13

1.6

Come spostarsi nellambiente Matlab

Terminiamo questa breve introduzione elencando i principali comandi per la gestione dei le e delle directory: >> cd mostra la directory corrente. >> dir mostra il contenuto della directory corrente. >> cd <nomedir> porta nella nuova directory di lavoro nomedir. >> delete <nomefile> cancella il le nomefile dalla directory corrente. >> what elenca gli M-le presenti nella directory corrente. >> diary(nomefile) salva in nomefile tutto ci` o che viene visualizzato su schermo. >> exit esce da Matlab, idem con quit.