Sei sulla pagina 1di 137

Universit degli Studi di Padova

Corso di Laurea Magistrale in Bioingegneria


A.A. 2015-2016

INFORMATICA MEDICA
(parte 1)
Giovanni Sparacino
Dipartimento di Ingegneria dellInformazione
Universit degli Studi di Padova
Via Gradenigo 6/B, 35131 Padova
Tel. 049 827 7741; e-mail: gianni@dei.unipd.it
web: http://www.dei.unipd.it/~gianni

1. Fondamenti di Calcolo
Scientifico con Matlab

Riferimento:
Quarteroni, A., Saleri F.: Introduzione al Calcolo Scientifico, Springer,
2006 (capitolo 1)
2

1.1. Richiami: Insieme dei Numeri Floating Point


Sia IF linsieme dei numeri rappresentabili allinterno del calcolatore. E
evidente che IF un sottoinsieme, finito, dellinsieme IR
IF IR
Come vedremo, IF ha delle propriet diverse da IR
Preso x IR, chiamiamo fl (x) la sua rappresentazione numero macchina
in IF.
In generale:
x fl (x)
Inoltre, anche se x1 x2 pu accadere che fl (x1)= fl (x2)

Osservazione: rappresentazione esterna dei numeri in Matlab

Di default, Matlab usa, verso


lesterno, una notazione in virgola
fissa, con 4 cifre dopo la virgola
(con arrotondamento sullultima)
Come conseguenza, una variabile
a cui assegnato il valore 1/70
sembrerebbe avere valore diverso
dalla decima parte di una variabile
a cui stato assegnato il valore di
1/7
4

Con format long posso passare a


14 cifre decimali dopo la virgola,
sempre con arrotondamento
sullultima cifra
Tuttavia, anche questa una
rappresentazione solo esterna
Come
sono
rappresentati
realmente i numeri allinterno ?

1.1.1 Rappresentazione dei Numeri Floating Point


La generica rappresentazione floating point ha espressione
(-1)s ( 0. a1 a2 a3 a4 at ) e
Con
lesponente s uguale a 0 oppure ad 1 (di fatto gestisce il segno)
la base un intero soggetto al vincolo 2
a10 (impedisce rappresentazioni multiple dello stesso numero)
ciascuna delle t cifre ai soggetta al vincolo 0 ai <
lesponente e un intero, positivo o negativo (di fatto gestisce la
posizione della virgola, da cui floating point o virgola mobile)
Osservazioni
Siccome a10, per rappresentare lo 0 si usa una tecnica ad hoc (omissis)
Matlab pu usare, in base 10, una rappresentazione esterna simile a 6 quella
sopra, con 16 cifre significative (vd. )

Comando format long e

16 cifre decimali significative

esponente: il segno - indica


che la virgola va spostata a
sinistra di un posto
7

Esempio
Volendo usare il formato floating point, con =10 (base decimale) e t=8
(cio massimo 8 cifre significative), ovvero il formato
(-1)s

(0. a1 a2 a3 a4 a5 a6 a7 a8)

10e

il numero
-0.0017413
verr rappresentato, in modo univoco, come
(-1)1

(0. 1 7 4 1 3 0 0 0)

10 -2

Rappresentazione equivalente con uso della mantissa


La rappresentazione generica floating point
(-1)s (0. a1 a2 a3 a4 at) e
equivalente anche alla
(-1)s m e-t
dove m un numero intero, detto mantissa, a t cifre in base

Esempio
Volendo usare il formato floating point, con t=8 e =10, il numero
-0.0017413
pu essere rappresentato, come visto prima, mediante la
(-1)1

(0. 1 7 4 1 3 0 0 0)

10 -2

(-1)1

(0. 1 7 4 1 3 0 0 0)

10810-8 10 -2

e quindi anche come


(-1)1

17413000
8 cifre (decimali)

10 -10
e-t=-2-8=-10
10

Determinazione dellinsieme IF dei numeri rappresentabili


Per rappresentare i numeri viene quindi usata la notazione floating point
(-1)s (0. a1 a2 a3 a4 at) e
(-1)s m e-t
che richiede di fissare la lunghezza t della mantissa e la base
In un sistema finito c per anche la necessit di fissare gli estremi, L ed U
(risulter ovviamente L<0 e U>0), in cui pu variare l esponente e
Una volta fatto questo, si determinato automaticamente linsieme IF dei numeri
rappresentabili, che pertanto indicato con
IF ( , t, L, U)
11

In Matlab, linsieme IF dato da


