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
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
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
17413000
8 cifre (decimali)
10 -10
e-t=-2-8=-10
10
L1 e L2 contengono, per
losservatore esterno, lo
stesso numero, ma L2
occupa 1 sol byte, anzich 8
13
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
16
0000..000001
2(-1021-53)
2(-1021-53)
Che
ovvero
2-1074
che corrisponde circa a 4.940 10-324
17
18
Comando realmin
In effetti, per realmin Matlab conservativo e prende 2-1022, che corrisponde
a 2.22510-308
19
(1000000000) 2-52
(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
x
2
dove
= 1t
1111..111111
2(1024-53)
1111..111110
2(1024-53)
24
26
Per
effetto
della
quantizzazione, (1+x) 1
risulta diverso da x
27
28
29
Il ciclo dovrebbe
essere infinito,
invece
30
Warning di Matlab
>> 8/0
Warning: Divide by zero.
ans =
Inf
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
Casi particolari: M=1 (vettore riga); N=1 (vettore colonna); M=N=1 (scalare)
36
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.
ESTRAZIONE DI SOTTOMATRICI
Sia
A=[...
2
7
1
2
1
5
10
-3
6
3
4
-4]
41
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
44
Matrici
[M,N]=size(X)
size(X,1)
size(X,2)
45
COMANDO FORMAT
Internamente, Matlab usa sempre doppia precisione. Per lesterno, si
possono usare vari formati:
format short
format long
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
48
whos
load <File>
50
Il comando
A=logspace(Min, Max, N)
genererebbe invece N valori equispaziati su scala logaritmica
51
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
Esempio:
>> a=ones(2,3);
>> b=ones(2,3);
>> a+b
ans =
2 2 2
2 2 2
55
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
equivale a a*inv(b)
60
61
62
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
67
GESTIONE DI POLINOMI
Valutazione:
polyval(p,x)
roots(p)
poly(r)
Radici:
68
>> demos
Dimostrazioni
>> exit
Chiude Matlab
69
70
71
OPERATORI RELAZIONALI
Gli operatori relazionali pi comuni sono:
==
~=
<
<=
uguale
diverso da
minore di
minore o uguale
74
- 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
- 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
78
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
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
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
>> cd <Percorso>
>> chdir <Percorso>
>> what
83
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
s=0;
for i=1:2:10
s=s+i;
end
calcola la somma dei numeri interi88 dispari
minori di 10 (25)
89
0
1
1
1
0
0
1
1
0
0
0
1
90
91
Fa la stessa cosa di
t=(0:1:100)
y=log(t+1)
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
94
ISTRUZIONE PLOT
Una serie temporale (senza asse ascisse)
plot(y)
Una funzione
plot(t,y)
Con i circoletti
plot(t,y,'o')
Circoletti + linea
plot(t,y,'o',t,y)
95
Due spezzate
plot(t1,y1,'o',t2,y2,'*')
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)
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
99
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
300
250
200
150
100
50
0
30
35
40
45
50
55
60
65
100
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
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
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
O(2n)
O(n!)
complessit logaritmica
complessit lineare
complessit n logn
complessit quadratica
complessit cubica
complessit esponenziale
complessit fattoriale
110
Esempio
111
n
det( A ) =
i+ j
(-1)
aij det( A ij )
se n > 1
j=1
114
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
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
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
121
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
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
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
129
Pensare per le
variabili a dei nomi
non riservati
131
132
133
nargout
134
135
136
137
138
La funzione argomento della quad pu essere anche una function creata con
il comando inline