Sei sulla pagina 1di 37

Introduzione all’uso di MATLAB

—————
Dati Numerici
Dati Non Numerici
Dati Strutturati
—————
Appunti per l’insegnamento di
Metodi Computazionali per la Finanza
Anno Accademico 2017/2018

Riccardo Cambini
Dipartimento di Economia e Management
Università di Pisa,
Via Cosimo Ridolfi 10, 56124 Pisa, ITALY
E-mail: riccardo.cambini@unipi.it

Versione Aprile 2018

Piattaforma E-learning : https://moodle.ec.unipi.it/course/view.php?id=513

1
Dati Numerici
(Live Script realizzato con MATLAB versione 2017b)

clear % si svuota preliminarmente il Workspace di MATLAB per evitare problemi

Valori Numerici
Per default MATLAB memorizza i valori numerici nel formato in virgola mobile a doppia precisione
(double-precision floating-point), ovvero numeri a 64bit di cui 52bit per la mantissa, 11bit per l'esponente
ed 1bit per il segno. Questo formato permette di memorizzare numeri aventi fino a 15 cifre. Anche i
numeri interi vengono memorizzati nel formato in virgola mobile, a meno che non vengano convertiti in
un formato dedicato ai numeri interi.

x=123*sqrt(7);
y=sqrt(15)*log(6);
z=exp(9)*log(2);
x,y,z

x = 325.4274
y = 6.9395
z = 5.6166e+03

Visualizzazione dei valori numerici - comando "format"

Come si vede MATLAB non mostra tutte le cifre memorizzate, ma solamente 4 cifre decimali dopo la
virgola, eventualmente utilizzando la notazione esponenziale.

E' possibile modificare il formato con cui MATLAB visualizza i numeri tramite il comando "format".

format short % (default) notazione fissa con 4 cifre decimali dopo il punto
x,y,z

x = 325.4274
y = 6.9395
z = 5.6166e+03

format long % notazione fissa con 15 cifre decimali dopo il punto


x,y,z

x =
3.254274112609447e+02
y =
6.939454584729698
z =
5.616629778239486e+03

format shortE % notazione scientifica con 4 cifre decimali dopo il punto


x,y,z

1
x =
3.2543e+02
y =
6.9395e+00
z =
5.6166e+03

format longE % notazione scientifica con 15 cifre decimali dopo il punto


x,y,z

x =
3.254274112609447e+02
y =
6.939454584729698e+00
z =
5.616629778239486e+03

format shortG % formato più compatto tra la notazione fissa e quella scientifica,
x,y,z % con un totale di 5 cifre

x =
325.43
y =
6.9395
z =
5616.6

format longG % formato più compatto tra la notazione fissa e quella scientifica,
x,y,z % con un totale di 15 cifre

x =
325.427411260945
y =
6.9394545847297
z =
5616.62977823949

format bank % formato più idoneo per le valute, con 2 cifre decimali dopo il punto
x,y,z

x =
325.43
y =
6.94
z =
5616.63

format rat % esprime il valore tramite la frazione ad esso più vicina


x,y,z

2
x =
40353/124
y =
3553/512
z =
44933/8

Per tornare alla notazione di default basta utilizzare da solo il comando "format"

format % torna alla notazione di default


x,y,z

x = 325.4274
y = 6.9395
z = 5.6166e+03

Valori numerici particolari

Particolari valori numerici sono Inf e NaN.

x=inf % infinito

x = Inf

x=-inf % -infinito

x = -Inf

Per i valori infiniti valgono le usuali regole matematiche dei limiti

x=inf-2^30

x = Inf

anche se in modo matematicamente "improprio" dividendo uno per zero si ottiene infinito

x=1/0

x = Inf

y=NaN % "Not A Number"

y = NaN

Di seguito vengono forniti alcuni esempi di calcoli che forniscono come risultato NaN (sostanzialmente
corrispondono alle forme di indeterminazione del calcolo dei limiti).

y=0/0

y = NaN

3
y=inf/inf

y = NaN

y=0*inf

y = NaN

y=inf-inf

y = NaN

Si osservi come il valore NaN si possa utilizzare nei calcoli senza ricevere errori MATLAB.

15+NaN

ans = NaN

25*NaN

ans = NaN

Arrays, Matrici e Vettori


In MATLAB una tabella multidimensionale di valori numerici è detta Array. Se l'Array è bidimensionale
(ovvero ha dimensione inferiore a tre) viene in particolare detto Matrice, nel caso particolare in cui esso
abbia una sola riga o una sola colonna allora viene detto Vettore, se invece è composto solamente
da un numero allora viene detto Scalare. Si osservi che MATLAB gestisce Array aventi dimensione
maggiore di due (ad esempio un parallelepipedo di numeri).

Vettori

Definiamo inizialmente dei vettori riga e colonna

v=[1 5 3 4 9] % lo spazio vuol dire "accanto", questo è un vettore riga

v =
1 5 3 4 9

w=[4,3,6,7,8] % la virgola vuol dire "accanto", questo è un vettore riga

w =
4 3 6 7 8

z=[2;0;5;3;1] % il punto-e-virgola vuol dire "sotto", questo è un vettore colonna

z =
2
0
5
3

4
1

u= [2 % si può anche andare direttamente accapo per definire


5 % un vettore colonna
6
7]

u =
2
5
6
7

Per sapere la lunghezza di un vettore si usa il comando length:

% attenzione agli errori (o meglio orrori) di ortografia...


n=length(z) % il comando finisce con "...gth" e non con "...ght"

n = 5

E' possibile definire dei vettori anche tramite il ":"

2:6 % numeri da 2 a 6

ans =
2 3 4 5 6

