Matlab Ing. Francesco Licandro Corso Fondamenti di Telecomunicazioni A.A. 2004- 2005 1 MATLAB: MATrix LABoratory Matlab – Ing. Francesco Licandro - 2005 2 Interfaccia Grafica Matlab – Ing. Francesco Licandro - 2005 3 Struttura dell’ambiente MATLAB Command Window (o Shell) Graphic Window Finestra Principale Prompt “>>” Usata per eseguire comandi, lanciare script, etc… Contiene l’output dei comandi grafici 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 Matlab – Ing. Francesco Licandro - 2005 4 MATLAB windows Matlab – Ing. Francesco Licandro - 2005 5 Comandi generali On-line help help argomento : fornisce l’help su argomento helpwin: help interattivo Workspace information who, whos: elenca le variabile correntemente in uso clear: rimuove tutte le variabili in uso clear x,y,z: rimuove le variabili x,y,z Directory information pwd: mostra la directory di lavoro corrente cd: cambia la directory di lavoro corrente dir: mostra il contenuto della dir. di lavoro corrente ls: ---- come dir ----- Matlab – Ing. Francesco Licandro - 2005 6 Operazioni su scalari >> 13*9 ans = 117 >> sqrt(167) ans = 12.9228 >> sin(pi/6) ans = 0.5000 NOTA: pi=3.1415… i,j se non assegnate rappresentano l’unita’ immaginaria. >> i ans = 0 + 1.0000i >> complex(real,imag); NOTA: variabile “ans” Contiene il risultato “piu’ recente” Matlab – Ing. Francesco Licandro - 2005 7 Creazione di una matrice Elemento per elemento >>A = [1 2 3 4; 5 6 7 8]; Che succede se si toglie il ‘;’? Chiamata a funzione >>B = zeros(10,2); Da file testo >>C = load(‘dati.txt’); Spazio di lavoro >>who >>whos Matlab – Ing. Francesco Licandro - 2005 8 Assegnazione di variabili >> b = [1; 2; 3; 4; 5; ] b = 1 2 3 4 5 >> x = 5.5; >> y = x^2; >> z = y-x z = 24.7500 >> a = [1 2 3 4 5 6] a = 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 Matlab – Ing. Francesco Licandro - 2005 9 Arrotondamenti Domanda: come si determina la parte intera di un numero in virgola mobile? Risposta: provare i seguenti comandi di Matlab™: fix, round, floor, ceil. Esempio: >>x = [-5.8, -3.2, -2.5, 0., 0.5, 2.1, 3.9] >>fixX = fix(x) >>roundX = round(x) >>floorX = floor(x) >>ceilX = ceil(x) Output: x= fixX = roundX = floorX = ceilX = -5.8 -5 -6 -6 -5 -3.2 -3 -3 -4 -3 -2.5 -2 -3 -3 -2 0 0 0 0 0 Matlab – Ing. Francesco Licandro - 2005 0.5 0 1 0 1 2.1 2 2 2 3 3.9 3 4 3 4 10 Help di Matlab Per eseguire l’help di Matlab, scriver nella shell dei comandi: >> help E’ possibile eseguire l’help di una funzione scrivendo help nomefunzione. ad esempio: >> help inv Matlab – Ing. Francesco Licandro - 2005 11 Variabili predefinite i, j unità immaginaria pi Pigreco Inf infinito (ad es.: 3/0) NaN not a number (as es.: 0/0, Inf/Inf) sin, cos, tan, asin, acos funzioni trigonometriche (in radianti) sinh, cosh, asinh, acosh funzioni iperboliche sqrt, log, log10, exp funzioni varie rem resto della divisione intera (divisione– modulo) Matlab – Ing. Francesco Licandro - 2005 12 Operatori elementari Trasposta >>B = A’; Determinante, rango, inversa >>B = det(A); >>C = rank(A); >>D = inv(A); Dimensione >>size (A,1) >>size (A,2) >>length(A) Matlab – Ing. Francesco Licandro - 2005 13 Operatori di intervallo In cui si specifica l’incremento >>1:10 >>1:2:10 >>10:-1:1 In cui si specificano gli estremi e/o il numero di elementi >>linspace(1,100,10) >>help linspace >>logspace(1,2,10) >>help logspace Matlab – Ing. Francesco Licandro - 2005 14 Operatori di confronto Operatori di confronto: < <= > >= == ~= minore minore o uguale maggiore maggiore o uguale uguale diverso Operatori logici: ~ & | NOT AND OR Matlab – Ing. Francesco Licandro - 2005 15 Caratteri speciali I simboli possono essere creati utilizzando la combinazione del tasto ALT e il tastierino numerico. Ad esempio: per per per per produrre produrre produrre produrre il il il il simbolo: simbolo: simbolo: simbolo: { premere ALT + 123 (tastierino numerico) } premere ALT + 125 (tastierino numerico) | premere ALT + 124 (tastierino numerico) ~ premere ALT + 126 (tastierino numerico) Matlab – Ing. Francesco Licandro - 2005 16 Elementi e sottomatrici Come accedere a singoli elementi di una matrice: >>A(1,3) % Visualizza l’elemento della prima riga e terza colonna Tecniche per definire sottomatrici: >>A(1:2,1) >>A(:,1) >>A([1 3 5],1) >>A([5 3 1],1) Matlab – Ing. Francesco Licandro - 2005 17 Cancellare righe e colonne Si possono cancellare righe o colonne da una matrice utilizzando luna semplice istruzione: Esempio Per cancellare la seconda riga della matrice X: X(2,:)=[] Analogamente per cancellare una colonna: X(:,3)=[] Matlab – Ing. Francesco Licandro - 2005 18 Dimensione di una matrice o vettore Domanda: come determinare il numero di righe e colonne di una matrice? Risposta: occorre utilizzare l’istruzione size. Esempio: >>A = zeros(3,5) >>nRows = size(A,1); >>nCols = size(A,2); >>disp(['nRows = ',num2str(nRows),' nCols = ,num2str(nCols)]); Output: A = 0 0 0 0 0 0 0 0 0 0 0 0 nRows = 0 0 0 3 nCols = 5 Matlab – Ing. Francesco Licandro - 2005 19 Vettori, indici e tempi In MATLAB tutti I vettori sono indicizzati partendo … dall’indice 1 x(1) Nel caso di sequenze con riferimento temporale assoluto sarà necessario prevedere un secondo vettore dei tempi Matlab – Ing. Francesco Licandro - 2005 20 Operazioni con matrici Matlab – Ing. Francesco Licandro - 2005 21 Rappresentazione grafica di vettori Essenzialmente si usano tre funzioni per graficare: plot: rappr. di tipo continuo o per punti stem: rappr. a impulsi (tipica per sequenze) bar: diagramma a barre (tipico di istogrammi) Per ulteriori opzioni: >> help plot (ovvero help stem, help bar) Se invocate con un solo argomento (vettore), graficano i valori degli elementi del vettore rispetto all’indice Se gli argomenti (vettori) sono due, utilizzano il primo come indice (ascissa) e il secondo per i valori (ordinata) Matlab – Ing. Francesco Licandro - 2005 22 Eempio 1 Matlab – Ing. Francesco Licandro - 2005 23 Gestione delle figure Di default MATLAB ridirige l’output dei comandi grafici sulla figura creata piu’ recentemente (all’inizio, Figure n.1) >> figure crea una nuova figura e vi dirige l’output >> figure(N) dirige l’output sulla figura N (la crea se non esiste) >> hold on sovrappone grafici sull’ultima figura attivata >> subplot(r,c,i) o subplot rci suddivide la figura corrente in una matrice di sottografici a r righe e c colonne e attiva il sottografico i-esimo (contando per righe) Matlab – Ing. Francesco Licandro - 2005 24 Subplot Domanda: come disegnare con Matlab™ quattro diagrammi in un’unica finestra? Risposta: si utilizza l’istruzione subplot(n,m,i) che permette di disegnare n righe ed m colonne di diagrammi puntando nella fattispecie sul diagramma i-esimo contando da sinistra a destra e dall’alto in basso. Esempio: subplot(2,2,1); al #1 plot(x1,y1),title subplot(2,2,2); plot(x2,y2),title subplot(2,2,3); plot(x3,y3),title subplot(2,2,4); plot(x4,y4),title % 4 diagrammi (2 x 2), inizio a puntare ‘diagramma 1'; % punto al #2 ‘diagramma 2'; % punto al #3 ‘diagramma 3'; % punto al #4 ‘diagramma 4'; Nota: il carattere ‘%’ permette di inserire dei commenti nello script Matlab – Ing. Francesco Licandro - 2005 25 Marcatori stile-colore E’ possibile specificare, colore, stile della linea e marcatori, attraverso il seguente comando: plot(x,y,’marcatore-stile’) dove ‘marcatore-stile’ rappresenta la sequenza di 1, 2 o 3 caratteri che indicano rispettivamente: Colore Stile linea marcatore Matlab – Ing. Francesco Licandro - 2005 26 Stili e marcatori - Tipi di colore: ‘c’, ‘m’, ‘y’, ‘r’, ‘g’, ‘b’, ‘w’, ‘k’ - Stile linea: ‘-’ linea continua ‘- -’ linea tratteggiata ‘:’ linea a punti ‘-.’ liena tratti e punti ‘none’ senza linea tipi di marcatore: ‘+’, ‘o’, ‘*’, ‘^’, ‘x’ Esempio: plot(x,y, ‘y:+’) Traccia una linea in giallo a puntini e pone un marcatore + a ciascun dato Matlab – Ing. Francesco Licandro - 2005 27 Esercizio 1 Matlab – Ing. Francesco Licandro - 2005 28 Esercizio 2 Matlab – Ing. Francesco Licandro - 2005 29 Esercizio Problema: Costruire una matrice A (10000x1) i cui elementi sono tutti uguali e pari al contenuto della variabile b (1x1). Soluzione: >>b = 3; >>A = ones(10000,1)*b; Matlab – Ing. Francesco Licandro - 2005 30 Simboli e caratteri speciali Lettere greche minuscole Lettere greche maiuscole Simboli matematici Matlab – Ing. Francesco Licandro - 2005 31 Esempio di caratteri speciali Domanda: come si fa a mostrare i caratteri speciali nelle scritte (ad esempio titolo ed assi di un diagramma) ? Risposta: si utilizzano i caratteri speciali TeX che premettono un carattere di backslash Esempio: >>plot(xF,yF,‘r-') >>title('Funzione \alpha’); % lettera greca alfa Matlab – Ing. Francesco Licandro - 2005 32 Assegnazione stringhe Domanda: esiste un modo per memorizzare una informazione in una variabile di tipo stringa? Risposta: Sì. È molto semplice. Basta assegnare la stringa alfanumerica tra virgolette semplici ad una nuova variabile. Esempio: >>unaStringa = ‘Soluzione non accettabile’; >>messaggio = ‘Il programma abortisce per una grave errore.’; >>disp(unaStringa); >>disp(messaggio); Matlab – Ing. Francesco Licandro - 2005 33 Matrici sparse >>[i,j,s]=find(A) Trova elementi non nulli in A Matrice sparsa: con molti elementi nulli. Può essere memorizzata in modo più parsimonioso semplicemente elencando gli elementi non nulli Da matrice completa a matrice sparsa: >>[i,j,s] = find(A),S = sparse(i,j,s) >>S = sparse(A) Da matrice sparsa a matrice completa: >>A = full(S) Matlab – Ing. Francesco Licandro - 2005 34 Soluzione di sistemi di lineari Problema: Soluzione di un sistema lineare Ax = b MATLAB: x = A/b Matlab – Ing. Francesco Licandro - 2005 35 I/O data file ASCII – dlmread dlmwrite Con carattere delimitatore – csvread csvwrite Valori separati da virgola – wk1read wk1write Lotus 1,2,3 (WK1) Worksheet – load save File ASCII generici – xlsread xlsread Excel (XLS) file. Matlab – Ing. Francesco Licandro - 2005 36 Comandi I/O a basso livello per file ASCII fopen – Apre un file fscanf – Legge dati formattati da un file fprintf – Scrive dati formattati su un file fgetl – Legge linea da file, scartando il carattere newline ftell – Ritorna la posizione corrente fseek – Specifica la posizione corrente fclose – Chiude un file Matlab – Ing. Francesco Licandro - 2005 37 Esempio: lettura file ASCII fid = fopen(filen,'r'); h.date = fscanf(fid,'%s\n',1); h.tgsize = fscanf(fid,'%f\n',1); h.tgampl = fscanf(fid,'%f\n',1); h.trials = fscanf(fid,'%d\n',1); h.targets = fscanf(fid,'%d\n',1); h.tgvisible = fscanf(fid,'%s\n',1); h.handvisible = fscanf (fid,'%s\n',1); h.L = fscanf(fid,'%f\n',2); h.distances = fscanf(fid,'%f\n',4); fclose(fid); Matlab – Ing. Francesco Licandro - 2005 38 File binari in formato MAT MAT è un formato binario MATLAB indipendente dalla piattaforma, usato per memorizzare una o più variabili dello Workspace save <nome file> < variabile> Salva file in formato MAT load <nome file> Legge file in formato MAT Matlab – Ing. Francesco Licandro - 2005 39 Comandi di I/O a basso livello per file binari fopen – Apre un file fread – Legge da file binario fwrite – Scrive file binario fseek – Specifica indicatore di posizione ftell – Ritorna la posizione corrente fclose – Chiude file Matlab – Ing. Francesco Licandro - 2005 40 Esempio: lettura di file binari fid = fopen(fname,'r','b'); data = fread(fid,inf,'float32'); data= reshape(data,3,length(data)/3)'; fclose(fid); Matlab – Ing. Francesco Licandro - 2005 41 Script File File contenente una sequenza di comandi MATLAB, interpretati dalla shell come se fossero digitati manualmente Tipicamente viene salvato con estensione .m Uno script viene eseguito digitando al prompt della shell il nome dello script stesso NON assegnare a nessuno script il nome di funzioni predefinite o il nome di una variabile usata!!! IMPORTANTE: le variabili definite all’interno dello script hanno visibilita’ globale e possono essere riferite dalla shell Matlab – Ing. Francesco Licandro - 2005 42 Strutture di controllo di flusso MATLAB ha cinque strutture di controllo di flusso: If Switch For While break Matlab – Ing. Francesco Licandro - 2005 43 Struttura if La struttura if valuta un’ espressione logica ed esegue un gruppo di asserzioni quando l’espressione è vera. La parola end termina il gruppo di asserzioni. Esempio If A > B ‘Greater’ elseif A < B ‘less’ elseif A==B ‘equal’ else error(‘Unexpected situation’) end Matlab – Ing. Francesco Licandro - 2005 44 Struttura Switch e case La struttura switch esegue gruppi di asserzioni sul valore di una variabile o espressione. La keywords case o otherwhise delimita i gruppi Esempio switch lower(METHOD) case {'linear','bilinear'} disp('Method is linear') case 'cubic' disp('Method is cubic') case 'nearest' disp('Method is nearest') otherwise disp('Unknown method.') end Matlab – Ing. Francesco Licandro - 2005 45 Struttura for Il loop for ripete un gruppo di istruzioni un numero fisso di volte. Un end termina le asserzioni. Esempio for I = 1:N, for J = 1:N, A(I,J) = 1/(I+J-1); end end Matlab – Ing. Francesco Licandro - 2005 46 Struttura while Il ciclo while ripete un gruppo di asserzioni un numero indefinito di volte attraverso il controllo di una variabile. Un end delinea le asserzioni Esempio E = 0*A; F = E + eye(size(E)); N = 1; while norm(E+F-E,1) > 0, E = E + F; F = A*F/N; N = N + 1; end Matlab – Ing. Francesco Licandro - 2005 47 Comando break L’asserzione break lascia che si esca da un loop for o while anche se non è verificata l’espressione del loop. Esempio E = 0*A; F = E + eye(size(E)); N = 1; while norm(E+F-E,1) > 0, E = E + F; F = A*F/N; N = N + 1; if N >= 5 ‘N maggiore di 5’ break end end Matlab – Ing. Francesco Licandro - 2005 48 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 può ricevere e restituire dei risultati. I passaggi di parametri avvengono per valore IMPORTANTE: le variabili definite all’interno della funzione hanno visibilità locale e NON possono essere riferite dalla shell Matlab – Ing. Francesco Licandro - 2005 49 Bibliografia http://www.eece.maine.edu/mm/matweb.html http://spicerack.sr.unh.edu/~mathadm/tutorial/software/matlab/ http://www.engin.umich.edu/group/ctm/basic/basic.html http://www.mines.utah.edu/gg_computer_seminar/matlab/matlab.html http://www.math.ufl.edu/help/matlab-tutorial/ http://www.indiana.edu/~statmath/math/matlab/ Matlab – Ing. Francesco Licandro - 2005 50