IF (2, 53, -1021, 1024)
Pertanto, la mantissa ha, in binario, lunghezza 53. In altri termini, in binario, in
Matlab pu tenere conto fino a 53 cifre significative.
53 cifre significative in binario corrispondono alle 16 cifre significative in
decimale che Matlab in grado di mostrare in modalit format long e

Ciascun numero reale in


Matlab viene quindi ad
occupare 8 byte (doppia
precisione)
12

Osservazione. Per gli interi, Matlab consente di usare rappresentazioni


particolari (utili ad esempio per i livelli di grigio delle immagini, o per trattare gli
indici con cui accedere agli elementi delle matrici, )

L1 e L2 contengono, per
losservatore esterno, lo
stesso numero, ma L2
occupa 1 sol byte, anzich 8

13

Numero massimo di IF+ rappresentabile in Matlab


Evidentemente, il numero positivo
(-1)0 m e-t

nb: m un intero a t cifre espresso in base

pi grande che possibile rappresentare in IF (2, 53, -1021, 1024)


(-1)0

1111..111111

2(1024-53)

(253-1)

2(1024-53)

Che

ovvero
21024 (1- 2-53)
che corrisponde circa a 1.7977 10308

14

Comando realmax

15

Non si pu andare oltre realmax (provare per credere )

16

Numero minimo di IF+ rappresentabile in Matlab


Evidentemente, il numero positivo
(-1)0 m e-t
pi piccolo che possibile rappresentare in IF (2, 53, -1021, 1024)
(-1)0

0000..000001

2(-1021-53)

2(-1021-53)

Che

ovvero
2-1074
che corrisponde circa a 4.940 10-324

17

Provare per credere

18

Comando realmin
In effetti, per realmin Matlab conservativo e prende 2-1022, che corrisponde
a 2.22510-308

19

1.1.2 Lerrore di round-off in Matlab


Per capire quanto vale, in termini relativi, l errore relativo legato al round-off in
Matlab, vediamo la differenza fra il numero 1 e il numero immediatamente
successivo, che indichiamo con 1+
Nellinsieme IF (2, 53, -1021, 1024), il numero 1 si rappresenta con
(-1)0

(1000000000) 2-52

mentre il numero 1+ si rappresenta con


(-1)0

(1000000001) 2-52

La differenza assoluta, che coincide in questo caso con quella relativa, quindi
di 2-52 2.22 10-16
20

1+ = 1+2-52

IF
IR

2-52 /2
1.11 10-16

2-52 /2
1.11 10-16

Passando al generale, possiamo dire che lerrore relativo nella rappresentazione


floating point soggetto alla seguente diseguaglianza
x fl ( x)

x
2

dove

= 1t

(in Matlab =2 e t=53, per cui 2.22 10-16 )


21

In Matlab esiste il comando eps per visualizzare lerrore relativo

Quindi, in Matlab, due numeri di IR distanti in, termini relativi, meno di /2


da un numero di IF non risulteranno distinguibili (attenzione negli algoritmi
iterativi e nei cicli)
22

Osservazione: in IF+ i numeri hanno diversa densit. In particolare, sono molto


addensati verso realmin e molto rarefatti verso realmax.
Ad esempio, realmax corrisponde a
(-1)0

1111..111111

2(1024-53)

mentre realmax- corrisponde a


(-1)0

1111..111110

2(1024-53)

con una differenza di circa 10292 !!!


Per contro, tra realmin e realmin+ c una differenza di circa 10-323
La distanza relativa tra un numero in IF e quello immediatamente superiore
23
comunque costante

Effetto degli errori di round off


x,y IF, vale sempre la propriet commutativa
fl ( x + y ) = fl ( y + x)
fl ( xy ) = fl ( yx)
In generale, non valgono per le propriet associativa e distributiva. Inoltre, gli
errori di round-off causano in certe applicazioni una serie di incongruenze che
vanno previste e trattate in modo accorto.

24

Esempio 1: violazione della propriet associativa

a e (b+c) distano, in termini relativi, meno


di /2 e quindi non sono distinguibili !
25

Esempio 1bis: violazione della propriet associativa


ricordare che
realmax=1.7977 10308

26

Esempio 2: incongruenze calcolando differenze di numeri vicini


La funzione
y=((1+x)-1)/x
vale y=1, x0
Invece, nel calcolatore (nellesempio in Matlab), se x molto piccolo rispetto ad
1

Bisogna stare attenti agli


errori di round-off specie
quando si sommano
numeri che hanno segno
opposto ma modulo
vicino

Per
effetto
della
quantizzazione, (1+x) 1
risulta diverso da x
27