3:2:14 % numeri da 3 a 14 a passo di 2

ans =
3 5 7 9 11 13

h=3:8 % h vettore con componenti da 3 a 8

h =
3 4 5 6 7 8

Matrici

Per definire delle Matrici basta usare opportunamente "spazio", "," e ";". L'unica regola da seguire è tutte
le righe devono contenere lo stesso numero di valori numerici.

% si osservi l'uso degli spazi e del ";",


A=[1 2;3 4] % 1 accanto 2 nuova-riga 3 accanto 4

A =
1 2
3 4

B=[5,6;7,8] % 5 accanto 6 nuova-riga 7 accanto 8

B =
5 6

5
7 8

Q=[2 3 5 6;7 5 0 1]

Q =
2 3 5 6
7 5 0 1

S= [1 2 3
4 5 6
7 8 9]

S =
1 2 3
4 5 6
7 8 9

Per sapere la dimensione di una matrice si usa il comando "size()"

size(Q) % fornisce numero righe e numero colonne

ans =
2 4

size(Q,1) % fornisce solo il numero delle righe

ans = 2

size(Q,2) % fornisce solo il numero delle colonne

ans = 4

[rQ,cQ]=size(Q) % comando utile per memorizzare sia numero righe sia numero colonne

rQ = 2
cQ = 4

Concatenazione di matrici

Per mettere gli array/matrici uno sull'altro ed uno accanto all'altro basta usare "spazio", "," e ";"......

Per evitare errori occorre concatenare le matrici in modo tale da avere in ogni riga sempre lo stesso
numero di valori numerici.

W=[A Q;B,A,B] % A accanto Q nuova-riga B accanto A accanto B

W =
1 2 2 3 5 6
3 4 7 5 0 1
5 6 1 2 5 6
7 8 3 4 7 8

Operazioni tra matrici e vettori

6
Matrici e vettori possono essere oggetto dei classici calcoli matematici tipici dell'algebra lineare e
matriciale.

A+B % somma tra A e B (elemento per elemento)

ans =
6 8
10 12

A-B % da A si sottrae B (elemento per elemento)

ans =
-4 -4
-4 -4

A*B % prodotto riga-colonna tra A e B

ans =
19 22
43 50

A\B % soluzione dell'equazione lineare Ax=B

ans =
-3 -4
4 5

A/B % soluzione dell'equazione lineare xA=B

ans =
3.0000 -2.0000
2.0000 -1.0000

A' % trasposta di A

ans =
1 3
2 4

A^3 % potenza di A, in questo caso A*A*A

ans =
37 54
81 118

inv(A) % inversa di A

ans =
-2.0000 1.0000
1.5000 -0.5000

A^(-1) % ancora inversa di A

ans =
-2.0000 1.0000
1.5000 -0.5000

7
A^(-3) % potenza dell'inversa di A, in questo caso (inv(A))^3

ans =
-14.7500 6.7500
10.1250 -4.6250

Si possono effettuare anche operazioni elemento per elemento, che hanno numerose applicazioni nella
gestione massiva di dati in formato tabellare pur non essendo operazioni matematiche.

A.*B % prodotto elemento per elemento tra A e B

ans =
5 12
21 32

A.\B % matrice con elementi B(i,j)/A(i,j)

ans =
5.0000 3.0000
2.3333 2.0000

A./B % matrice con elementi A(i,j)/B(i,j)

ans =
0.2000 0.3333
0.4286 0.5000

A.^3 % matrice con elementi A(i,j)^3

ans =
1 8
27 64

Preallocazione della memoria, matrici particolari, inizializzazione di maschere

Spesso, scrivendo codice MATLAB, si ha la necessità di preallocare la memoria per velocizzare i cicli
iterativi, di inizializzare delle maschere logiche, di definire matrici identiche, etc etc.

A tal fine vediamo di seguito come definire con un unico comando alcune particolari matrici.

C=zeros(2,4) % matrice 2x4 piena di zeri

C =
0 0 0 0
0 0 0 0

C=zeros(2) % matrice 2x2 piena di zeri

C =
0 0
0 0

C=ones(2,4) % matrice 2x4 piena di uno

8
C =
1 1 1 1
1 1 1 1

C=ones(2) % matrice 2x2 piena di uno

C =
1 1
1 1

C=inf(2,4) % matrice 2x4 piena di Inf

C =
Inf Inf Inf Inf
Inf Inf Inf Inf

C=inf(2) % matrice 2x2 piena di Inf

C =
Inf Inf
Inf Inf

C=eye(2) % matrice identica 2x2

C =
1 0
0 1

C=eye(2,4) % matrice 2x4 con degli uno nella diagonale principale

C =
1 0 0 0
0 1 0 0

C=ones(2,3,4) % parallelepipedo 2x3x4 pieno di uno

C =
C(:,:,1) =

1 1 1
1 1 1

C(:,:,2) =

1 1 1
1 1 1

C(:,:,3) =

1 1 1
1 1 1

C(:,:,4) =

1 1 1

9
1 1 1

Matrici pseudocasuali

E' possibile anche generale matrici di numeri pseudo-casuali:

% matrice 2x4 con numeri pseudo-casuali generati


R=rand(2,4) % nell'intervallo (0,1) con distribuzione uniforme

R =
0.7746 0.3000 0.8133 0.9410
0.2506 0.6826 0.0275 0.9479

% matrice 2x4 con numeri pseudo-casuali generati


R=randn(2,4) % con distribuzione normale

R =
-0.6305 0.8255 -0.1522 1.3356
-0.6414 -1.4769 1.4762 -0.9661

% matrice 2x4 con numeri interi pseudo-casuali generati


