introduzione a matlab - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 università degli studi di...
TRANSCRIPT
![Page 1: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/1.jpg)
1
Università degli Studi di Padova Università degli Studi di Padova Corso di Laurea Specialistica in BioingegneriaCorso di Laurea Specialistica in Bioingegneria
A.A. 2005A.A. 2005--20062006
INTRODUZIONE A MATLABINTRODUZIONE A MATLAB
Giovanni SparacinoDipartimento di Ingegneria dell’Informazione
Università degli Studi di PadovaVia Gradenigo 6/B, 35131 Padova
Tel. 049 827 7741; e-mail: [email protected]: http://www.dei.unipd.it/~gianni
2
CHE COSA È MATLAB
MATLAB= MATrix LABoratory.
L’elemento base sono le matrici
Al solito, matrice M X N significa matrice ad M righe ed N colonne.
Casi particolari: M=1 (vettore riga); N=1 (vettore colonna); M=N=1 (scalare)
Matlab sarà per noi:
•un linguaggio di programmazione
•un ambiente di calcolo scientifico con routines altamente specializzate
![Page 2: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/2.jpg)
3
Matlab ha in se' centinaia di funzioni che possono essere built-in (es. det,inv, ...) o incluse in toolbox opzionali (es. funzione remez nel SignalProcessing 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 inMatlab 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 l’esecuzione.
PERCHE’ USEREMO MATLAB ?
4
Uso la command window per:•lavorare in modalita' interattiva•lanciare l’esecuzione di un M-file (= programma in Matlab)
Lanciato Matlab, appare la command window con un prompt
UTILIZZO DI MATLAB: LA COMMAND WINDOW
![Page 3: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/3.jpg)
5
Dalla command window posso ad es. fare operazioni come con una calcolatrice e invocare comandi o funzioni (=programmi con argomenti).All'enter Matlab fa le sue elaborazioni e mi fornisce i risultati.
UTILIZZO INTERATTIVO DELLA COMMAND WINDOW
L’uso interattivo della command window è spesso poco conveniente e noioso (è difficile trovare gli errori, se voglio ripetere le operazioni più volte devo riscrivere tutto ogni volta...), ma a volte può essere utile, specie per iniziare !
6
OPERAZIONI DI ASSEGNAZIONE
Osservazioni
•Se non metto il punto e virgola (“;”) dopo l’assegnazione, 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 chiamaworkspace
•Per vedere cosa ho nel workspace: who o whos(who+size)
Dalla Command Window si possono assegnare valori a variabili in modo intuitivo.
![Page 4: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/4.jpg)
7
Osservazione: A = [1 2 3; 4 5 6; 7 8 9] e A = [...1 2 34 5 67 8 9 ]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.
NB: In Matlab “i” e “j” sono le costanti che rappresentano l’unità immaginaria. Se dobbiamo usare numeri complessi, è bene evitare nel codice l’uso di i e j come variabili (anche se è consentito)
8
•Le matrici si inseriscono per righe •In un’operazione di assegnazione, a destra dell'uguale posso avere delle matrici•Per accedere a porzioni di matrici/vettori, si usano le parentesi tonde•Le parentesi quadre si usano solo per delimitare inizio e fine di matrici/vettori
•Gli indici delle matrici sono interi strettamente positivi
•In generale, per vettori riga, v(1,#) e’ accorciabile in v(#), mentre, per vettori, colonna z(#,1) coincide con z(#)
![Page 5: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/5.jpg)
9
Sia
A=[...2 –2 10 37 1 -3 41 5 6 -4]
Per accedere ad un elemento:x=A(3,4) assegnera’ –4
Per accedere ad un’intera riga, ad es. la 2x=A(2,:) restituira’ [7 1 -3 4]
Per accedere ad un’intera colonna, ad es. la 3x=A(:,3) restituira’ [10 -3 6]’
Per accedere ad una sottomatrice, ad es.la 2X2 in basso a destrax=A(2:3,3:4) restituira’ [-3 4
6 -4]
ESTRAZIONE DI SOTTOMATRICI
10
Le matrici si possono costruire “affiancando” matrici piu' piccole (purchèle dimensioni siano compatibili)
![Page 6: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/6.jpg)
11
Una matrice molto grande come ad es. dati (40 X 4) nell’esempio sotto può essere salvata in un file di testo es. dati.dat e richiamabile nelworkspace con il comando load dati.dat
12
Matlab non richiede lapredichiarazione delle variabili e della loro dimensione.
Addirittura, fa un’allocazione dinamica delle variabili: quando definisco un solo elemento di una matrice o quando definisco un nuovo elemento in una posizione che eccede la vecchia dimensione della matrice, gli altri elementi vengono definiti di imperio e posti uguali a zero !
![Page 7: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/7.jpg)
13
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
DIMENSIONE DELLE VARIABILI
14
COMANDO FORMAT
Internamente, Matlab usa sempre doppia precisione. Per l’esterno, si possono usare vari formati:
format short virgola fissa, 5 cifre
format long virgola fissa, 15 cifre.
» format short» pians =
3.1416
» format long» pians =
3.14159265358979
format short e virgola mobile, 5 cifre.
format long e virgola mobile, 15 cifre.
» format short e» pians =3.1416e+000
» format long e» pians =
3.141592653589793e+000
![Page 8: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/8.jpg)
15
GESTIONE DI STRINGHE
Definizione e concatenamento di stringheA='pinco'B='pallino'C=[A ' ' B]
Conversione di numeri in stringhe
E=67ES=num2str(E)P=[C ES]
16
VARIABILI DI TIPO RECORD
![Page 9: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/9.jpg)
17
18
GESTIONE DELLE VARIABILI NEL WORKSPACE
who produce la lista delle variabili nel workspace
whos la lista contiene anche informazioni su tipo e dimensioni
clear all elimina tutte le variabili nel workspace
clear <Variabile> cancella solo la variabile con nome Variabile
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
![Page 10: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/10.jpg)
19
RIEPILOGO
20
GENERAZIONE DI VETTORI O MATRICI “SPECIALI”
E’ possibile generare consemplicita’ vettori con elementiequispaziati avvalendosi del simbolo “:”
![Page 11: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/11.jpg)
21
Il comando
A=logspace(Min, Max, N)
genererebbe invece N valori equispaziati su scala logaritmica
Per generare un vettore A di N elementi equispaziati tra Min e Max, posso anche usare il comando:
A = linspace(Min, Max, N)
22
A=rand(3,5) matrice 3x5 con elementi casuali distribuiti unif. in [0,1]A=randn(3,5) matrice 3x5 con elementi casuali distribuiti gauss. come Ν(0, 1)
GENERAZIONE DI VETTORI CASUALI
Sfruttando le trasformazioni lineari riesco a estrarre da varie distribuzioni diprobabilita’
v=10+2*randn(50,1)
vettore colonna di lunghezza 50 con elementi tratti da una distribuzionegaussiana media 10 e deviazione standard 2
u=15+5*rand(50,1)
vettore colonna di lunghezza 50 con elementi tratti da una distribuzione uniforme tra 15 e 20
![Page 12: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/12.jpg)
23
RIEPILOGO
24
A=[] : matrice vuota
A=eye(10) matrice identità 10x10A=zeros(3,5) matrice 3x5 con elementi tutti nulliA=ones(3,5) matrice 3x5 con elementi tutti pari a 1A=diag([3, 5, 6]) matrice 3x3, con elementi sulla diagonale specificati
ALTRI ESEMPI
![Page 13: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/13.jpg)
25
Per la trasposizione di matrice si usa come in algebra lineare l’apice
ESEMPI DI OPERAZIONI SULLE MATRICI
Trasposizione di matrice
26
Matlab esegue in modo intuitivo le operazioni algebriche sulle matrici
Esempio:>> a=2*eye(2)a =
2 00 2
Esempio: >> a=ones(2,3);>> b=ones(2,3);>> a+bans =
2 2 22 2 2
Prodotto per uno scalare, somma, prodotto tra matrici
![Page 14: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/14.jpg)
27
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.
Infatti il prodotto fra queste specifiche matrici non è definibile. Posso nell’esempio moltiplicare invece a per la trasposta di b, ottenendo:
>> a*b'ans =
3 33 3
28
Elevamento a potenza
•X^2 indica il prodotto della matrice X con se stessa ed è definito solo per matrice quadrate, cioè X^2 = X*X,•X.^2 indica invece la matrice con elementi A i,j = ( X i,j ) 2
Per esempio:
>> x=ones(2,2);>> x^2ans =
2 22 2
>> x.^2ans =
1 11 1
![Page 15: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/15.jpg)
29
Altro esempio
>> x=[-1,2];>> x^2??? Error using ==> ^Matrix must be square.
Posso invece sempre agire “elemento per elemento”
>> x.^2ans =
1 4
30
Osservazione:Mettere il “.” prima dell’operatore cambia l’operazione drasticamenteperchè significa “elemento per elemento”
![Page 16: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/16.jpg)
31
Divisione
divisione elemento per elemento
equivale a a*inv(b)
32
Altre operazioni sulle matrici
Ce ne sono un’infinità, ad es. inv, det, trace, mean, std, var, sort, max, min,diag, ... Solo per elencarne alcune:
max(x), min(x): massimo e minimo del vettore x.sort(x): ordinamento ascendente del vettore x.mean(x),median(x),var(x),std(x): media, mediana, varianza e sd campionaria di x (per colonne se x è una matrice !!!).
sum(x) : somma gli elementi di x (per colonne se x è matrice).prod(x): esegue il prodotto degli elementi di x (per colonne se x è matrice).diff(x): calcola le differenze [x(2)-x(1), x(3)-x(2), … , x(n)-x(n-1)].
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.norm(X, p): norma p di X (matrice o vettore che sia)
![Page 17: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/17.jpg)
33
Esempi: min, max, sort
34
Esempi: poly, eig
coeff. polinomio caratteristico
colonne di V = autovettori di a
autovalori di a
![Page 18: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/18.jpg)
35
Esempi: lu
36
Manipolazione di matrici
![Page 19: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/19.jpg)
37
RIEPILOGO
38
Esistono innumerevoli funzioni, es.
cos, sin, cosh, sinh, tan, tanh, asin, asinh, acos, acosh, ... log, log10, log2, exp,abs, mod,sqr, sqrt, round, floor, ceil,sign
che nei corsi di Matematica sono state definite su scalari e che, se l'argomento e' una matrice, in Matlab lavorano elemento per elemento.
Funzioni matematiche
![Page 20: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/20.jpg)
39
Si possono così calcolare funzioni di matrici:>> a=zeros(1,2)a =
0 0>> b=cos(a)b =
1 1
Altro esempio (NB: pi è una variabile predefinita che vale π):>> t=[0 pi/6 pi/3 pi/2];>> x=cos(t)
x =
1.0000 0.8660 0.5000 0.0000
40
RIEPILOGO
![Page 21: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/21.jpg)
41
Valutazione:
polyval(p,x) : calcola il valore del polinomio in x
Radici:
roots(p) : radici del polinomio.poly(r) : determina il polinomio le cui radici sono r.
GESTIONE DI POLINOMI
42
ALCUNI COMANDI PER SOPRAVVIVERE ...
Dalla Command Window
>> <FrecciaSu>,<FrecciaGiu> Richiama i comandi già dati dalla Command Window
>> help <NomeComando> Consulta l’help in linea per il comando NomeComando
>> lookfor <NomeComando> Ricerca nel manuale la parola chiave NomeComando
>> demos Dimostrazioni
>> exit Chiude Matlab
![Page 22: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/22.jpg)
43
Nell’help, per soli motivi grafici, la funzione viene scritta in maiuscolo, ma va usata comunque in minuscolo !!!
Utili le funzioni correlate !
44
Lookfor ci aiuta a trovare comandi di cui non conosciamo l’esistenza ...
![Page 23: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/23.jpg)
45
COMANDO diary (=big brother …)
46
ESECUZIONE DI M-FILES DALLA COMMAND WINDOWUna sequenza ordinata di comandi può essere scritta in un M-file (=file testo con estensione m).
Per scrivere M-files ci si può servire di un comune text-editor (es. notepad) o del potente editor interno di Matlab
Per far eseguire un M-file dallaCommand Window, è sufficiente scrivere il nomedell’M-file e battere “Invio”.
Nella esecuzione di un M-file,Matlab si comporta come un interprete.
![Page 24: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/24.jpg)
47
La scrittura di un M-file rispetto all’esecuzione di comandi dallaCommand Window permette di:
•Sperimentare un algoritmo, senza dover reintrodurre da tastiera, ad ogni variazione dello stesso, una lunga lista di comandi
•Ottenere programmi che possono essere riutilizzati, per esempio cambiando solo i dati
•Scambiare programmi con altri utenti
•Ottenere una documentazione permanente per un lavoro
M-FILES
48
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 erroreif a>=0
a=sqrt(a)else
disp('errore')end
Functions: sono files di comandi con argomenti in entrata e in uscita. Le variabili interne a questi programmi non influenzano le variabili del workspace
function a=radfunz(x)% RADFUNZ(X) calcola la radice degli elementi di X% se X>=0, altrimenti stampa un messaggio di errore%if x>=0
a=sqrt(x)else
disp('errore')end
Per cominciare ci concentreremo sugli scripts
TIPI DI M-FILES
Attenzione: nel workspace deve essere stata definita una variabile a
Attenzione: Questo file deve essere salvato comeradfunz.m
![Page 25: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/25.jpg)
49
DA RICORDARE
Quando dalla command window digitiamo “pippo” + Enter, Matlab:
1. Controlla nel workspace se pippo è una variabile ed eventualmente ce ne restituisce il valore
2. Controlla se esiste una function built-in di nome pippo ed eventualmente cerca di eseguirla
3. Controlla se esiste nella current directory un M-file di nome pippo.m ed ed eventualmente cerca di eseguirlo
4. Controlla se nell’insieme delle cartelle presenti nel matlabpath(toolbox + quello che abbiamo inserito noi) esiste una function di nome pippo ed eventualmente cerca di eseguirla
50
•E’ buona abitudine sia negli scripts che nelle functions inserire dei commenti
•I commenti sono segnalati da %: Matlab ignora tutti i caratteri dell’intera riga dopo il %
•Le prime righe di commento di uno script o di una functiondiventano parte dello help online
USO DEL % (COMMENTI)
![Page 26: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/26.jpg)
51
GESTIONE DELLA WORKING DIRECTORY
Dalla Command Window
>> dir contenuto della directory corrente >> ls idem>> pwd percorso della directory corrente>> cd idem
>> cd <Percorso> cambia la directory corrente>> chdir <Percorso> come sopra
>> what analogo a dir, ma mostra solo i file .m, .mat, .mdl
52
Gli operatori relazionali più comuni sono:== uguale~= diverso da< minore di<= minore o uguale etc.
Esempi:>> x=2;>> x==0 (questa relazione e’ falsa:)ans =
0>> x==2 (questa relazione è vera)ans =
1
OPERATORI RELAZIONALI
![Page 27: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/27.jpg)
53
Gli operatori relazionali possono essere applicati anche alle matrici:
>> a=[1 2; 0 -1];>> a>0 (qui i primi due elementi sono veri)ans =
1 10 0
>> a>=0 (qui i primi tre elementi sono veri)ans =
1 11 0
54
USO DEGLI OPERATORI RELAZIONALI COME FUNZIONI BINARIE
eq - Equal == ne - Not equal ~= lt - Less than < gt - Greater than > le - Less than or equal <= ge - Greater than or equal >=
![Page 28: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/28.jpg)
55
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 =
1
56
USO DEGLI OPERATORI LOGICI SU MATRICI
and - Logical AND & or - Logical OR | not - Logical NOT ~ xor - Logical EXCLUSIVE ORany - True if any element of vector is nonzeroall - True if all elements of vector are nonzero
![Page 29: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/29.jpg)
57
USO DEGLI OPERATORI LOGICI SU MATRICI
any - True if any element of vector is nonzeroall - True if all elements of vector are nonzero
58
STRUTTURE DI PROGRAMMAZIONE
![Page 30: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/30.jpg)
59
STRUTTURA IF … ELSE…END
Struttura:
if espressioneistruzioni
elseistruzioni
end
Esempio:
if mod(x,2)==0
disp(‘numero est pari’)
else
disp(‘numero dispari’)
end
60
STRUTTURA IF … ELSEIF …END
Struttura:
if espressioneistruzioni
elseif espressioneistruzioni
elseistruzioni
end
Esempio:
if canestro==false
punti = 0;
elseif tirodalontano == true
punti = 3;
else
punti = 2;
end
![Page 31: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/31.jpg)
61
Il ciclo for ha la struttura:
for variabile = espressioneistruzioni
end
In genere espressione è del tipo IndMin:Incremento:IndMax.
Esempio
s=0;for i=1:10
s=s+i;end
calcola la somma dei primi 10 numeri interi (55)
CICLO FOR … END
62
Il ciclo while ha la seguente struttura
while espressioneistruzioniend
Esempioi=1;while i<5i=i+1;
endi
>> ii =
5
CICLO WHILE … END
![Page 32: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/32.jpg)
63
I cicli possono essere uno dentro l’altro.
Esempio (per il ciclo for)
Crea una matrice triangolare inferiore:
>> aa =
1 0 0 01 1 0 01 1 1 01 1 1 1
n=4;for i=1:n
for j=1:ia(i,j) = 1;
end % jend %i
64
Oss. trucchi per migliorare la velocita’
a=zeros(4,4)n=4;for i=1:n
for j=1:ia(i,j) = 1;
end % jend %i
Fa la stessa cosa del codice prima, ma è più veloce, perché Matlab non deve ad ogni nuova riga/colonna riallocare lo spazio in memoria per la matrice a
Meglio preallocare lo spazio per le variabili
![Page 33: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/33.jpg)
65
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
ma e’ decine di volte più lento. Meglio vettorizzare il codice.
t=(0:1:100)
y=log(t+1)
66
![Page 34: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/34.jpg)
67
GRAFICI
Per ottenere il grafico di una funzione, devo:
•Preparare un vettore di ascisse
•Preparare un vettore di ordinate
•Scegliere la figura (opzionale) (Istruzione figure)
•Preparare il riquadro (opzionale) (istruzione subplot)
•Fare il grafico (istruzione plot)
•Settare gli assi (opzionale) (istruzione axis)
•Inserire titoli ed etichette (istruzioni title, xlabel, ylabel, ...)
68
Esempio: grafico di ex cos4x, su [0,2]
>> x=[0:0.01:2];>> f=cos(4*x).*exp(x);>> plot(x,f)
Esempio: grafico di una circonferenza sulla figura 3>> t=0:0.01:2*pi;>> x=cos(t);>> y=sin(t);>> figure(3)>> plot(x,y,'g+')>> axis equal
![Page 35: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/35.jpg)
69
Una serie temporale (senza asse ascisse)
plot(y)
Una funzione
plot(t,y) (di default vengono uniti i punti)
Con i circolettiplot(t,y,'o')
Circoletti + lineaplot(t,y,'o',t,y)
Circoletti + linea rossaplot(t,y,'o',t,y,'r')
Circoletti+linea rossa tratteggiataplot(t,y,'o',t,y,'r--')
ISTRUZIONE PLOT
70
GESTIONE DI PIU’ GRAFICI
Oppure (comando hold on ... hold off)plot(t1,y1)hold on…plot(t2,y2)….plot(t3,y3)hold off
Due funzioni sovrapposte
plot(t1,y1,t2,y2)
Circoletti e asterischi
plot(t1,y1,'o',t2,y2,'*')
Piu' figure
figure(1)
plot(t1,y1)
figure(2)
plot(t2,y2)
![Page 36: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/36.jpg)
71
L’istruzione subplot(M,N,K) crea una figura contenente M*N riquadri, distribuiti su M righe ed N colonne. L’indice K indica che il plot che segue, con annessititle, xlabel, etc.., si riferisce al K-esimo riquadro (con K che può assumere valori fra 1 e M*N)
ISTRUZIONE SUBPLOT
prima del plot, subplot(2,2,4) prima del plot, subplot(6,3,5) prima del plot, subplot(6,1,6)
72
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 correnteclose all: chiusura di tutte le finestre graficheclose (n) : chiude la figura nclf: 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 all’asse delle ordinate.xlabel(stringa) : aggiunge del testo all’asse delle ascisse.
grid on/off : attiva/disattiva la griglia nella figura attiva.
axis([xmin, xmax, ymin, ymax]) : specifica i range per ascisse e ordinateaxis tight : gli assi finiscono al valore massimo/minimo dei dati (non rimane contorno)axis auto : la scala di visualizzazione è scelta da Matlabaxis off/on : elimina/ripristina la visualizzazione di assi, etichette e tick.axis equal : fa in modo che incrementi unitari sui due assi abbiano la stessa lunghezza effettiva su schermo.axis square : si impostano gli stessi minimo e massimo per entrambi gli assi (visualizzazione quadrata)axis normal : si ritorna alla configurazione originale degli assi.
![Page 37: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/37.jpg)
73
ylabel('concentration c_{a}(t)')
Apici e Pedici nei titoli/label
xlabel('concentration c^{b}(t)')
Lettere greche nei titoli/label
title(‘ Risultati per \beta = 3')
74
GRAFICI A BARRE (in alternativa a plot)
hist(y,m): suddivide l’intervallo dei valori compresi tra il minimo e il massimo di y in m “bin” (=sottointervalli) di egual larghezza e calcola (e poi disegna) il numero di elementi di y compresi in ogni bin
-0.2 0 0.2 0.4 0.6 0.8 1 1.20
5
10
15
20
25
30
35
40
45
50bar(x,y) : produce un diagramma a barre.
bar([0:.25:1],[10:10:50])
30 35 40 45 50 55 60 650
50
100
150
200
250
300
350
hist(50+4*randn(1,5000),50)
![Page 38: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/38.jpg)
75
0 1 2 3 4 5 6 7-1
-0.8
-0.6
-0.4
-0.2
0
0.2
0.4
0.6
0.8
1
» x=[0:0.1:2*pi];
» y=sin(x);
» stem(x,y)
stem(x,y): adatto quando si vuole mettere in evidenza il fatto che il segnale è a tempo discreto
semilogx(x,y) : come plot ma l’asse x viene rappresentato in scala log10
semilogy(x,y) : come plot ma l’asse y viene rappresentato in scala log10
loglog(x,y) : come plot ma con entrambi gli assi in scala log10.
76
![Page 39: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/39.jpg)
77
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);
% aggiungo il rumore con varianza 0.8ns=length(ts);vn=randn(ns,1);v=sqrt(0.8)*vn;zs=ys+v;
plot(t,y,'r--',ts,zs,'bo')gridtitle('curva e campioni rumorosi')xlabel('tempo')ylabel('concentrazione')
78
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 onfor k=1:5
tau=k*tau0;y=exp(-t/tau);plot(t,y)pause
endhold off
![Page 40: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/40.jpg)
79
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)clfhold on
while ancora=='s'tau=k*tau0;y=exp(-t/tau);plot(t,y)ancora=input('Vuoi continuare (s/n) ? ')k=k+1
endhold off
80
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
![Page 41: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/41.jpg)
81
CREAZIONE DI FUNCTION
82
La function inizia con una riga che ne specifica il nome (nell’esempio radfunz), le variabili di input e le variabili di output.
La function deve essere salvata in un file con lo stesso nome (nell’esempio radfunz.m)
I commenti dopo la prima riga faranno parte dello help on-line
Seguono le istruzioni con eventuali altri commenti
STRUTTURA DI UNA FUNCTIONfunction a=radfunz(x)% RADFUNZ(X) calcola la radice degli elementi di X% se X>=0, altrimenti stampa un messaggio di errore%if x>=0
a=sqrt(x)else
display('errore')end
![Page 42: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/42.jpg)
83
Un altro esempio
function [xmin,xmax]=minmax(a)
%MINMAX(A) calcola l'elemento minimo, XMIN, e l’elemento % massimo, XMAX della matrice A.
xmin=Inf; xmax=-Inf;
% ricava le dimensioni della matrice A:[m,n] = size(a);for i=1:m
for j=1:nif a(i,j) > xmax
xmax = a(i,j);endif a(i,j) < xmin
xmin = a(i,j);end
endend
84
Un altro esempio
function [mean, stdev] = stat(x)% STAT è una funzione che calcola media e standard deviation per un vettore
[m n] = size(x);
if (m ~= 1) | (n ~=1)error(‘errore: si accettano solo vettori’)
end
mean = sum(x)/m;stdev = sqrt(sum(x.^ 2)/m - mean.^2);
![Page 43: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/43.jpg)
85
function [out1,out2,…]=funz(in1,in2,….)
In generale, le function hanno la seguente struttura
Gli argomenti in output vanno a sinistra dell’ uguale, fra parentesi quadre
Gli argomenti in input vanno a destra dell’ uguale , fra parentesi tonde
Le function vengono richiamate dal programma main passando le variabili di ingresso (anche con nome diverso !)
86
function y=ddpgaussiana(x,m,s);
% questa function restituisce i valori della% ddp nei punti x per una v.a. gaussiana% a media m e deviazione standard s
y= ((1/sqrt(2*pi)*s))*exp((-(x-m).^2)/(2*s^2));
% programma main che fa uso di una% function da me creata per calcolare% il valore della ddp gaussiana a partire da % media e dev.standard
a=[-20:0.1:20];f_a=ddpgaussiana(a,0,4); plot(a,f_a)
Programma “main”
ESEMPIO
![Page 44: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/44.jpg)
87
function y=mia_funz1(x)%function y=mia_funz1(x)% questa e' una function che restituisce il% valore di una_funzione y=mia_funz1(x),% scalare di variabile scalare,% che definisco sotto
if length(x)==1contributo1=exp(-2*x);contributo2=exp(-5*x);y=contributo1+contributo2;
elseerror('la funzione mia funz1 accetta solo argomenti scalari')
end
% esempio di programma main che richiama% una function da me costruita di nome mia_funz1t=(0:0.1:10)';for k=1:length(t)
h(k,1)=mia_funz1(t(k));endplot(t,h)
Programma “main”
ESEMPIO
88
function yv=mia_funz2(xv)% function yv=mia_funz(xv)% questa funzione restituisce un vettore yv% le cui componenti sono l'immagine delle% componenti del vettore xv secondo la % funzione scalare di variabile scalare % da me costruita sotton=length(xv);for k=1:n
xscalare=xv(k);if xscalare<0yscalare=-0.2*xscalare+5;elseyscalare=5*exp(-0.2*xscalare);
endyv(k)=yscalare;
end
ESEMPIO
![Page 45: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/45.jpg)
89
% esempio di programma main che richiama% una function da me costruita di nome mia_funz2% sfrutta la natura vettoriale della funzione
t=(-10:0.1:10)';h=mia_funz2(t);plot(t,h)
Programma “main”
% esempio di programma main che % richiama una function, quad,% che ha come argomento anche una function da me costruita di nome mia_funz2
t=(-10:0.1:10)';h=mia_funz2(t);plot(t,h)
a=-2;b=2;area = quad('mia_funz2',a,b)
Programma “main”
90
% esempio di programma main che % richiama una function, quad,% che ha come argomento anche una function da me costruita di nome mia_funz2
t=(-10:0.1:10)';h=mia_funz2(t);plot(t,h)
a=-2;b=2;area = quad('mia_funz2',a,b)
Programma “main”
FUNZIONI CHE OPERANO SU FUNZIONI
![Page 46: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/46.jpg)
91
Integrale definito della funzione sin
Esempi: funzioni di funzioni
92
Integrale definito della funzione 5*sin
Esempi: funzioni di funzioni composte
INLINE Construct INLINE object.INLINE(EXPR) constructs an inline function object from theMATLAB expression contained in the string EXPR. The inputarguments are automatically determined by searching EXPRfor variable names (see SYMVAR). If no variable exists, 'x'is used.
Examples:g = inline('t^2')
![Page 47: INTRODUZIONE A MATLAB - dei.unipd.itgianni/infosan/intro_matlab.pdf · 1 Università degli Studi di Padova Corso di Laurea Specialistica in Bioingegneria A.A. 2005-2006 INTRODUZIONE](https://reader031.vdocuments.pub/reader031/viewer/2022021913/5c693e8e09d3f27c028ccc65/html5/thumbnails/47.jpg)
93
Cerca zeri della funzione sin(x) vicino a 3
Cerca zeri della funzione sin(2*x) vicino a 1
Esempi: funzioni di funzioni e funzioni di funzioni composte
94
ALCUNE FUNZIONI CHE POTRANNO ESSERE UTILI