Esempio 3: Altre violazioni legate agli errori di round-off


Si consideri il polinomio y= (x-1)7 scritto come
y= x7 - 7x6 + 21x5 - 35x4 + 35x3 - 21x2 + 7x - 1
in un piccolo intorno di 1, dato da [1-2e-08, 1+2e-08] e plottiamo il grafico

28

29

Esempio 4: Altre violazioni legate agli errori di round-off

Il ciclo dovrebbe
essere infinito,
invece

30

Pertanto esiste b0 tale che a+b=a !!!


guarda caso b inferiore a /2

Violata la propriet della


unicit dello zero
31

Warning di Matlab
>> 8/0
Warning: Divide by zero.
ans =
Inf

Non necessariamente il programma si arresta


INF Infinity.
INF returns the IEEE arithmetic representation for positive
infinity. Infinity is also produced by operations like dividing by
zero, eg. 1.0/0.0, or from overflow, eg. exp(1000).

NaN Not-a-Number.
NaN is the IEEE arithmetic representation for Not-a-Number.
A NaN is obtained as a result of mathematically undefined
operations like 0.0/0.0 and inf-inf.

32

Considerazioni finali sugli errori di round-off


Errare humanum est nei computer inevitabile !!!
Attenzione a prevedere se la nostra applicazione critica nei confronti degli
errori di round-off
A soffrire pi spesso degli errori di round-off sono le tecniche in cui gli errori
vengono propagati (algoritmi iterativi, sistemi non lineari caotici, )
Nella storia, anche recente, molti eventi catastrofici sono riconducibili ad errori di
round-off mal considerati (fallimento lancio Arianne nel 1996, esplosione di un
Patriot su una caserma americana durante la prima guerra del golfo, )
Attenzione speciale nelle applicazioni cliniche (problemi medico-legali, non
andranno a prendersela con Mathworks o con Intel )
33

1.2 Richiami sulla programmazione in MATLAB


MATLAB= MATrix LABoratory.
Lelemento 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
34

PERCHE SI USA 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 altri linguaggi ...
Poich il codice Matlab viene scritto in file di testo, immediatamente
trasferibile ad altre piattaforme dove Matlab installabile (Linux, Mac,
Windows, ...).
Un codice Matlab viene di fatto interpretato, ma anche teoricamente
possibile compilarlo tramite il Matlab Compiler, rendendo cos al contempo
chiuso il sorgente e pi veloce lesecuzione.
35

UTILIZZO DI MATLAB: LA COMMAND WINDOW


Lanciato Matlab, appare la command window con un prompt

Uso la command window per:


lavorare in modalita' interattiva
lanciare lesecuzione di un M-file (= programma in Matlab)

36

UTILIZZO INTERATTIVO DELLA COMMAND WINDOW


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.

Luso interattivo della command window poco conveniente, noioso, inefficiente


( difficile trovare gli errori, se voglio ripetere le operazioni pi volte
devo
37
riscrivere tutto ogni volta...), pu essere utile solo in certi casi o per iniziare!

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
Non mettere il ; sempre e comunque, ma solo
dopo le assegnazioni !!!
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
38
(who+size)

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.

NB: In Matlab i e j sono le costanti che rappresentano lunit immaginaria. Se


dobbiamo usare numeri complessi, bene evitare nel codice luso di i e j
come variabili (anche se consentito)
39

Le matrici si inseriscono per righe


In unoperazione 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(#)
40

ESTRAZIONE DI SOTTOMATRICI
Sia
A=[...
2
7
1

2
1
5

10
-3
6

3
4
-4]

Per accedere ad un elemento:


x=A(3,4)
assegnera 4
Per accedere ad unintera riga, ad es. la 2
x=A(2,:) restituira [7 1 -3 4]
Per accedere ad unintera colonna, ad es. la 3
x=A(:,3) restituira [10 -3 6]
Per accedere ad una sottomatrice, ad es.la 2X2 in basso a destra
x=A(2:3,3:4) restituira [-3 4
6 -4]

41

Le matrici si possono costruire


affiancando matrici piu' piccole (purch
le dimensioni siano compatibili)

42

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

43

Matlab non richiede la


predichiarazione delle variabili
e della loro dimensione.
Addirittura, fa unallocazione
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 !

44

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

45

COMANDO FORMAT
Internamente, Matlab usa sempre doppia precisione. Per lesterno, si
possono usare vari formati:

format short

virgola fissa, 5 cifre

format long

virgola fissa, 15 cifre.

format short e virgola mobile, 5 cifre.


format long e

virgola mobile, 15 cifre.