R=randi([-5 8],2,4) % nell'intervallo [-5,8] con distribuzione uniforme

R =
3 -1 4 -1
-2 -5 -3 1

% array 2x4x3 con numeri pseudo-casuali generati


R=rand(2,4,3) % nell'intervallo (0,1) con distribuzione uniforme

R =
R(:,:,1) =

0.4931 0.3846 0.7960 0.0577


0.9484 0.9899 0.2745 0.0498

R(:,:,2) =

0.2041 0.1564 0.0663 0.9387


0.4899 0.4558 0.6106 0.3934

R(:,:,3) =

0.6278 0.3863 0.5596 0.9662


0.1284 0.0454 0.2268 0.9430

Possiamo utilizzare il comando "histogram()" per verificare che il comando "rand()" genera numeri
pseudocasuali con distribuzione uniforme mentre il comando "randn()" genera numeri pseudocasuali
con distribuzione normale.

histogram(rand(1,1000000))

10
histogram(randn(1,1000000))

11
Riferimento agli elementi di un vettore - Selezione di una sottovettore - Permutazione delle
componenti

Fino ad ora abbiamo visto come creare un array o un vettore, vediamo adesso come riferirsi ai loro
elementi.

Per i vettori basta specificare la componente da visualizzare, se si specifica più di una componente si
ottiene un sottovettore, le componenti da specificare possono essere contigue oppure no, inoltre con la
stessa sintassi si possono permutare a piacimento le componenti del vettore.

v % questo è il vettore v

v =
1 5 3 4 9

v(2) % secondo elemento di v

ans = 5

v([2,4]) % secondo e quarto elemento di v

ans =
5 4

v([4,2,5]) % quarto, secondo, quinto elemento di v, in questo ordine specifico

ans =
4 5 9

v(1:3) % elementi di v dal primo al terzo

ans =
1 5 3

v(2:4) % elementi di v dal secondo al quinto

ans =
5 3 4

v(2:end) % elementi di v dal secondo all'ultimo

ans =
5 3 4 9

v(:) % tutti gli elementi di v (in colonna)

ans =
1
5
3
4
9

12
Riferimento agli elementi di una matrice - Selezione di una sottomatrice - Permutazione di righe/
colonne

Per le matrici il procedimento è analogo, basta specificare le righe e le colonne da visualizazre.

W % questa è la matrice W

W =
1 2 2 3 5 6
3 4 7 5 0 1
5 6 1 2 5 6
7 8 3 4 7 8

W(3,5) % elemento in riga 3 e colonna 5

ans = 5

W([2,4],6) % righe 2 e 4, colonna 6

ans =
1
8

W(3,[2,5]) % riga 3, colonne 2 e 5

ans =
6 5

% righe 4,2,3 (in questo ordine)


W([4,2,3],[1,6,2,1]) % colonne 1,6,2,1 (in questo ordine, anche con la ripetizione)

ans =
7 8 8 7
3 1 4 3
5 6 6 5

W(2:3,[3,2,4]) % righe da 2 a 3, colonne 3,2,4 in questo ordine

ans =
7 4 5
1 6 2

W(2:end,1:2:6) % righe dalla 2 all'ultima, colonne dalla 1 alla 6 a passo di 2

ans =
3 7 0
5 1 5
7 3 7

W(:,[2,4]) % tutte le righe, colonne 2 e 4

ans =
2 3
4 5
6 2

13
8 4

Inversione delle righe/colonne

Talvolta è utile invertire l'ordine delle colonne oppure delle righe; per far questo vi sono dei comandi
specifici.

W =
1 2 2 3 5 6
3 4 7 5 0 1
5 6 1 2 5 6
7 8 3 4 7 8

flipud(W) % flip Up-Down, inverte l'ordine delle righe

ans =
7 8 3 4 7 8
5 6 1 2 5 6
3 4 7 5 0 1
1 2 2 3 5 6

fliplr(W) % flip Left-Right, inverte l'ordine delle colonne

ans =
6 5 3 2 2 1
1 0 5 7 4 3
6 5 2 1 6 5
8 7 4 3 8 7

Approfondimenti sulla selezione di una sottomatrice - Liste e Maschere


Nel caso in cui si voglia estrarre una particolare sottomatrice di W composta da alcune delle sue
colonne basta richiedere tutte le righe ed indicare le colonne da prendere.

Ciò può essere efficientemente eseguito indicando la lista delle colonne da prendere, oppure la
cosiddetta maschera delle colonne da prendere.

W =
1 2 2 3 5 6
3 4 7 5 0 1
5 6 1 2 5 6
7 8 3 4 7 8

Supponiamo ad esempio di voler selezionare la seconda, quarta e quinta colonna di W tramite una lista.

% lista delle colonne da prendere:


b=[2,4,5] % la seconda, la quarta e la quinta

b =
2 4 5

14
W(:,b) % tutte le righe, le colonne indicate nella lista b

ans =
2 3 5
4 5 0
6 2 5
8 4 7

Facciamo adesso la stessa selezione delle colonne tramite una maschera, ovvero un vettore le cui
componenti corrispondono alle colonne ed in cui il valore 1 indica che si deve prendere la colonna
mentre il valore 0 che non si deve prendere la colonna. Il comando "logical()" serve proprio a specificare
che si devono prendere le colonne corrispondenti agli 1.

% maschera delle colonne da prendere:


b=logical([0,1,0,1,1,0]) % la seconda, la quarta e la quinta

b = 1×6 logical array


0 1 0 1 1 0

W(:,b) % tutte le righe, le colonne indicate nella maschera b

ans =
2 3 5
4 5 0
6 2 5
8 4 7

Come approfondimento, si osservi che la maschera b si poteva definire anche con i valori true e false,
in particolare il valore true indica che si deve prendere la colonna mentre il valore false che non si deve
prendere la colonna.

% maschera delle colonne da prendere:


b=[false,true,false,true,true,false] % la seconda, la quarta e la quinta

b = 1×6 logical array


0 1 0 1 1 0

Errori Numerici e Numeri Macchina


I valori numerici nel formato in virgola mobile a doppia precisione (double-precision floating-point)
vengono memorizzati in 64bit. Questo implica che un computer è capace di memorizzare solamente
un numero finito (2^64) di numeri, chiamati in gergo informatico numeri macchina. Tutti gli altri numeri
(che sono infiniti e non numerabili) vengono quindi approssimati con il numero macchina più vicino,
commettendo un cosiddetto errore numerico.

I particolari valori "realmax" e "realmin" rappresentano, rispettivamente, il più grande numero macchina
positivo ed il più piccolo numero macchina positivo.

% più grande numero positivo rappresentabile nel formato


z=realmax % in virgola mobile a doppia precisione

z = 1.7977e+308

15
% più piccolo numero positivo rappresentabile nel formato
w=realmin % in virgola mobile a doppia precisione

w = 2.2251e-308

Svolgere i calcoli con numeri approssimati comporta ulteriori errori numerici, dando origine al cosiddetto
fenomeno della propagazione degli errori. E' l'utente che deve imparare a gestire gli errori numerici,
onde evitare di ottenere risultati privi di senso. Di seguito sono forniti alcuni semplici esempi di errori
numerici.

x=1-3*((4/3)-1) % dovrebbe essere zero ed invece...

x = 2.2204e-16

a=2^53;
y=(a+1)-a % dovrebbe essere uno ed invece...

y = 0

b=10^(-16);
z=sqrt(1+b)-1 % dovrebbe essere un numero positivo ed invece...

z = 0

Anche con le matrici bisogna prestare particolare attenzione agli errori numerici. Ad esempio
si consideri la matrice S che è una matrice singolare. Il comando "det()" di MATLAB calcola il
determinante tramite il metodo di Jordan ed operazioni riga elementari, il che per errori numerici di
arrotondamento può fornire risultati errati e restituire matrci inverse che in realtà non esistono.

S =
1 2 3
4 5 6
7 8 9

det(S) % dovrebbe essere zero poiché S è singolare

ans = -9.5162e-16

inv(S) % non dovrebbe esistere poiché S è singolare

Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND =
2.202823e-18.
ans =
1.0e+16 *
0.3153 -0.6305 0.3153
-0.6305 1.2610 -0.6305
0.3153 -0.6305 0.3153

MATLAB si accorge che ci potrebbero essere problemi numerici ed avverte con un warning.

Errori analoghi si hanno nel caso della risoluzione dei sistemi lineari Ax=b.

16
A=[3 0 3;5 6 0;2 1 2] % matrice dei coefficienti

A =
3 0 3
5 6 0
2 1 2

b=[1;3;2] % vettore dei termini noti

b =
1
3
2

x=inv(A)*b % si calcola la soluzione tramite l'inversa

x =
-1.0000
1.3333
1.3333

A*x-b % verifica della soluzione, si dovrebbe ottenere il vettore nullo....

ans =
1.0e-15
0
-0.8882
-0.4441

x=A\b % si calcola la soluzione con il metodo di Jordan

x =
-1.0000
1.3333
1.3333

A*x-b % verifica della soluzione, si dovrebbe ottenere il vettore nullo....

ans =
1.0e-15
0.6661
0
0

17
Dati Non Numerici
(Live Script realizzato con MATLAB versione 2017b)

clear % si svuota preliminarmente il Workspace di MATLAB per evitare problemi

Dati Logici
I valori logici sono quelli del tipo true e false (vero e falso) e sono molto usati nella verifica delle
condizioni logiche, nei salti condizionati, nelle maschere.

x=true % x prende "vero"

x = logical
1

y=false % x prende "falso"

y = logical
0

Come si vede, MATLAB traduce true con il valore 1 e false con il valore 0, pur ricordando che essi sono
valori del tipo "logical".

I principali operatori applicabili alle variabili logiche sono l'AND, l'OR ed il NOT.

x && y % x AND y, vero se entrambi sono veri, falso se almeno uno dei due è falso

ans = logical
0

x || y % x OR y, vero se almeno uno dei due è vero, falso se entrambi sono falsi

ans = logical
1

not(x) % NOT x, falso se x è vero, vero se x è falso

ans = logical
0

not(y) % NOT y, falso se y è vero, vero se y è falso

ans = logical
1

x && not(y) % x AND ( NOT y )

1
ans = logical
1

I valori logici si possono ottenere anche come risultato di confronti numerici.

x=2 % si assegna alla variabile x il valore 2

x = 2

x<5 % x è minore di 5? vero

ans = logical
1

x>=3 % x è maggiore o uguale a 3? falso

ans = logical
0

x==4 % x è identicamente uguale a 4? falso

ans = logical
0

x==2 % x è identicamente uguale a 2? vero

ans = logical
1

not(x==3) % x non è identicamente uguale a 3? ovvero, x è diverso da 3? vero

ans = logical
1

Si possono definire anche vettori e matrici di valori logici, che in gergo vengono chiamate maschere. A
tal fine, si possono utilizzare i valori logici true e false oppure si possono utilizzare i valori 0 e 1 associati
al comando "logical()" che indica come l'1 debba essere interpretato come "vero" e lo 0 debba essere
interpretato come "falso".

mask1=[true,false,false,true,true,false]

mask1 = 1×6 logical array


1 0 0 1 1 0

mask2=logical([0,0,1,0,1,1])