format short
pi
ans =
3.1416
format long
pi
ans =
3.14159265358979

format short e
pi
ans =
3.1416e+000
format long e
pi
ans =
3.141592653589793e+000

46

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]
47

VARIABILI DI TIPO RECORD

48

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
49

GENERAZIONE DI VETTORI O MATRICI SPECIALI

E possibile generare con


semplicita vettori con elementi
equispaziati avvalendosi del
simbolo :

50

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
51

GENERAZIONE DI VETTORI CASUALI


A=rand(3,5)
A=randn(3,5)

matrice 3x5 con elementi casuali distribuiti unif. in [0,1]


matrice 3x5 con elementi casuali distribuiti gauss. come (0, 1)

Sfruttando le trasformazioni lineari riesco a estrarre da varie distribuzioni di


probabilita
v=10+2*randn(50,1)
vettore colonna di lunghezza 50 con elementi tratti da una distribuzione
gaussiana 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
52

ALTRI ESEMPI
A=[] : matrice vuota
A=eye(10)
matrice identit 10x10
A=zeros(3,5) matrice 3x5 con elementi tutti nulli
A=ones(3,5)
matrice 3x5 con elementi tutti pari a 1
A=diag([3, 5, 6]) matrice 3x3, con elementi sulla diagonale specificati

53

ESEMPI DI OPERAZIONI SULLE MATRICI


Trasposizione di matrice

Per la trasposizione di matrice si usa come in algebra lineare lapice


54

Prodotto per uno scalare, somma, prodotto tra matrici


Matlab esegue in modo intuitivo le operazioni algebriche sulle matrici
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
55

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


nellesempio moltiplicare invece a per la trasposta di b, ottenendo:
>> a*b'
ans =
3 3
3 3

56

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^2
ans =
2 2
2 2
>> x.^2
ans =
1 1
1 1
57

Altro esempio
>> x=[-1,2];
>> x^2
??? Error using ==> ^
Matrix must be square.
Se serve allapplicazione (nb: solo se serve !), ricordarsi che si pu
anteporre alloperatore aritmetico il punto . per indicare che le
operazioni sulle matrici in questione vanno fatte elemento per
elemento
>> x.^2
ans =
1 4
58

Osservazione:
Mettere il . prima
delloperatore
cambia
loperazione drasticamente
perch significa elemento
per elemento

59

Divisione

divisione elemento per elemento

equivale a a*inv(b)

60

Altre operazioni sulle matrici


Ce ne sono uninfinit, 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)

61

Esempi: min, max, sort

62

Esempi: poly, eig

coeff. polinomio caratteristico

colonne di V = autovettori di a

autovalori di a

63

Esempi: lu

64

Manipolazione di matrici

65

Funzioni matematiche
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.

66

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

67

GESTIONE DI POLINOMI
Valutazione:
polyval(p,x)

: calcola il valore del polinomio in x

roots(p)
poly(r)

: radici del polinomio.


: determina il polinomio le cui radici sono r.

Radici:

68

ALCUNI COMANDI PER SOPRAVVIVERE ...


Dalla Command Window
>> <FrecciaSu>,<FrecciaGiu>

Richiama i comandi gi dati dalla Command Window

>> help <NomeComando>

Consulta lhelp in linea per il comando NomeComando

>> lookfor <NomeComando>

Ricerca nel manuale la parola chiave NomeComando

>> demos

Dimostrazioni

>> exit

Chiude Matlab

69

Nellhelp, per soli motivi grafici, la funzione viene scritta in maiuscolo,


ma va usata comunque in minuscolo !!!

Utili le funzioni correlate !

70

Lookfor ci aiuta a trovare comandi di cui non conosciamo lesistenza ...

71

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
ans =
0
>> x==2
ans =
1

(questa relazione e falsa:)

(questa relazione vera)


73

Gli 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

(qui i primi due elementi sono veri)

(qui i primi tre elementi sono veri)

74

USO DEGLI OPERATORI RELAZIONALI COME FUNZIONI


BINARIE
eq
ne
lt
gt
le
ge

- Equal
- Not equal
- Less than
- Greater than
- Less than or equal
- Greater than or equal

==
~=
<
>
<=
>=

75

OPERATORI LOGICI
Gli operatori logici pi comuni sono:
& and logico
|
or logico
~
not logico
Si usano nelle strutture if o while oppure per in operazioni di verifica (vd
esempi sotto)
Esempi:
>> x=1; y= -1;
>> x>0 & y>0
ans =
0
>> x>0 | y>0
ans =
1

(questa relazione falsa)

(questa relazione vera)


76

USO DEGLI OPERATORI LOGICI SU MATRICI


and
or
not
xor
any
all

- Logical AND
&
- Logical OR
|
- Logical NOT
~
- Logical EXCLUSIVE OR
- True if any element of vector is nonzero
- True if all elements of vector are nonzero

77

USO DEGLI OPERATORI LOGICI SU MATRICI


any
all

- True if any element of vector is nonzero


- True if all elements of vector are nonzero

78

ESECUZIONE DI M-FILES DALLA COMMAND WINDOW


Una 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 texteditor (es. notepad) o del
potente editor interno di Matlab
Per far eseguire un M-file dalla
Command
Window,

sufficiente scrivere il nome


dellM-file e battere Invio.
Nella esecuzione di un M-file,
Matlab si comporta come
un
79
interprete.

M-FILES
La scrittura di un M-file rispetto allesecuzione di comandi dalla
Command 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

80

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 x, se x>0, altrimenti stampa un messaggio di errore
x=input('dammi il valore di x ');
if x>=0
a=sqrt(x)
else
disp('errore')
end
pippo=5

% variabile definita senza utilit per capire il significato di variabile di uscita

Functions: sono files di comandi con argomenti in entrata e in uscita. Le eventuali 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)
Attenzione: Questo file deve essere salvato come radfunz.m
else
disp('errore')
end
pippo=5
% variabile definita senza utilit per capire il significato di variabile di uscita
81

Per cominciare ci concentreremo sugli scripts

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 nellinsieme delle cartelle presenti nel matlabpath (toolbox +
quello che abbiamo inserito noi) esiste una function di nome pippo ed
eventualmente cerca di eseguirla
82

GESTIONE DELLA WORKING DIRECTORY


Dalla Command Window
>> dir
>> ls
>> pwd
>> cd

contenuto della directory corrente


idem
percorso della directory corrente
idem

>> cd <Percorso>
>> chdir <Percorso>

cambia la directory corrente


come sopra

>> what

analogo a dir, ma mostra solo i file .m, .mat, .mdl

83

USO DEL % (COMMENTI)


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

84

STRUTTURE DI PROGRAMMAZIONE

85

STRUTTURA IF ELSEEND
Struttura:
if espressione
istruzioni
else
istruzioni
end

Esempio:

if mod(x,2)==0
disp(numero est pari)
else
disp(numero dispari)
end
86

CICLO FOR END


Il ciclo for ha la struttura:
for variabile = espressione
istruzioni
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)

s=0;
for i=1:2:10
s=s+i;
end
calcola la somma dei numeri interi88 dispari
minori di 10 (25)

CICLO WHILE END


Il ciclo while ha la seguente struttura
while espressione
istruzioni
end
Esempio
Esempio
2
x=input('voto
esame (0 per finire)');
i=1;
sommavoti=0;
while i<5
n=0;
i=i+1;0
while x~=
sommavoti=sommavoti+x;
end
n=n+1;
i
x=input('voto esame (0 per finire)');
>> i
end
media=sommavoti/n;
i=
disp(['la media calcolata est=' num2str(media)])
5

89

I cicli possono essere uno dentro laltro.


Esempio (per il ciclo for)
n=4;
for i=1:n
for j=1:i
a(i,j) = 1;
end % j
end %i

Crea una matrice triangolare inferiore:


>> a
a=
1
1
1
1

0
1
1
1

0
0
1
1

0
0
0
1
90

Oss. trucchi per migliorare la velocita


a=zeros(4,4)
n=4;
for i=1:n
for j=1:i
a(i,j) = 1;
end % j
end %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

91

Oss. trucchi per migliorare la velocita


for i=0:100
t(i+1)=i ;
y(i+1)=log(t(i+1)+1);
end %i

Fa la stessa cosa di
t=(0:1:100)
y=log(t+1)

ma e decine di volte pi lento. Meglio vettorizzare il codice.

92

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, ...)
93

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

94

ISTRUZIONE PLOT
Una serie temporale (senza asse ascisse)
plot(y)

Una funzione
plot(t,y)

(di default vengono uniti i punti)

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--')

95

GESTIONE DI PIU GRAFICI


Due funzioni sovrapposte
plot(t1,y1,t2,y2)

Due spezzate

plot(t1,y1,'o',t2,y2,'*')

Una serie di circoletti ed una serie di asterischi

Oppure (comando hold on ... hold off)


plot(t1,y1)
hold on

plot(t2,y2)
.
plot(t3,y3)
hold off

Piu' figure
figure(1)
plot(t1,y1)
figure(2)
plot(t2,y2)