mask2 = 1×6 logical array


0 0 1 0 1 1

2
In questo caso è possibile svolgere anche operazioni logiche elemento per elemento, basta scrivere i
simboli "&" e "|" una sola volta.

mask1 & mask2

ans = 1×6 logical array


0 0 0 0 1 0

mask1 | mask2

ans = 1×6 logical array


1 0 1 1 1 1

not(mask1)

ans = 1×6 logical array


0 1 1 0 0 1

Ovviamente ci si può riferire ai singoli elementi di una maschera con la usuale notazione dei vettori.

mask1(2:5)

ans = 1×4 logical array


0 0 1 1

mask2([3,5,2])

ans = 1×3 logical array


1 1 0

Maschere di valori logici si possono ottenere anche valutando vettori numerici.

x=[1,0,-1,3,-2,0,1,-3]

x =
1 0 -1 3 -2 0 1 -3

x>0 % quali sono le componenti positive del vettore x

ans = 1×8 logical array


1 0 0 1 0 0 1 0

x<0 % quali sono le componenti negative del vettore x

ans = 1×8 logical array


0 0 1 0 1 0 0 1

x>=0 % quali sono le componenti positive o nulle del vettore x

ans = 1×8 logical array

3
1 1 0 1 0 1 1 0

x==0 % quali sono le componenti identicamente nulle del vettore x

ans = 1×8 logical array


0 1 0 0 0 1 0 0

not(x==0) % quali sono le componenti non nulle del vettore x

ans = 1×8 logical array


1 0 1 1 1 0 1 1

Se vogliamo infine maschere con soli valori "true" o "false", ad esempio in una fase di inizializzazione,
basta dare un unico comando.

true(1,6)

ans = 1×6 logical array


1 1 1 1 1 1

false(2,4)

ans = 2×4 logical array


0 0 0 0
0 0 0 0

Caratteri - Vettori e matrici di caratteri


Quando si scrive qualcosa tra due singoli apici stiamo definendo un carattere o un vettore di caratteri

char='M' % questo è un carattere

char =
'M'

charVect='Monte dei Paschi' % questo è un vettore di caratteri

charVect =
'Monte dei Paschi'

charArray=['Monte dei Paschi ';


'Unicredit '; % questo è un array di caratteri
'Cassa di Risparmio']

charArray = 3×18 char array


'Monte dei Paschi '
'Unicredit '
'Cassa di Risparmio'

4
Si osservi come in un array di caratteri in ogni riga ci debba essere lo stesso numero di caratteri, il che
comporta l'esigenza di usare degli spazi nel caso di parole di lunghezza diversa.

Ci possiamo riferire agli elementi di un char array nel modo consueto

charVect(4:13)

ans =
'te dei Pas'

charArray([1,3],6:16)

ans = 2×11 char array


' dei Paschi'
' di Risparm'

Sempre utilizzando la notazione vettoriale è facile concatenare tra loro vettori di caratteri.

x='Metodi Computazionali'

x =
'Metodi Computazionali'

y='Finanza'

y =
'Finanza'

z=[x,' per la ',y]

z =
'Metodi Computazionali per la Finanza'

Stringhe - Vettori e matrici di stringhe


Quando si scrive qualcosa tra due doppi apici stiamo definendo una stringa

str="Monte dei Paschi" % questa è una stringa

str =
"Monte dei Paschi"

% questo è un vettore riga di stringhe


strVect1=["Monte dei Paschi", "Unicredit", "Cassa di Risparmio"]

strVect1 = 1×3 string array


"Monte dei Paschi" "Unicredit" "Cassa di Risparmio"

5
% questo è un vettore colonna di stringhe
strVect2=["Monte dei Paschi"; "Unicredit"; "Cassa di Risparmio"]

strVect2 = 3×1 string array


"Monte dei Paschi"
"Unicredit"
"Cassa di Risparmio"

% questa è una matrice di stringhe


strArray=["Monte dei Paschi", "Unicredit"; "A2A", "Cassa di Risparmio"]

strArray = 2×2 string array


"Monte dei Paschi" "Unicredit"
"A2A" "Cassa di Risparmio"

Si osservi come stavolta sia possibile mettere una sopra l'altra stringhe anche di lunghezza diversa (a
differenza di quel che accade per i vettori di caratteri).

In un vettore/matrice di stringhe ci si riferisce ai singoli elementi nel modo consueto.

strVect1(2)

ans =
"Unicredit"

strArray(2,2)

ans =
"Cassa di Risparmio"

Per concatenare tra loro delle stringhe si deve utilizzare l'operatore "+".

x="Metodi Computazionali"

x =
"Metodi Computazionali"

y="Finanza"

y =
"Finanza"

z = x + " per la " + y

z =
"Metodi Computazionali per la Finanza"

Data ed Ora

6
Per assegnare una data ad una variabile occorre utilizzare il comando "datetime()".

t = datetime(2017,2,27) % 27 Febbraio 2017, ordine parametri anno,mese,giorno

t = datetime
27-Feb-2017

% 15 Ottobre 2013, data fornita da stringa


t = datetime('15-oct-2013') % giorno-mese-anno. ATTENZIONE: il mese è in inglese

t = datetime
15-Oct-2013

% 15 Ottobre 2013, il mese si può anche scrivere


t = datetime('15-october-2013') % per esteso. ATTENZIONE: il mese è in inglese

t = datetime
15-Oct-2013

t = datetime('10/15/2013') % 15 Ottobre 2013, comune è il formato mese/giorno/anno

t = datetime
15-Oct-2013

t = datetime(2017,2,27,10,20,0) % 27 Febbraio 2017 ore 10:20

t = datetime
27-Feb-2017 10:20:00

t = datetime('24-Oct-2014 12:45:07') % 24 Ottobre 2014 ore 12:45:07

t = datetime
24-Oct-2014 12:45:07

Attenzione che il formato mese/giorno/anno è ambiguo per i giorni minori od uguali a 12

t = datetime('10/11/2013') % 11 Ottobre 2013 oppure 10 Novembre 2013?

Warning: Successfully read the date/time text using the format 'MM/dd/uuuu', but their format is
ambiguous and could also be 'dd/MM/uuuu'. Specify a format character vector to avoid ambiguity.
t = datetime
11-Oct-2013

Per eliminare l'ambiguità basta specificare il formato utilizzato in ingresso:

% formato giorno/mese/anno,
t = datetime('10/11/2013','InputFormat','dd/MM/uuuu') % quindi 10 Novembre 2013

t = datetime
10-Nov-2013

7
% formato mese/giorno/anno,
t = datetime('10/11/2013','InputFormat','MM/dd/uuuu') % quindi 11 Ottobre 2013

t = datetime
11-Oct-2013

Vi sono anche delle date utili standard, ovvero adesso, oggi, domani ed ieri.

t = datetime('now') % data ed ora in cui viene eseguito il comando

t = datetime
20-Mar-2018 21:44:47

t = datetime('today') % data di oggi

t = datetime
20-Mar-2018

t = datetime('tomorrow') % data di domani

t = datetime
21-Mar-2018

t = datetime('yesterday') % data di ieri

t = datetime
19-Mar-2018

Il comando "datetime()" permette anche di modificare il modo in cui si memorizzano e quindi si


visualizzano le date per mezzo della opzione 'Format'.

t=datetime('28-Jun-2017','Format','dd/MM/uuuu')

t = datetime
28/06/2017

t1 = datetime('28-Jun-2017');
t2 = datetime(t1,'Format','dd/MM/uuuu');
t1

t1 = datetime
28-Jun-2017

t2

t2 = datetime
28/06/2017

t = datetime(2017,6,28,'Format','eeee, MMMM d, uuuu')

8
t = datetime
Wednesday, June 28, 2017

t = datetime(2017,6,28,'Format','uuuu-MM-dd')

t = datetime
2017-06-28

t = datetime(2017,6,28,'Format','dd.MM.uuuu')

t = datetime
28.06.2017

t = datetime(2017,6,28,'Format','dd MMM uuuu')

t = datetime
28 Jun 2017

t = datetime(2017,6,28,'Format','MMMM d, uuuu')

t = datetime
June 28, 2017

t = datetime(2017,6,28,'Format','eeee, MMMM d, uuuu h:mm a')

t = datetime
Wednesday, June 28, 2017 12:00 AM

t = datetime(2017,6,28,'Format','MMMM d, uuuu HH:mm:ss')

t = datetime
June 28, 2017 00:00:00

Di seguito si riportano alcuni parametri per le opzioni di visualizzazione delle date.

uu : anno indicato con le ultime due cifre (es. 17)

uuuu : anno indicato con le 4 cifre (es. 2017)

M : mese indicato tramite una o due cifre (es. 4)

MM : mese indicato tramite due cifre (es. 04)

MMM : mese indicato con nome abbreviato (es. Apr)

MMMM : mese indicato con nome completo (es. April)

d : giorno del mese indicato con una o due cifre (es. 5)

dd : giorno del mese indicato con due cifre (es. 05)

eee : giorno della settimana indicato con nome abbreviato (es. Sat)

9
eeee : giorno della settimana indicato con nome completo (es. Saturday)

a : parte del giorno (AM or PM) (es. PM)

h : ore, indicate con una o due cifre, notazione a 12h (es. 9)

hh : ore, indicate con due cifre, notazione a 12h (es. 09)

H : ore, indicate con una o due cifre, notazione a 24h (es. 8)

HH : ore, indicate con due cifre, notazione a 24h (es. 08)

m : minuti indicati con una o due cifre (es. 7)

mm : minuti indicati con due cifre (es. 07)

s : secondi indicati con una o due cifre (es. 6)

ss : secondi indicati con due cifre (es. 06)

Si osservi come in versioni precedenti di MATLAB venisse utilizzata l'opzione "yyyy" per visualizzare
l'anno. Tale opzione crea problemi con gli anni non positivi ed è stata sostituita con "uuuu".

d=datetime(2018,05,30);
datetime(d,'Format','dd MMM uuuu')

ans = datetime
30 May 2018

datetime(d,'Format','dd MMM yyyy') % nessun problema con anni positivi

ans = datetime
30 May 2018

d=datetime(0,05,30);
datetime(d,'Format','dd MMM uuuu')

ans = datetime
30 May 0000

datetime(d,'Format','dd MMM yyyy') % problemi con l'anno zero

ans = datetime
30 May 0001

d=datetime(-450,05,30);
datetime(d,'Format','dd MMM uuuu')

ans = datetime
30 May -0450

datetime(d,'Format','dd MMM yyyy') % problemi con anni negativi

10
ans = datetime
30 May 0451

Possiamo creare anche vettori e matrici di date

% vettore riga di date


dateVect1=[datetime(2017,2,27), datetime('15-oct-2013'), datetime('now')]

dateVect1 = 1×3 datetime array


27-Feb-2017 15-Oct-2013 20-Mar-2018

% vettore colonna di date


dateVect2=[datetime(2017,2,27); datetime('15-oct-2013'); datetime('now')]

dateVect2 = 3×1 datetime array


27-Feb-2017
15-Oct-2013
20-Mar-2018

% matrice di date
dateArray=[datetime(2017,2,27), datetime('15-oct-2013')
datetime('yesterday'), datetime('tomorrow')]