96

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)

prima del plot, subplot(2,2,4)

prima del plot, subplot(6,3,5)

97
prima del plot, subplot(6,1,6)

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.
grid on/off : attiva/disattiva la griglia nella figura attiva.
axis([xmin, xmax, ymin, ymax]) : specifica i range per ascisse e ordinate
axis tight : gli assi finiscono al valore massimo/minimo dei dati (non rimane contorno)
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

98

Apici e Pedici nei titoli/label


ylabel('concentration c_{a}(t)')
xlabel('concentration c^{b}(t)')

Lettere greche nei titoli/label

title( Risultati per \beta = 3')

99

GRAFICI A BARRE (in alternativa a plot)


50

bar(x,y) : produce un diagramma a barre.

45
40
35
30

bar([0:.25:1],[10:10:50])

25
20
15
10
5
0
-0.2

0.2

0.4

0.6

0.8

1.2

350

hist(y,m): suddivide lintervallo 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
hist(50+4*randn(1,5000),50)

300

250

200

150

100

50

0
30

35

40

45

50

55

60

65

100

stem(x,y): adatto quando si


vuole mettere in evidenza il
fatto che il segnale a tempo
discreto

0.8

0.6

0.4

0.2

x=[0:0.1:2*pi];

-0.2

-0.4

y=sin(x);
stem(x,y)

-0.6

-0.8

-1
0

semilogx(x,y) : come plot ma lasse x viene rappresentato in scala log10


semilogy(x,y) : come plot ma lasse y viene rappresentato in scala log10
loglog(x,y) : come plot ma con entrambi gli assi in scala log10.
101

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.8
ns=length(ts);
vn=randn(ns,1);
v=sqrt(0.8)*vn;
zs=ys+v;
plot(t,y,'r--',ts,zs,'bo')
grid
title('curva e campioni rumorosi')
xlabel('tempo')
ylabel('concentrazione')
102

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

103

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

104

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

105

1.3. Richiami: costo computazionale di un algoritmo


Come sappiamo, un algoritmo una sequenza ordinata di operazioni che
portano alla realizzazione di un compito
Si dice costo computazionale di un algoritmo il numero di operazioni
aritmetiche che esso richiede
Di norma, tale numero si esprime in funzione di un parametro che riflette la
dimensione del problema

106

Esempio: Calcolo di
w= u+ 5 v
dove u e v sono vettori di reali di lunghezza n. Devo calcolare, per i=1, 2, n
wi= ui + 5 vi
Il calcolo di ogni singola componente di w mi chiede pertanto 2 operazioni (una
moltiplicazione ed una somma). Per le n componenti, faccio quindi 2n operazioni
Se n vale 10, il numero di operazioni 20
Se n vale 20, il numero di operazioni 40
Pertanto, il numero di operazioni cresce in modo lineare con n. Ci viene indicato con
O(n) (si legge O di enne)

107

Esempio: Calcolo di
w= A v
con A quadrata di dimensione n e v vettore di lunghezza n. Devo calcolare, per i=1, 2,
n
wi= ai1 v1 + ai2 v2 + ai3 v3 + + ain vn
Il calcolo di ogni singola componente di w mi chiede pertanto 2n-1 operazioni (n
moltiplicazioni e n-1 somme). Per le n componenti, faccio quindi 2n2-n operazioni
Se n vale 10, il numero di operazioni 190
Se n vale 20, il numero di operazioni 780
Pertanto, il numero di operazioni cresce in modo grossomodo quadratico con n, e ci si
indica con O(n2) (O di enne quadro)
Domanda: complessit del prodotto tra matrici quadrate ?
108

Esempi di possibili complessit


O(logn)
O(n)
O(nlogn)
O(n2)
O(n3)

O(2n)

O(n!)

complessit logaritmica
complessit lineare
complessit n logn
complessit quadratica
complessit cubica

complessit esponenziale
complessit fattoriale

NB: spesso per stimare la complessit si considerano solo le moltiplicazioni, che


assorbono molto pi tempo macchina rispetto alle addizioni
109

Velocit di un computer nel fare calcoli


Si usa il termine flops per indicare le floating point operations per second
che un calcolatore in grado di eseguire
Attualmente, un calcolatore potente arriva ai tera-flops (1012 flops)
Conoscendo i flops che un sistema di calcolo in grado di effettuare, e la
complessit computazionale dellalgoritmo, si pu avere unidea del
tempo fisico che risulter necessario alla sua esecuzione
In Matlab, la variabile cputime consente di misurare il tempo richiesto da
un algoritmo per la sua esecuzione

110

Esempio

111

Esempio per stimare sperimentalmente la complessit

Domanda: cosa accadrebbe del grafico se passassi ad un computer che


112
garantisce il doppio di flops ?

Ci sono degli algoritmi, anche banali come definizione, il cui costo


computazionale inaccettabile se la dimensione n grande
Esempio: calcolo del determinante
a11 se n = 1

n
det( A ) =
i+ j
(-1)
aij det( A ij )
se n > 1

j=1

dove Aij ottenuto da A


cancellando la riga i e la
colonna j

richiede O(n!) operazioni. Gi per n=24, un supercomputer da 1015 flops


impiegherebbe 20 anni
Fondamentale importanza della disciplina del Calcolo Numerico (ad es. per il
determinante sono stati ricavati metodi basati sul prodotto di matrici, quindi di
113
complessit O(n3) !)

1.4. Scrittura di Custom Function in Matlab


Fino ad ora, abbiamo visto M-files che erano degli script, ovvero programmi
che si eseguono invocandone, dalla command window, il nome
Gli script si fanno eseguire senza passare variabili di ingresso, n ricevere
variabili di uscita
Dentro il workspace, al termine dellesecuzione trovo tutte le variabili definite
nel corso del programma, anche quelle intermedie o meramente di appoggio
<demo>
In programmi complessi nascono banali problematiche di gestione delle variabili
Pu divenire noioso il debugging o lanalisi dei risultati nel momento in cui viene fatto a
video lo scroll di centinaia di variabili con solo 2-3 di interesse

114

Perch (o quando) scrivere function - 1


Approccio top-down alla programmazione: In programmi complessi, pu
essere conveniente spezzare il codice in procedure (nb: se il programma
banale spesso non vale la pena ! )
In Matlab, come in altri linguaggi, si mette tipicamente a punto un programma
main che invoca una o pi function. Ogni function viene scritta in un M-file
separato.
Una function richiede delle variabili in ingresso e, di norma, restituisce in uscita
delle altre variabili.
Le variabili definite allinterno di una function sono locali. Non devo quindi
preoccuparmi se, allinterno della function, vengono usati nomi di variabili gi in
utilizzo nel main o sfruttate in altre function (nb: la function non vede le variabili
del main, le vanno passate quelle necessarie).
115

Esempio
% programma main per la firma digitale
testo=.procuratesto
[p,q]=generaprimicasuali(now)
[ks,kp]=generachiavi(p,q)
testocriptato=rsa(testo, ks)
function [a,b]=generaprimicasuali(data,ora)
% function che usa la data e lora attuale
per generare casualmente a e b primi tra
loro
.
a=
b=

function [ks,kp]=generachiavi(p,q)
% calcola chiave segreta e chiave pubblica
N=p*q
.
.
ks=[N,e];
kp=[N,d];
return
function criptato=rsa(chiaro,k)
% function che usa la chiave k per criptare
.
criptato=.
return

Le tre function possono essere scritte alla cieca da tre persone diverse
Alla fine, nel workspace ci sono solo: testo, p, q, ks, kp, testocriptato 116

Struttura di una Function

La function inizia con una riga che ne specifica il nome (nellesempio radfunz), le
variabili di input e le variabili di output.
La function deve essere salvata in un file con lo stesso nome (nellesempio
radfunz.m)
I commenti dopo la prima riga faranno parte dell help on-line
La function termina naturalmente o forzatamente (comando return)

117

118

Struttura di una Function (pi argomenti)


In generale, le function hanno la seguente struttura
function [out1,out2,]=funz(in1,in2,.)
% commenti per lhelp on line

<operazioni su in1, in2, >


out1=
out2=

return % superfluo se in fondo


Gli argomenti in output vanno a sinistra dell uguale, fra parentesi quadre
Gli argomenti in input vanno a destra dell uguale , fra parentesi tonde
Ricordare che le function possono essere invocate dal programma main
119
passando le variabili di ingresso anche con nome diverso

ESEMPIO
Programma main
% esempio di programma main che richiama
% una function da me costruita di nome mia_funz2
t=(-10:0.1:10)';
h=mia_funz2(t);
plot(t,h)

function yv=mia_funz2(xv)
% questa funzione restituisce un vettore yv
% le cui componenti sono l'immagine delle
% componenti del vettore xv secondo la
% funzione a tratti
% -0.2x+5 se x<0
% 5 exp(-0.2x) se x>=0
n=length(xv);
for k=1:n
xscalare=xv(k);
if xscalare<0
yscalare=-0.2*xscalare+5;
else
yscalare=5*exp(-0.2*xscalare);
end
yv(k)=yscalare;
end

120

La procedura espletata dalla function, anche complicata, viene quindi vista


(dalla command window, come nellesempio radfunz, o dal programma main,
come nellesempio mia_funz2) come se fosse un unico comando
Se si lavora ad un progetto assieme ad altri, ciascuno pu scrivere le proprie
function in modo autonomo, concordando con i colleghi solo argomenti di
ingresso ed uscita (vd prossimo esempio)

121

Perch (o quando) scrivere function - 2


Luso di function anche conveniente quando una stessa porzione di codice
va ripetuta pi volte

122

Esempio
Supponiamo che A, B, C siano matrici 2X2 e di dover calcolare il determinante
del prodotto ABC senza disporre n del comando det, n del comando per
fare il prodotto di matrici.
Potremmo scrivere il codice
DETA=A(1,1)*A(2,2)-A(1,2)*A(2,1)
DETB=B(1,1)*B(2,2)-B(1,2)*B(2,1)
DETC=C(1,1)*C(2,2)-C(1,2)*C(2,1)
e poi calcolare
DETP=DETA*DETB*DETC

123

Ma meglio sarebbe scrivere la function det22


function delta=det22(X)
delta=X(1,1)*X(2,2)-X(1,2)*X(2,1);
return
e poi calcolare
DETP=det22(A)*det22(B)*det22(C)

Vantaggi (pensare a casi pi complessi)


codice pi pulito
codice pi veloce (le function vengono compilate e inserite in memoria la
prima volta che vengono incontrate)
124

ALTRO ESEMPIO

Programma main
% programma main che fa uso della
%function ddpgaussiana.m
a=[-20:0.1:20];
f_a0=ddpgaussiana(a,0,4);
f_a1=ddpgaussiana(a,4,4);
f_a2=ddpgaussiana(a,4,8);
plot(a,f_a0, a,f_a1, a,f_a2)

125

Una custom function pu invocarne unaltra


Supponiamo di voler fare il codice per il determinante di una matrice 3X3
a(1,1) a(1,2) a(1,3)
a = a(2,1) a(2,2) a(2,3)

a(3,1) a(3,2) a(3,3)

Dalla definizione si ha:


a(2,1) a(2,2)
a(2,1) a(2,3)
a(2,2) a(2,3)
det(a) = a(1,1) det(
a
(
1
,
2
)
det(
a
(
1
,
3
)
det(
+

a(3,1) a(3,2)
a(3,1) a(3,3)

a
(
3
,
2
)
a
(
3
,
3
)

Costruiamo allora una nuova function, det33, che sfrutti la det22 appena fatta

126

127

Errori del principiante - 1

La function devessere nella


stessa cartella della function
chiamante, o in una cartella
censita nel matlabpath
128

Aggiunta al Matlabpath della cartella mie_functions

129

Se det22 nella cartella mie_functions

det22 non nella cartella di lavoro

posso invocarla da ovunque mi trovi


130

Errori del principiante - 2

Pensare per le
variabili a dei nomi
non riservati
131

Una function pu invocare anche s stessa


Esempio: Sfruttiamo quanto visto per fare una unica function, det2233, che
calcoli il determinante di una matrice 2X2 o 3X3
Costruiamo allora una nuova function, det2233, che copra entrambe le
dimensioni

132

133

Uso di Nargin e Nargout


nargin

Number of function input arguments

allinterno di una custom function, una variabile riservata che contiene il


numero di variabili di ingresso passate alla function nella sua invocazione

nargout

Number of function output arguments

allinterno di una custom function, una variabile riservata che contiene il


numero di variabili di uscita richieste alla function nella sua invocazione

134

135

Una function pu averne come argomento unaltra


Esempio: Quad per il calcolo di integrale definito
QUAD Numerically evaluate integral.
Q = QUAD(FUN,A,B) tries to approximate the integral of function
FUN from A to B using recursive adaptive Simpson quadrature
A basso livello, la quad fa prima, ad intervalli, uninterpolazione polinomiale
(ordine 2) dei campioni della funzione e poi sfrutta lespressione analitica
locale per calcolare numericamente lintegrale.

136

Esempio: integrale definito della funzione sin

137

La funzione argomento della quad pu ovviamente essere anche codificata


da me in una function memorizzata nella cartella di lavoro o nel Matlabpath
Esempio

138

La funzione argomento della quad pu essere anche una function creata con
il comando inline

Integrale definito della funzione 5sin(x) tra 0 e


139

Potrebbero piacerti anche