dateArray = 2×2 datetime array


27-Feb-2017 15-Oct-2013
19-Mar-2018 21-Mar-2018

Si osservi che vettori e matrici di date possono essere velocemente definiti anche utilizzando i cosiddetti
Cell Array (vedasi sezioni successive).

I riferimenti ai singoli elementi dei vettori/matrici di date sono i consueti.

dateVect1(2)

ans = datetime
15-Oct-2013

dateArray(1,2)

ans = datetime
15-Oct-2013

Si osservi inoltre come sia possibile confrontare tra loro delle date ottenendo come risultati dei valori
logici.

d1=datetime('15-mar-2018') % definisce la data d1

d1 = datetime
15-Mar-2018

11
d2=datetime('25-january-2018') % definisce la data d2

d2 = datetime
25-Jan-2018

d3=datetime(2018,1,25) % definisce la data d3

d3 = datetime
25-Jan-2018

d1<d2 % d1 precede temporalmente d2? falso

ans = logical
0

d1>=d3 % d1 è successivo o uguale a d3? vero

ans = logical
1

d1==d2 % d1 coincide con d2? falso

ans = logical
0

d2==d3 % d2 coincide con d3? vero

ans = logical
1

Tramite operazioni numeriche si possono anche incrementare e decrementare le date. A tal fine è utile
utilizzare le funzioni "caldays()", "calweeks()", "calmonths()", "calyears()".

d2

d2 = datetime
25-Jan-2018

d2+caldays(20)

ans = datetime
14-Feb-2018

d2-calweeks(6)

ans = datetime
14-Dec-2017

12
Dati Strutturati
(Live Script realizzato con MATLAB versione 2017b)

clear % si svuota preliminarmente il Workspace di MATLAB per evitare problemi

Structures
Negli Array e Vettori di numeri, date, caratteri e stringhe, tutti i dati devono essere dello stesso tipo. Le
structures servono per poter assegnare ad una variabile un gruppo di dati di tipo diverso.

A tal fine basta dividere la variabile in diversi campi, utilizzando il simbolo "." seguito dal nome del
campo.

S.nome='Paolo Rossi';
S.nascita=datetime('24-Oct-1999');
S.iscritto=true;
S.matricola=712569;
S.matrice=[1 2;3 4];
S.sede="Pisa";
S

S = struct with fields:


nome: 'Paolo Rossi'
nascita: 24-Oct-1999
iscritto: 1
matricola: 712569
matrice: [2×2 double]
sede: "Pisa"

Per richiamare una delle parti della variabile basta specificarne il campo.

S.nome

ans =
'Paolo Rossi'

S.nascita

ans = datetime
24-Oct-1999

S.iscritto

ans = logical
1

S.matricola

1
ans = 712569

S.matrice

ans =
1 2
3 4

S.sede

ans =
"Pisa"

Come approfondimento è interessante osservare che anche i valori "datetime" si possano gestire come
structures.

d0=datetime('20-jul-2016')

d0 = datetime
20-Jul-2016

d0.Day

ans = 20

d0.Month

ans = 7

d0.Year

ans = 2016

Cell Arrays
I Cell Arrays rappresentano il grado massimo di libertà, sono in fatti array in cui in ogni singola cella si
può mettere un oggetto di tipo diverso.

Si definiscono utilizzando le parentesi graffe "{" e "}” invece delle parentesi quadre "[" e "]".

C={25,'Paolo',[1 2;3 4]
S,datetime(2017,2,27),{'Ugo','Gino';'Pippo','Pluto'}
[true,false,false,true],"Unicredit",zeros(2,3,5,8)}

C = 3×3 cell array


{[ 25]} {'Paolo' } {2×2 double}
{1×1 struct } {[27-Feb-2017]} {2×2 cell }
{1×4 logical} {["Unicredit"]} {2×3×5×8 double}

2
Si osservi come le parentesi tonde "(" e ")" permettano di riferirsi ad una cella, mentre le parentesi graffe
"{" e "}" al contenuto della cella.

C(2,2)

ans = 1×1 cell array


{[27-Feb-2017]}

C{2,2}

ans = datetime
27-Feb-2017

C(1,3)

ans = 1×1 cell array


{2×2 double}

C{1,3}

ans =
1 2
3 4

C(2,1)

ans = 1×1 cell array


{1×1 struct}

C{2,1}

ans = struct with fields:


nome: 'Paolo Rossi'
nascita: 24-Oct-1999
iscritto: 1
matricola: 712569
matrice: [2×2 double]
sede: "Pisa"

I Cell Array possono essere utili per definire vettori/matrici di vettori di caratteri, evitando il problema dei
vettori di caratteri di lunghezza diversa.

Srow={'Paolo','Simone','Giuseppe','Gianmarco','Riccardo','Gino'}

Srow = 1×6 cell array


{'Paolo'} {'Simone'} {'Giuseppe'} {'Gianmarco'} {'Riccardo'} {'Gino'}

Scol={'Paolo';'Simone';'Giuseppe';'Gianmarco';'Riccardo';'Gino'}

Scol = 6×1 cell array

3
{'Paolo' }
{'Simone' }
{'Giuseppe' }
{'Gianmarco'}
{'Riccardo' }
{'Gino' }

Sarray={'Paolo','Simone','Giuseppe';'Gianmarco','Riccardo','Gino'}

Sarray = 2×3 cell array


{'Paolo' } {'Simone' } {'Giuseppe'}
{'Gianmarco'} {'Riccardo'} {'Gino' }

I Cell Array possono essere inoltre utili per definire velocemente vettori/matrici di date.

Drow={'12/25/2011','1/2/2012','1/23/2012','2/7/2012','2/15/2012','1/1/2013'};
t1=datetime(Drow)

t1 = 1×6 datetime array


25-Dec-2011 02-Jan-2012 23-Jan-2012 07-Feb-2012 15-Feb-2012 01-Jan-2013

Dcol={'12/25/2011';'1/2/2012';'1/23/2012';'2/7/2012';'2/15/2012';'1/1/2013'};
t2=datetime(Dcol)

t2 = 6×1 datetime array


25-Dec-2011
02-Jan-2012
23-Jan-2012
07-Feb-2012
15-Feb-2012
01-Jan-2013

Darray={'12/25/2011','1/2/2012','1/23/2012';'2/7/2012','2/15/2012','1/1/2013'};
t3=datetime(Darray)

t3 = 2×3 datetime array


25-Dec-2011 02-Jan-2012 23-Jan-2012
07-Feb-2012 15-Feb-2012 01-Jan-2013

Tables
Le Tables sono tabelle di dati in cui in ogni singola colonna i dati sono dello stesso tipo, ma colonne
diverse possono avere dati di tipo diverso.

Le righe e le colonne delle Tables possono avere un nome.

Per vedere come si possono definire le Tables, creiamo preliminarmente dei vettori colonna di date,
nomi e numeri.

Date=datetime({'12/25/2011';'1/2/2012';'1/23/2012';'2/7/2012'});
Nomi={'A2A';'ENEL';'BMPS';'FCA'};
Quotazioni=[5.23;3.45;1.24;2.47];

4
Per definire la tabella basta utilizzare il comando "table()"

T1=table(Date,Nomi,Quotazioni)

T1 = 4×3 table
Date Nomi Quotazioni

1 25-Dec-2011 'A2A' 5.2300

2 02-Jan-2012 'ENEL' 3.4500

3 23-Jan-2012 'BMPS' 1.2400

4 07-Feb-2012 'FCA' 2.4700

E' possibile anche assegnare dei nomi alle singole righe.

NomiRighe={'Acquisto';'Vendita';'Put';'Call'};
T2=table(Date,Nomi,Quotazioni,'RowNames',NomiRighe)

T2 = 4×3 table
Date Nomi Quotazioni

1 Acquisto 25-Dec-2011 'A2A' 5.2300

2 Vendita 02-Jan-2012 'ENEL' 3.4500

3 Put 23-Jan-2012 'BMPS' 1.2400

4 Call 07-Feb-2012 'FCA' 2.4700

Ci si può riferire alle singole colonne (solo alle colonne, non alle righe il cui nome è opzionale)
utilizzando la notazione delle Structures.

T2.Date

ans = 4×1 datetime array


25-Dec-2011
02-Jan-2012
23-Jan-2012
07-Feb-2012

T2.Nomi

ans = 4×1 cell array


{'A2A' }
{'ENEL'}
{'BMPS'}
{'FCA' }

T2.Quotazioni

ans =
5.2300

5
3.4500
1.2400
2.4700

La notazione delle Structures può essere utilizzata anche per definire le Tables.

T3=table;
T3.Giorni=Date;
T3.Titoli=Nomi;
T3.Euro=Quotazioni;
T3

T3 = 4×3 table
Giorni Titoli Euro

1 25-Dec-2011 'A2A' 5.2300

2 02-Jan-2012 'ENEL' 3.4500

3 23-Jan-2012 'BMPS' 1.2400

4 07-Feb-2012 'FCA' 2.4700

Attenzione che per riferirsi ai singoli elementi di una Table occorre utilizzare le parentesi graffe "{” e "}",
se si utilizzano invece le parentesi tonde "(" e ")" si ottengono delle sottotabelle.

T3([1,3],[2,3])

ans = 2×2 table


Titoli Euro

1 'A2A' 5.2300

2 'BMPS' 1.2400

T3([1,3],2)

ans = 2×1 table


Titoli

1 'A2A'

2 'BMPS'

T3{[1,3],2}

ans = 2×1 cell array


{'A2A' }
{'BMPS'}

T3{[1,3],3}

ans =

6
5.2300
1.2400

Quando ci si riferisce agli elementi di una Table si deve far attenzione che siano tutti dello stesso tipo,
altrimenti si ottiene un errore.

T3{[1,3],[2,3]}

Cannot concatenate the table variables 'Euro' and 'Titoli', because their types are double and cell.

Anche per le Tables possono essere talvolta utili i comandi per invertire l'ordine delle righe e colonne,
ad esempio nel caso in cui le righe corrispondano a delle date e si vogliano mettere i dati della tabella in
ordine crescente o decrescente di data.

T3

T3 = 4×3 table
Giorni Titoli Euro

1 25-Dec-2011 'A2A' 5.2300

2 02-Jan-2012 'ENEL' 3.4500

3 23-Jan-2012 'BMPS' 1.2400

4 07-Feb-2012 'FCA' 2.4700

flipud(T3) % flip Up-Down, inverte l'ordine delle righe

ans = 4×3 table


Giorni Titoli Euro

1 07-Feb-2012 'FCA' 2.4700

2 23-Jan-2012 'BMPS' 1.2400

3 02-Jan-2012 'ENEL' 3.4500

4 25-Dec-2011 'A2A' 5.2300

fliplr(T3) % flip Left-Right, inverte l'ordine delle colonne

ans = 4×3 table


Euro Titoli Giorni

1 5.2300 'A2A' 25-Dec-2011

2 3.4500 'ENEL' 02-Jan-2012

3 1.2400 'BMPS' 23-Jan-2012

4 2.4700 'FCA' 07-Feb-2012

Potrebbero piacerti anche