CORSO INTRODUTTIVO A MATLAB® - unige.it · o si modifica una variabile. Per la creazione di...
Transcript of CORSO INTRODUTTIVO A MATLAB® - unige.it · o si modifica una variabile. Per la creazione di...
CORSO INTRODUTTIVO A
MATLAB®
Marzo/Aprile 2014 - Andrea Freda
1
Indice Generale
Indice delle Tabelle ....................................................................................................................................................................................................... 4
Indice delle Figure ........................................................................................................................................................................................................ 6
Sezione 1 - Primi passi in Matlab® .................................................................................................................................................................................... 7
1 Introduzione ........................................................................................................................................................................................................... 7
2 L’ambiente di lavoro .............................................................................................................................................................................................. 8
3 Tipi di dati – creazione di dati (strutture elementari) ......................................................................................................................................... 12
3.1 Creazione di dati numerici ............................................................................................................................................................................ 12
3.2 Formati numerici .......................................................................................................................................................................................... 16
3.3 Stringhe ......................................................................................................................................................................................................... 16
4 Manipolazione di array ........................................................................................................................................................................................ 17
4.1 Manipolare dati numerici ............................................................................................................................................................................. 17
4.2 Manipolare stringhe ..................................................................................................................................................................................... 19
5 Operatori .............................................................................................................................................................................................................. 20
5.1 Operatori elementari .................................................................................................................................................................................... 20
5.2 Operatori relazionali ..................................................................................................................................................................................... 24
5.3 Operatori logici ............................................................................................................................................................................................. 25
5.4 Precedenza tra gli operatori ......................................................................................................................................................................... 27
6 Calcolo scientifico ................................................................................................................................................................................................ 28
6.1 Funzioni matematiche .................................................................................................................................................................................. 28
2
6.2 Numeri complessi ......................................................................................................................................................................................... 30
6.3 Costanti ......................................................................................................................................................................................................... 30
7 Matrici particolari ................................................................................................................................................................................................ 31
8 Salvataggio ed esecuzione di script - Funzioni ..................................................................................................................................................... 33
9 Utilizzo dei path ................................................................................................................................................................................................... 37
10 Utilizzo del Workspace – Salvataggio e richiamo dei dati ................................................................................................................................ 38
11 Classi di variabili ............................................................................................................................................................................................... 39
12 Gestione di file e cartelle .................................................................................................................................................................................. 40
Sezione 2 - Principi di grafica, programmazione e tecniche di Input/Output ................................................................................................................ 42
13 Creazione e Personalizzazione di diagrammi ................................................................................................................................................... 42
13.1 Diagrammi 2D ........................................................................................................................................................................................... 42
13.2 Diagrammi 3D ........................................................................................................................................................................................... 51
13.3 Diagrammi multipli.................................................................................................................................................................................... 55
13.4 Editing avanzato: funzioni accessorie, caratteri e simboli particolari ...................................................................................................... 55
13.5 Editing da GUI ........................................................................................................................................................................................... 59
13.6 Salvataggio di diagrammi .......................................................................................................................................................................... 59
14 Funzioni “Detect State” .................................................................................................................................................................................... 60
15 Principi di Programmazione ............................................................................................................................................................................. 62
15.1 Comandi if, else, elseif .............................................................................................................................................................................. 62
15.2 Comando for ............................................................................................................................................................................................. 63
15.3 Comando while ......................................................................................................................................................................................... 64
3
15.4 Comandi break e return ............................................................................................................................................................................ 65
15.5 Comando switch ........................................................................................................................................................................................ 66
15.6 Errori di programmazione ......................................................................................................................................................................... 67
15.7 Efficienza ................................................................................................................................................................................................... 68
16 I/O ..................................................................................................................................................................................................................... 69
16.1 I/O su Video ............................................................................................................................................................................................... 69
16.2 I/O su file ................................................................................................................................................................................................... 69
17 Bibliografia essenziale ...................................................................................................................................................................................... 74
4
INDICE DELLE TABELLE
Tabella 1 Comandi fondamentali per gestire una sessione di Matlab........................................................................................................................... 9
Tabella 2 Alcuni comandi per la manipolazione di dati numerici. ............................................................................................................................... 18
Tabella 3 Alcuni comandi per la manipolazione di stringhe. ....................................................................................................................................... 19
Tabella 4 Operatori relazionali. .................................................................................................................................................................................... 24
Tabella 5 Operatori logici. ............................................................................................................................................................................................ 26
Tabella 6 Funzioni matematiche di uso comune. ........................................................................................................................................................ 29
Tabella 7 Funzioni fondamentali per l’analisi dei numeri complessi. .......................................................................................................................... 30
Tabella 8 Comandi principali per la gestione dei file path. .......................................................................................................................................... 38
Tabella 9 Comandi per la gestione di files e cartelle. .................................................................................................................................................. 40
Tabella 10 Comandi elementari per l’annotazione dei diagrammi. ........................................................................................................................... 44
Tabella 11 Comandi per la caratterizzazione delle proprietà dei tratti delle linee. ................................................................................................... 44
Tabella 12 Opzioni per la caratterizzazione dei tratti dei diagrammi ........................................................................................................................ 45
Tabella 13 Tipologie di diagrammi 2D. ....................................................................................................................................................................... 46
Tabella 14 Tipologie di diagrammi 3D. ....................................................................................................................................................................... 52
Tabella 15 Lettere greche minuscole. ........................................................................................................................................................................ 57
Tabella 16 Lettere greche maiuscole. ......................................................................................................................................................................... 57
Tabella 17 Altri simboli. .............................................................................................................................................................................................. 58
Tabella 18 Funzioni “detect state”. ............................................................................................................................................................................ 60
Tabella 19 Opzioni di salvataggio dei dati tramite comando save. ............................................................................................................................ 70
5
Tabella 20 Flags di formattazione............................................................................................................................................................................... 71
Tabella 21 Field width e precision della formattazione. ............................................................................................................................................ 71
Tabella 22 Conversion characters utilizzati in formattazione. ................................................................................................................................... 71
Tabella 23 Escape characters. .................................................................................................................................................................................... 73
6
INDICE DELLE FIGURE
Figura 1 Aspetto di Matlab all’avvio. .......................................................................................................................................................................... 11
Figura 2 Path Browser. ............................................................................................................................................................................................... 37
Figura 3 Workspace Browser. ..................................................................................................................................................................................... 39
Figura 4 Diagramma di due funzioni (comando plot). ................................................................................................................................................ 43
Figura 5 Esempio di rappresentazione di una funzione a due variabili tramite curve di livello. ............................................................................... 50
Figura 6 Mappe di colore implementate in Matlab. .................................................................................................................................................. 51
Figura 7 Esempio di rappresentazione 3D di una funzione a 2 variabili. ................................................................................................................... 54
Figura 8 Annotazioni su un diagramma. ..................................................................................................................................................................... 56
Figura 9 Figure Toolbar. .............................................................................................................................................................................................. 59
Figura 10 Formato dei dati da specificare in lettura e scrittura: flags, field width, precision e conversion character. ........................................... 71
7
SEZIONE 1 - PRIMI PASSI IN MATLAB®
Nella presente sezione si forniscono i primi strumenti necessari per iniziare ad utilizzare Matlab: accesso al software, creazione di strutture dati
elementari, manipolazione di variabili, operazioni elementari, salvataggio e richiamo di variabili, etc.
1 INTRODUZIONE
La primissima versione di Matlab – abbreviazione di MATrix LABoratory – risale alla fine degli anni '70, e fu creata da Cleve Moler – l’allora
presidente del dipartimento di scienze informatiche dell'Università del New Mexico – quale pacchetto software di supporto alle lezioni di algebra
lineare e analisi numerica.
Oggi Matlab non si limita più al solo calcolo matriciale e numerico, ma ha sviluppato tutta una serie di funzioni per le applicazioni più diverse nel
campo scientifico. La semplicità del linguaggio permette di risolvere problemi molto complessi senza dover sviluppare programmi in Fortran, C o
altri linguaggi di programmazione che richiedano di essere compilati.
Matlab gira su diversi sistemi, dal PC al Mac fino alle Workstation Unix (Sun, Alpha). Essendo le funzioni scritte nella maggior parte dei casi come
file testo, la portabilità da un sistema all'altro di funzioni specifiche scritte dall'utente è garantita praticamente al 100%.
Inoltre, Matlab comprende un vasto set di funzioni predefinite e numerose librerie (toolbox) per svariate applicazioni.
Prima di procedere con l’esplorazione delle funzionalità di Matlab, sono assolutamente necessarie alcune premesse relative al presente corso:
Un corso di circa 16 ore non può assolutamente essere considerato esaustivo, ma (sperabilmente!) propedeutico all’acquisizione delle
competenze necessarie per iniziare a lavorare autonomamente in Matlab;
In Matlab – così come in ogni linguaggio – esistono moltissimi diversi modi per “dire” la stessa cosa; alcuni sono indubbiamente più efficaci
di altri1, ma più che alla “dialettica” si cercherà di badare a fornire quel minimo indispensabile di mezzi operativi necessari a una scoperta
autonoma di un “universo” vastissimo.
1 Si veda in merito l’esempio riportato al §15.7.
8
In Matlab è possibile lavorare interattivamente (ad esempio creando grafici da menu o operando attraverso i dialog box dei diversi
toolbox), tuttavia spesso – soprattutto a fini ingegneristici – è preferibile implementare codici che non richiedano l’intervento umano
durante la loro esecuzione; per questa ragione il corso è orientato prevalentemente all’acquisizione delle conoscenze necessarie alla
scrittura di codici, piuttosto che all’utilizzo dei menu interattivi.
I comandi di Matlab spesso consentono di inserire i valori da elaborare secondo diverse tipologie, a seconda delle opzioni possibili; è
pressoché impossibile spiegare in dettaglio tutte le possibilità offerte dei comandi e delle funzioni a disposizione dell’utente in un corso
della durata di poche ore; per questo motivo i comandi e le funzioni utilizzati nel corso saranno spiegati quanto basta a comprenderne
l’uso “elementare”. Per quanto riguarda la comprensione di comandi e funzioni, spesso se ne indicherà il nome, rimandando all’help in
linea (§2) per quanto riguarda la sintassi degli stessi.
2 L’AMBIENTE DI LAVORO
L'ambiente Matlab, all’avvio del software, generalmente2 si presenta come un'area di lavoro in cui si possono individuare quattro finestre come
mostrato in Figura 1:
1. Command Window. E’ l'area in cui vengono digitati i comandi.
2. Workspace. Vengono visualizzate tutte le variabili definite dall'utente, il tipo e la loro occupazione di memoria.
3. Command History. Riporta l'elenco in ordine cronologico dei comandi che sono stati digitati nella Command Window.
4. Current Directory. Mostra i file della cartella di lavoro corrente.
Nella Command Window è possibile digitare comandi e premere invio per avviare l'elaborazione e visualizzare l'eventuale risultato. È possibile
digitare direttamente sulla linea di comando le operazioni che vogliamo eseguire, sia che si tratti di operazioni sia che si tratti di funzioni
particolari.
Vi sono due tipi di istruzioni digitabili al prompt "»" che appare nella Command Window:
2 Esiste la possibilità di modificare il layout del programma per renderlo più consono alle proprie preferenze, accedendo alla voce desktop layout presente (a seconda della versione di MATLAB installata) alla voce View o Desktop nella barra del menu.
9
assegnamenti “» variabile = espressione”
valutazione di espressioni “» espressione”
La valutazione di un'espressione genera una matrice che viene assegnata alla variabile indicata. Quando nell'istruzione non si specifica la variabile
a cui assegnare il risultato, la valutazione dell'espressione viene assegnata alla variabile di sistema ans (i.e. “answer”). Il risultato dell’assegnazione
viene allocato in memoria ed è esplorabile nel Workspace browser.
Per “pulire” la Command Window è sufficiente digitare il comando clc; i comandi precedentemente digitati rimarranno comunque a disposizione
all’interno della finestra Command History, e le variabili precedentemente assegnate rimangono in memoria. Per cancellare il contenuto del
Workspace si può utilizzare il comando clear. La Tabella 1 mostra alcuni comandi fondamentali per la gestione di una sessione di Matlab.
I comandi possono essere digitati direttamente sulla linea di comando o letti da file testo. Esiste la possibilità di scrivere applicazioni dotate di
interfaccia grafica, come pure di compilare funzioni scritte in un linguaggio tipo C o Fortran. Una grossa quantità di funzioni sono direttamente
leggibili, essendo programmate in script testo con estensione .m.
Tabella 1 Comandi fondamentali per gestire una sessione di Matlab.
Comando Descrizione
clc cancella il contenuto della Command Window
clear elimina tutte le variabili dalla memoria
clear nome elimina la variabile nome
exist nome determina se esiste in memoria la variabile nome (ans=1) oppure no (ans=0)
who elenca le variabili presenti in memoria
whos elenca le variabili presenti in memoria, la loro dimensione, lo spazio occupato e la classe
10
Uno strumento comodo e veloce per imparare ad utilizzare le funzioni e le routine di Matlab è l'help in linea; a titolo di esempio, digitando help fft
nella Command Window:
>> help fft
FFT Discrete Fourier transform.
FFT(X) is the discrete Fourier transform (DFT) of vector X. For
matrices, the FFT operation is applied to each column. For N-D
arrays, the FFT operation operates on the first non-singleton
dimension.
FFT(X,N) is the N-point FFT, padded with zeros if X has less
than N points and truncated if it has more.
FFT(X,[],DIM) or FFT(X,N,DIM) applies the FFT operation across the
dimension DIM.
For length N input vector x, the DFT is a length N vector X,
with elements
N
X(k) = sum x(n)*exp(-j*2*pi*(k-1)*(n-1)/N), 1 <= k <= N.
n=1
The inverse DFT (computed by IFFT) is given by
N
x(n) = (1/N) sum X(k)*exp( j*2*pi*(k-1)*(n-1)/N), 1 <= n <= N.
k=1
See also fft2, fftn, fftshift, fftw, ifft, ifft2, ifftn.
Dall’esempio riguardante la funzione che calcola la Fast Fourier Transform, help è suddiviso in diverse parti:
1. Uso del comando con eventuali opzioni.
2. Cenni alla implementazione del comando (molto utile per essere sicuri che una data funzione con un nome a noi familiare svolga il compito
da noi richiesto).
3. Eventuale esempio di utilizzo.
4. Funzioni correlate.
Per una esplorazione completa e strutturata dell'help occorre accedere ad esso tramite la barra dei menu.
11
L’Help in linea di Matlab – a causa della vastità e della complessità dell’ambiente di lavoro – è uno strumento fondamentale per la comprensione
del corretto utilizzo del software, e durante il corso se ne farà continuo riferimento.
Figura 1 Aspetto di Matlab all’avvio (release 2013a).
12
3 TIPI DI DATI – CREAZIONE DI DATI (STRUTTURE ELEMENTARI)
Matlab lavora con alcuni tipi di dati elementari che sono:
La matrice n-dimensionale di numeri reali, complessi, caratteri o strutture più complesse.
La cella, un contenitore per svariati tipi di dati.
In Matlab non sono indispensabili dichiarazioni di tipi o di dimensioni. Matlab alloca direttamente la memoria necessaria ogni volta che si dichiara
o si modifica una variabile. Per la creazione di variabili occorre però tenere presente alcune convenzioni:
1. le variabili sono case sensitive;
2. i nomi di variabili possono contenere fino a 63 caratteri;
3. i nomi delle variabili devono iniziare con una lettera e possono contenere lettere, numeri e '_'.
I dati (e.g. una matrice) possono essere creati in svariati modi, ad esempio:
Digitando esplicitamente tutti gli elementi.
Utilizzando funzioni specifiche di Matlab.
Utilizzando valori creati in file .m (script).
Caricando i dati da file esterni.
3.1 CREAZIONE DI DATI NUMERICI
Come si è introdotto al paragrafo precedente, esistono diversi metodi per creare dei dati; utilizzando il primo possiamo dichiarare in modo
semplice piccole matrici. I valori devono essere racchiuse tra parentesi quadre. Tra un valore e l'altro può essere messa una virgola o uno spazio.
Per introdurre una nuova riga nella matrice, occorre terminare la precedente con un ; oppure andare a capo. Ad esempio:
>> S = [1 2 3
4 5 6
7 8 9]
S =
13
1 2 3
4 5 6
7 8 9
Oppure:
>> S = [1 2 3; 4 5 6; 7 8 9]
S =
1 2 3
4 5 6
7 8 9
Per la definizione di matrici di dimensione più grande è spesso utile utilizzare alcuni metodi e alcune funzioni messe a disposizione da Matlab. Ad
esempio, per creare un vettore di elementi a incrementi unitari:
>> x = 0:5
x =
0 1 2 3 4 5
Oppure, nel caso si vogliano elementi con incrementi non unitari, è necessario definire l’incremento:
>> y = 0:.5:5
y =
Columns 1 through 9
0 0.5000 1.0000 1.5000 2.0000 2.5000 3.0000 3.5000 4.0000
Columns 10 through 11
4.5000 5.0000
In modo analogo, per creare un vettore uniformemente distribuito tra 0 e 5, utilizzando 11 elementi:
14
>> z = linspace(0,5,11)
z =
Columns 1 through 9
0 0.5000 1.0000 1.5000 2.0000 2.5000 3.0000 3.5000 4.0000
Columns 10 through 11
4.5000 5.0000
Per creare vettori basati su strutture dati differenti esistono altri comandi, e.g.:
>> n = logspace(0,2,11)
n =
Columns 1 through 9
1.0000 1.5849 2.5119 3.9811 6.3096 10.0000 15.8489 25.1189 39.8107
Columns 10 through 11
63.0957 100.0000
Per quanto invece concerne la selezione di elementi di matrici o vettori, definita una matrice 3x4:
>> Q = [1 2 3 4 ; 5 6 7 8 ; 9 10 11 12]
Q =
1 2 3 4
5 6 7 8
9 10 11 12
Si supponga di volerne selezionare tutti gli elementi appartenenti alla prima riga:
>> Q(1,:)
ans =
15
1 2 3 4
…o alla terza colonna:
>> Q(:,3)
ans =
3
7
11
Il simbolo :, utilizzato come indice, significa “tutti gli elementi”. Si supponga di voler selezionare gli elementi appartenenti contemporaneamente
alle prime due righe e alla seconda e la quarta colonna:
>> Q(1:2,[2 4])
ans =
2 4
6 8
È altresì possibile accedere ad un elemento di una matrice con un solo indice: in tal caso gli elementi sono visti come una colonna sotto l'altra,
e.g.:
>> Q(5)
ans =
6
Infine, il comando end da accesso all’ultimo elemento dell’indice:
>> Q(2,end)
ans =
8
16
In Matlab, ogni istruzione deve essere terminata con uno dei seguenti caratteri:
; non viene visualizzato nulla sulla finestra principale di Matlab
, separatore per istruzioni sulla stessa riga
il risultato di ogni operazione viene visualizzato sulla finestra principale
ritorno a capo
Per spezzare una istruzione su più righe, si usa il simbolo speciale ...; per aggiungere dei commenti agli script, essi devono essere preceduti dal
simbolo %.
3.2 FORMATI NUMERICI
Attraverso il comando format, in Matlab è possibile visualizzare i dati numerici utilizzando diverse modalità di output. Ad esempio:
>> x= 34/13;
>> format long, x
x =
2.615384615384615
Si può scegliere tra notazione compatta o estesa (come quella sopra), esponenziale, razionale, bancaria, esadecimale….
Per una piena comprensione del comando format si rimanda all’help di Matlab, digitando help format nella Command Window o utilizzando
direttamente l’help browser.
3.3 STRINGHE
In Matlab un testo è rappresentato da un vettore di caratteri racchiusi tra apici. I dati testuali si possono manipolare, ed è anche possibile
costruire frasi concatenando tra di loro dei vettori (o delle matrici). Ad esempio:
>> a='La' ; b= 'vita'; c= 'è'; d = 'bella!';
17
>> [ a ' ' b ' ' c ' ' d ]
ans =
La vita è bella!
4 MANIPOLAZIONE DI ARRAY
Nel presente paragrafo si illustrano i comandi principali preposti alla manipolazione delle due tipologie “base” di dati che compongono gli array in
Matlab: dati numerici e stringhe. Gli array possono essere composti da entrambe le tipologie (cell array).
4.1 MANIPOLARE DATI NUMERICI
La manipolazione di dati numerici in Matlab è particolarmente agevole grazie alla presenza di svariate funzioni giò implementate. Ad esempio,
considerando la matrice Q già vista al § 3.1:
>> Q = [1 2 3 4 ; 5 6 7 8 ; 9 10 11 12]
Q =
1 2 3 4
5 6 7 8
9 10 11 12
Per conoscerne la dimensione massima, il numero di elementi e il numero di righe e colonne si usano i comandi length, numel e size:
>> length(Q)
ans =
4
>> numel(Q)
ans =
18
12
>> size(Q)
ans =
3 4
Altri utili comandi per la manipolazione delle matrici sono riportati in Tabella 2.
Tabella 2 Alcuni comandi per la manipolazione di dati numerici.
Comando Descrizione
flipud(A) scambia i valori della matrice A dall’alto in basso
fliplr(A) scambia i valori della matrice A da sinistra a destra
rot90(A) ruota la matrice A di 90 gradi in senso antiorario
tril(A) estrae la parte triangolare superiore della matrice A
triu(A) estrae la parte triangolare inferiore della matrice A
reshape(A,m,n) ridimensiona la matrice A a m x n. (A deve contenere m*n elementi)
19
4.2 MANIPOLARE STRINGHE
La Tabella 3 riporta alcuni comandi essenziali per la manipolazione delle stringhe. Dalla Tabella 3 si evince che in Matlab è anche possibile
manipolare le stringhe di valori, sia editandole (ad esempio facendo diventare maiuscoli i caratteri) sia confrontando stringhe diverse. È altresì
possibile convertire una stringa in valore numerico (e viceversa).
Tabella 3 Alcuni comandi per la manipolazione di stringhe.
Comando Descrizione
abs converte una stringa nel corrispondente valore numerico
str2mat crea una matrice testo
setstr converte valore numerico in stringa
lower converte in minuscole
upper converte in maiuscole
strcmp confronta 2 stringhe
strncmp confronta n elementi di due stringhe
strrep trova tutte le occorrenze di una sottostringa e le sostituisce con un’altra sottostringa
num2str converte numero in stringa
str2num converte stringa in numero
20
5 OPERATORI
All’interno di Matlab è possibile svolgere pressoché qualunque operazione matematica, relazionale e logica. Le prossime sezioni illustrano
brevemente i comandi principali.
5.1 OPERATORI ELEMENTARI
Al fine di agevolare la comprensione dei comandi descritti nel seguito, si considerino due matrici di uguale dimensione:
>> A= [ 16 18 6 ; 18 13 11 ; 3 2 19 ]
A =
16 18 6
18 13 11
3 2 19
>> B = [-4 3 12 ; -17 -11 0 ; 1 12 3]
B =
-4 3 12
-17 -11 0
1 12 3
Si possono allora utilizzare l’operatore +:
>> A+B
ans =
12 21 18
1 2 11
4 14 22
l’operatore -:
>> A-B
21
ans =
20 15 -6
35 24 11
2 -10 16
l’operatore *:
>> A*B
ans =
-364 -78 210
-282 43 249
-27 215 93
l’operatore .* [ A.*B = A(i,j)*B(i,j) ]:
>> A.*B
ans =
-64 54 72
-306 -143 0
3 24 57
l’operatore / [ A/B=A · B-1 ]:
>> A/B
ans =
0.3781 -1.0015 0.4874
1.0113 -1.3191 -0.3786
1.8040 -0.6529 -0.8828
l’operatore ./ [ A./B=A(i,j) / B(i,j) ]:
22
>> A./B
ans =
-4.0000 6.0000 0.5000
-1.0588 -1.1818 Inf
3.0000 0.1667 6.3333
l’operatore \ [ A\B=A-1 · B ]:
>> A\B
ans =
-2.4394 -2.9015 -1.5455
1.8657 2.4692 1.9758
0.2414 0.8298 0.1939
l’operatore .\ [ A.\B= B(i,j) /A(I,j) ]:
>> A.\B
ans =
-0.2500 0.1667 2.0000
-0.9444 -0.8462 0
0.3333 6.0000 0.1579
l’operatore ^:
>> A^4
ans =
711502 642486 653232
682575 615875 647800
206349 183382 272609
l’operatore .^n [ A(I,j)^n ]:
23
>> A.^4
ans =
65536 104976 1296
104976 28561 14641
81 16 130321
l’operatore .^N [ A(I,j)^N(i,j) ]:
>> A.^B
ans =
1.5259e-005 5832 2.1768e+009
4.5748e-022 5.5799e-013 1
3 4096 6859
L’operazione di trasposizione delle matrici (e dei vettori) viene effettuata attraverso il comando ':
>> A'
ans =
16 18 3
18 13 2
6 11 19
Si osservi che tale trasposizione è una trasposizione matriciale (algebrica); nel caso di matrice complessa fornisce la matrice complessa trasposta
coniugata. Il comando di trasposizione .' fornisce invece la trasposizione dell’array (non involve la coniugata per matrici complesse).
24
5.2 OPERATORI RELAZIONALI
Gli operatori relazionali definiti in Matlab sono riportati in Tabella 4; il loro utilizzo prevede, come risultato, un valore uguale a 0 (FALSE) o 1
(TRUE). Ad esempio:
>> A= [ 16 18 6 ; 18 13 11 ; 3 2 19 ]; B = [-4 3 12 ; -17 -11 0 ; 1 12 3];
>> A>B
ans =
1 1 0
1 1 1
1 0 1
Tabella 4 Operatori relazionali.
Comando Descrizione
> maggiore
< minore
>= maggiore o uguale
<= minore o uguale
== uguale
~= diverso
Le applicazioni dei comandi relazionali sono ovviamente innumerevoli… si supponga ad esempio di voler selezionare gli elementi di A maggiori di
10; in tal caso è sufficiente utilizzare l’operatore relazionare per selezionare gli elementi:
>> A(A>10)
ans =
16
18
25
18
13
6
11
19
Nel caso fosse necessario conoscere la loro posizione all’interno di A, un comando molto comodo è find:
>> find(A>10)
ans =
1
2
4
5
8
9
Si osservi che il comando find restituisce un solo indice, poiché tratta la matrice come una serie di colonne (cfr. §3.1).
E’ spesso utile ridurre il risultato di comparazioni tra matrici ad una espressione scalare. Allo scopo sono ad esempio disponibili le funzioni:
all: fornisce risultato vero se nessuno degli elementi del vettore passato come parametro vale 0. Sulle matrici opera colonna per colonna.
any: fornisce risultato vero se almeno uno degli elementi del vettore passato come parametro è diverso da 0. Sulle matrici opera colonna
per colonna.
Altre utili funzioni in grado di operare in modo simile sono le cosiddette “detect state” (§14).
5.3 OPERATORI LOGICI
In Matlab esistono tre diverse classi di operatori logici:
Operatori logici element-wise: operano su elementi corrispondenti di array
Operatori logici short-circuit: operano all’interno di espressioni logiche contenenti valori scalari. Questi operatori sono detti “short circuit”
in quanto valutano il secondo operando solo se il risultato non è già definito dal primo operando.
26
Operatori logici bit-wise: operano su bit corrispondenti di numeri interi
La Tabella 5 riporta gli operatori logici definiti in Matlab, suddivisi per classe.
Tabella 5 Operatori logici.
Comando N° operandi Classe Descrizione
& 2 element-wise and3
| 2 element-wise or4
~ 1 element-wise not5
xor 2 element-wise xor6
&& 2 short-circuit and
|| 2 short-circuit or
bitand 2 bit-wise and
bitor 2 bit-wise or
bitxor 2 bit-wise xor
Ad esempio per valutare quali elementi di 2 matrici sono contemporaneamente non nulli:
>> A = [0 1 1 0 1];B = [1 1 0 0 1]; A&B
ans =
3 and restituisce 1 se l’n-esimo valore di entrambi gli operandi non è nullo.
4 or restituisce 1 se almeno uno dei valori degli operandi non è nullo.
5 not restituisce 1 per l’n-esimo valore nullo dell’operando.
6 xor restituisce 1 se uno solo dei valori degli operandi è nullo.
27
0 1 0 0 1
Per quanto riguarda l’utilizzo degli operatori short-circuit se ad esempio A è uguale a zero (cioè lo sono tutti gli elementi) allora l’espressione A&B
riporterà 0, indipendentemente dal valore di B. In tal caso non v’è alcuna necessita quindi di valutare B, e l’utilizzo degli short-cut velocizza
l’esecuzione dei codici. Infine, per quanto concerne gli operatori bit-wise, si considerino:
>> A = 28; % binary 11100
>> B = 21; % binary 10101
>> bitand(A,B)
ans =
20
>> dec2bin(ans)
ans =
10100
5.4 PRECEDENZA TRA GLI OPERATORI
Così come nell’ordinaria prassi del calcolo algebrico, in Matlab esiste una precisa gerarchia di precedenza tra gli operatori. La gerarchia
computazionale di Matlab è la seguente:
1. Parentesi ()
2. Trasposizione (.’), potenza (.^), trasposizione complessa coniugata (’), potenza di matrici (^)
3. Operatori aritmetici unari (+ e -), negazione logica (~)
4. Moltiplicazione (.*), divisione (./ e .\), moltiplicazione di matrici (*), divisione di matrici (/ e \)
5. Addizione (+) e sottrazione (-)
6. Operatore due punti (:)
7. Minore (<), minore o uguale (<=), maggiore (>), maggiore o uguale (>=), uguale (==), diverso (~=)
8. AND element-wise (&)
28
9. OR element-wise (|)
10. AND short-circuit (&&)
11. OR short-circuit (||)
6 CALCOLO SCIENTIFICO
Nel presente capitolo si introducono le funzioni matematiche di uso più comune, la sintassi relativa ai numeri complessi e alcune funzioni utili alla
loro manipolazione e – per completezza – le costanti numeriche utilizzate dal software.
6.1 FUNZIONI MATEMATICHE
La chiamata di funzioni elementari (built in e costruite7), in Matlab, è estremamente semplice; le funzioni possono essere applicate a scalari e
matrici, e.g.:
>> x=1:5; y=log(x)
y =
0 0.69315 1.0986 1.3863 1.6094
Un metodo alternativo, che si rende utile nella creazione di script più complessi, è quella di scrivere un’espressione per poi eseguirla attraverso il
comando eval:
>> y='log(x)'; eval(y)
ans =
7 Alcune funzioni di uso comune o che richiedono notevole tempo di esecuzione sono implementate in Matlab come file eseguibili (built in). Il file m richiamabile digitandone il nome dopo i comandi open o edit restituisce il solo help della funzione, che non è pertanto modificabile. Un esempio di fuinzione built in è il seno (sin).
29
0 0.69315 1.0986 1.3863 1.6094
La Tabella 6 riporta le funzioni matematiche di uso più comune implementate in Matlab, e una loro sintetica descrizione.
Tabella 6 Funzioni matematiche di uso comune.
funzione descrizione funzione descrizione
abs(x) valore assoluto di x acos(x) arco coseno di x
acosh(x) arco coseno iperbolico di x angle(x) angolo di un numero complesso
asin(x) arco seno di x asinh(x) arco seno iperbolico di x
atan(x) arco tangente di x atan2(x,y) arco tangente su 4 quadranti
atanh(x) arco tangente iperbolica di x ceil(x) arrotondamento verso +
conj(x) complesso coniugato di x cos(x) coseno di x
cosh(x) coseno iperbolico di x exp(x) esponenziale di x
fix(x) arrotondamento verso 0 floor(x) arrotondamento verso -
gcd(x,y) massimo comun divisore imag(x) parte immaginaria di x complesso
lcm(x,y) minimo comune multiplo log(x) logaritmo naturale di x
log2(x) logaritmo base 2 log10(x) logaritmo base 10 di x
mod(x,y) modulo del resto di x/y real(x) parte reale di x complesso
rem(x,y) resto di x/y round(x) arrotondamento al numero intero più prossimo
sign(x) segno di x (-1/0/1) sin(x) seno di x
sinh(x) seno iperbolico di x sqrt(x) radice quadrata di x
tan(x) tangente di x tanh(x) tangente iperbolica di x
30
6.2 NUMERI COMPLESSI
Matlab opera sui numeri complessi senza accorgimenti particolari, e anche le operazioni vengono svolte esattamente nello stesso modo di quelle
con numeri reali. La parte complessa di un numero viene indicata aggiungendo la lettera i (o indifferentemente la j) al secondo elemento,
esattamente come nella matematica tradizionale, e.g.:
>> x=2+3i;y=4-5i;z=x*y
z =
23.0000 + 2.0000i
La Tabella 7 riporta alcune funzioni fondamentali per l’analisi dei numeri complessi; esse possono essere applicate a scalari, vettori e matrici.
Tabella 7 Funzioni fondamentali per l’analisi dei numeri complessi.
funzione descrizione
abs(x) modulo del numero complesso x
angle (x) fase del numero complesso x
conj(x) complesso coniugato di x
real (x) parte reale di x
imag(x) parte immaginaria di x
6.3 COSTANTI
Altre costanti predefinite in Matlab, oltre a i e j, sono:
pi pi greco
Inf infinito
NaN “Not a Number” (generata da 0/0, o Inf/Inf)
31
7 MATRICI PARTICOLARI
All’interno di Matlab esistono funzioni ad hoc per la creazione di matrici particolari, ad esempio la matrice identità:
>> A = eye(5) % Identity matrix
A =
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
La matrice diagonale8:
>> B = diag([1 2 3 4 5]) % Diagonal matrices and diagonals of matrix
B =
1 0 0 0 0
0 2 0 0 0
0 0 3 0 0
0 0 0 4 0
0 0 0 0 5
Una matrice di zeri:
>> C = zeros(5) % Create array of all zeros
C =
0 0 0 0 0
0 0 0 0 0
8 La funzione diag consente anche il collocamento degli elementi su diagonali non principali, aggiungendo un secondo indice che specifica su quale diagonale collocare gli elementi.
32
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
Si osservi che l’immissione di un solo indice presuppone una matrice quadrata; se si desidera costruire una matrice avente dimensioni differenti è
sufficiente specificare anche il secondo indice:
>> C = zeros(2,5)
C =
0 0 0 0 0
0 0 0 0 0
Ad esempio, volendo costruire una matrice unitaria:
>> D=ones(3,7) % Create array of all ones
D =
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
O una con valori uniformemente distribuiti:
>> E= rand(4,8) % Uniformly distributed pseudorandom numbers
E =
0.2769 0.6948 0.4387 0.1869 0.7094 0.6551 0.9597 0.7513
0.0462 0.3171 0.3816 0.4898 0.7547 0.1626 0.3404 0.2551
0.0971 0.9502 0.7655 0.4456 0.2760 0.1190 0.5853 0.5060
0.8235 0.0344 0.7952 0.6463 0.6797 0.4984 0.2238 0.6991
È altresì possibile costruire una matrice di valori distribuiti normalmente:
>> F = randn(3,6) % Normally distributed random numbers
F =
33
0.8156 0.6686 -0.0198 0.2573 -0.8051 -0.9219
0.7119 1.1908 -0.1567 -1.0565 0.5287 -2.1707
1.2902 -1.2025 -1.6041 1.4151 0.2193 -0.0592
Esiste poi una matrice un po’ particolare:
>> G = magic(8) % Magic square
G =
64 2 3 61 60 6 7 57
9 55 54 12 13 51 50 16
17 47 46 20 21 43 42 24
40 26 27 37 36 30 31 33
32 34 35 29 28 38 39 25
41 23 22 44 45 19 18 48
49 15 14 52 53 11 10 56
8 58 59 5 4 62 63 1
La funzione magic crea una matrice che contiene tutti i numeri interi da 1 a n2 con somma delle righe e delle colonne costante…e altre
interessanti proprietà (sic).
8 SALVATAGGIO ED ESECUZIONE DI SCRIPT - FUNZIONI
Nelle sezioni precedenti si è visto come sia possibile inserire dati ed eseguire operazioni in Matlab in modalità interattiva, digitando i comandi
direttamente nella Command Window. Nonostante tale modo di procedere sia molto comodo per svolgere semplici operazioni, non risulta
assolutamente conveniente quando un problema richiede svariati comandi o la gestione di array di grandi dimensioni.
È altresì possibile scrivere dei listati di comandi e dati e salvarli in cosiddetti M-file aventi estensione .m, i quali sono file di testo (pertanto
portabili da un sistema all'altro). Tali file, detti anche file script, possono essere eseguiti richiamandoli nella Command Window, digitandone il
nome senza estensione. Il corretto utilizzo e la gestione dei file script è fondamentale per un proficuo utilizzo di Matlab. A tal proposito è
opportuno segnalare che i nomi dei file script devono rispettare le stesse convenzioni valide per i nomi di variabili (§3).
34
I comandi digitati nella Command Window vengono tenuti in memoria nella Command History, e possono essere riutilizzai successivamente. E’
però possibile memorizzare la sequenza di comandi Matlab usando la funzione diary. Tale funzione apre un file, dopodiché tutto ciò che appare
nell’ambiente Matlab viene memorizzato in tale file. Quando viene digitata nuovamente la primitiva diary, la memorizzazione viene terminata ed
il file viene chiuso. A questo punto selezionando open dal menu file è possibile aprire con l’editor di MatLab lo script composto per leggerlo o per
modificarlo.
Si osservi che attraverso il comando diary vengono registrati tutti i comandi immessi: se durante la digitazione viene commesso un errore, tale
errore verrà comunque memorizzato nello script. Lo script deve essere ripulito dalle sequenze di caratteri errate che in esso eventualmente
compariranno. Effettuate tutte le correzioni lo script potrà essere richiamato semplicemente digitandone il nome al prompt.
Nello stesso modo è possibile costruire delle nuove funzioni che possono poi essere richiamate a piacere. Anch’esse vanno salvate in file aventi
estensione m. Le funzioni vengono caricate e precompilate, e questo codice resta in memoria fino alla fine della sessione o fino ad un comando di
clear. Per questo motivo la prima esecuzione di un comando risulta normalmente più lenta, e la lentezza è dovuta alla compilazione del codice.
Una differenza fondamentale tra file script e funzioni è la gestione delle variabili. L’esecuzione di un file script comporta che all’interno del
Workspace vengano allocate tutte le variabili utilizzate, mentre l’esecuzione di una funziona alloca i soli valori dichiarati come output. Le variabili
utilizzate dai file script sono pertanto variabili globali, mentre quelle gestite dalle funzioni sono locali. In merito alle differenze tra le classi di
variabili, si rimanda al §11. Il nome del file contenente la funzione è anche il nome della funzione. La dichiarazione interna dovrebbe accordarsi al
nome dato, ma questo non è assolutamente necessario; è semplicemente scomodo fare il contrario9. Una funzione viene descritta inizialmente
dalla sua definizione nel modo seguente:
[output1,output2,...]=funzione(input1,input2,...)
Nel caso di una sola variabile di output si può evitare di mettere le [ ]. Un esempio di funzione di Matlab:
function y = logspace(d1, d2, n)
%LOGSPACE Logarithmically spaced vector.
% LOGSPACE(X1, X2) generates a row vector of 50 logarithmically
% equally spaced points between decades 10^X1 and 10^X2. If X2
% is pi, then the points are between 10^X1 and pi.
9 Nel senso che è possibile, ad esempio, dichiarare una funzione come output = nome(input) e salvarla come nome2.m, ma quando la si richiamerà sarà fatto attraverso nome2 (e non attraverso nome!).
35
%
% LOGSPACE(X1, X2, N) generates N points.
% For N < 2, LOGSPACE returns 10^X2.
%
% Class support for inputs X1,X2:
% float: double, single
%
% See also LINSPACE, :.
% Copyright 1984-2005 The MathWorks, Inc.
% $Revision: 5.11.4.2 $ $Date: 2005/10/03 16:12:49 $
if nargin == 2
n = 50;
end
n = double(n);
if d2 == pi || d2 == single(pi)
d2 = log10(d2);
end
y = (10).^ [d1+(0:n-2)*(d2-d1)/(floor(n)-1), d2];
Le prime righe, commentate attraverso l’uso del simbolo %, solo le stesse che compaiono digitando nella Command Window il comando help
logspace. Alla fine delle righe commentate inizia la funzione vera e propria.
In Matlab esistono diversi tipi di funzioni:
Funzioni primarie (Primary M-file functions)
Sottofunzioni (Subfunctions)
Funzioni annidate (Nested functions)
Funzioni anonime (Anonymous functions)
Funzioni overloaded (Overloaded functions)
Funzioni private (Private functions)
36
Tutte le funzioni che non siano anonime devono10 essere definite in un M-file avente lo stesso nome della funzione. La prima funzione che appare
in un M-file è detta funzione primaria (primary function). La funzione primaria di un M-file può essere chiamata dalla Command WIndow o da un
altro M-file. La funzione primaria può essere seguita da altre funzioni, dette sottofunzioni (subfunctions). Le sottofunzioni possono essere
chiamate dalla funzione primaria e da altre sottofunzioni all’interno di un M-file, ma non sono visibili all’esterno dell’M-file. Le sottofunzioni non
possono essere chiamate dalla Command WIndow o da altri M-file. E’ possibile definire funzioni all’interno del corpo di altre funzioni. In tal caso si
parla di funzioni annidate (nested functions). Una funzione annidata ha il proprio workspace per le variabili, ma può accedere anche ai workspace
di tutte le funzioni entro le quali è annidata. Se un M-file contiene funzioni annidate, tutte le funzioni devono essere terminate con la parola
chiave end. La funzioni anonime sono semplici forme di funzioni che non hanno nome e non richiedono un M-file. Costituiscono un modo
semplice e veloce per creare funzioni anche da Command Window. La sintassi delle funzioni anonime si avvale del cosiddetto function handle. Il
function handle di una specifica funzione si costruisce facendo precedere il nome della funzione dal simbolo @.La sintassi per la costruzione di una
funzione anonima è:
f = @(arglist)expression
Ad esempio:
>> sqr = @(x) x.^2;
>> a = sqr(5)
a = 25
Per determinare il percorso e la tipologia di una funzione, si può utilizzare il comando functions (sintassi: id = functions(@nomefunzione)). Molto
importante è anche comprendere come Matlab interpreta una linea di comando: quando su una linea viene dato un comando nome l'ordine di
esecuzione è il seguente: variabile nome, funzione interna di Matlab, funzione o script nel path attuale, funzione o script nel path definito in
matlabrc.m (file di startup di Matlab) attraverso la funzione pathdef. Il concetto di path verrà introdotto al prossimo paragrafo.
Si osservi infine che in Matlab esistono delle keyword riservate, che non possono essere utilizzate per nominare variabili, script o funzioni.
L’elenco delle keyword si ottiene digitando iskeyword nella Command Window.
10 Si veda la nota precedente.
37
9 UTILIZZO DEI PATH
Per una corretta gestione del lavoro, è assolutamente indispensabile sapere dove sono registrati gli script e le funzioni che vengono utilizzati.
Come si è accennato al paragrafo precedente, ogni qualvolta si digiti il nome di uno script o si richiami una funzione dalla Command Window (o
dall’interno di un altro M-file), Matlab controlla che si tratti di una variabile presente nel Workspace; se non lo è, interpreta il comando come
invocazione di uno script, e prova ad eseguirlo. Per poterlo fare, vengono passate in rassegna alcune cartelle dove il file potrebbe trovarsi: la
Current Directory (la cartella corrente di lavoro) e altre directories specificate nel Search Path. Il Search Path viene modificato interattivamente
cliccando sulla voce di menu file e selezionando Set path. In tal modo si apre una finestra (Path Browser, Figura 2) da cui è possibile aggiungere
cartelle in cui sono presenti gli script e le funzioni che si vogliono eseguire. Una volta aggiunte le cartelle di interesse, sarà possibile lavorare in una
Current Directory diversa da quelle dove sono memorizzati script e funzioni. Si osservi che il Path Browser lavora gerarchicamente, cioè i file
contenuti nelle cartelle all’inizio della lista sono prioritari rispetto a quelli che si trovano in cartelle di seguito.
Figura 2 Path Browser.
38
È altresì possibile modificare i path non interattivamente attraverso finestre di dialogo ma tramite comandi. La riporta i principali. È infine
possibile modificare manualmente la lista di cartelle appartenenti al Search Path modificando la funzione pathdef.
Tabella 8 Comandi principali per la gestione dei file path.
Comando Descrizione
addpath nome aggiunge la directory nome al path di ricerca
path visualizza il path di ricerca
pathtool apre il Path Browser
pwd visualizza la Current Directory
rmpath nome rimuove la directory nome dal path di ricerca
what elenca tutti i file specifici di Matlab presenti nella Current Directory
what nome elenca tutti i file specifici di Matlab presenti nella directory nome
10 UTILIZZO DEL WORKSPACE – SALVATAGGIO E RICHIAMO DEI DATI
Nel Workspace vengono allocati tutti i dati creati. E’ possibile esplorare il Workspace attraverso i comandi who e whos (Tabella 1, §2), o
direttamente dal Workspace Browser, il quale fornisce informazioni non solo sulla dimensione e la classe delle variabili allocate, ma anche
indicazioni statistiche (valori minimi e massimi, media, deviazione standard…Figura 3).
Le variabili presenti nel Workspace possono essere salvate attraverso il comando save; in questo modo tutte le variabili saranno salvate nel file
matlab.mat (mat è l’estensione dei database Matlab), mentre per salvare solo alcune delle variabili presenti nel Workspace (ad esempio var1 e
var2 nel file nome_file) una delle possibilità è digitare il comando nella forma save nome_file var1 var2. Il database viene salvato nella cartella
corrente, a meno che non venga specificato un percorso diverso. Il comando save viene utilizzato anche per salvare i dati in altri formati (§16.2).
39
Figura 3 Workspace Browser.
11 CLASSI DI VARIABILI
In Matlab esistono tre diverse tipologie di variabili:
Variabili locali
Variabili globali
Variabili persistenti
Le variabili locali sono quelle utilizzate dalle funzioni; queste sono separate dalle variabili di altre funzioni (eccetto per funzioni annidate) e dalle
variabili del Workspace base. Le variabili locali di una funzione non vengono conservate dopo il termine della stessa, di conseguenza i valori
assegnati ad una variabile locale durante l’esecuzione di una funzione non saranno disponibili per un’esecuzione successiva. Si osservi che gli
script condividono il Workspace base con gli altri script e con la Command Window. Quando chiamati da una funzione gli script condividono il
Workspace della funzione.
40
Se diverse funzioni ed eventualmente anche il Workspace base, dichiarano una variabile come globale, allora un’unica istanza di tale variabile
verrà condivisa da tutte le funzioni che la dichiarano. Modifiche ad una variabile globale da parte di una funzione sono immediatamente
disponibili a tutte le funzioni che la condividono. Le variabili globali si dichiarano per mezzo della parola chiave global, e si può ottenere l’elenco
delle variabili globali dichiarate in un Workspace digitando whos global. L’uso delle variabili globali se non in casi circostanziati e circoscritti non è
considerato una buona pratica di programmazione. Anziché usare variabili globali si può passare la variabile ad altre funzioni come argomento
aggiuntivo, oppure utilizzare una variabile persistente.
Le variabili persistenti possono essere usate solo all’interno di funzioni. Solo la funzione in cui la variabile è dichiarata può accedere alla variabile.
Matlab non elimina la variabile al termine dell’esecuzione della funzione. In questo modo, il valore della variabile resta disponibile per una
successiva esecuzione della funzione. Le variabili persistenti sono dichiarate per mezzo della parola chiave persistent.
Quando si dichiara una variabile persistente, Matlab inizializza il suo valore a una matrice vuota, []. Successivamente alla dichiarazione se ne può
assegnare il valore. Un esempio riguardante l’utilizzo delle variabili persistenti è riportato al §15.1.
12 GESTIONE DI FILE E CARTELLE
In Matlab è anche possibile creare, spostare, cancellare files e cartelle. Ciò velocizza enormemente la gestione del lavoro, specie dovendo gestire
grandi quantità di dati. La Tabella 9 riporta i comandi preposti alla gestione di files e cartelle.
Tabella 9 Comandi per la gestione di files e cartelle.
comando descrizione
cd cambia la cartella di lavoro
copyfile copia file o cartelle
delete rimuove files
dir elenca gli oggetti di una cartella
exist controlla se esiste una variabile (o un file, o una cartella)
41
fileattrib determina e imposta gli attributi di file e cartelle
filebrowser browser della Current Directory
isdir Determina se l'input è una cartella
lookfor cerca una keyword nell'help
ls analogo a dir, anche per piattaforma UNIX®
matlabroot root directory di Matlab
mkdir crea una nuova cartella
movefile sposta file o cartelle
pwd identifica la cartella corrente
recycle imposta le opzioni riguardanti i file cancellati dal comando delete (cestino o eliminazione definitiva)
rehash riaggiorna la cache dei path di funzioni e file di sistema
rmdir cancella una cartella
type visualizza i contenuti di un file
what elenca i file Matlab della Current Directory
which trova la cartella contenente funzioni e files
42
SEZIONE 2 - PRINCIPI DI GRAFICA, PROGRAMMAZIONE E TECNICHE DI INPUT/OUTPUT
Prima di procedere con la descrizione di caratteristiche più avanzate riguardanti la soluzione di problemi complessi, ci si soffermerà a fornire gli
strumenti necessari alla creazione di grafici bi- e tri-dimensionali.
13 CREAZIONE E PERSONALIZZAZIONE DI DIAGRAMMI
Matlab consente di creare e personalizzare diagrammi 2D e 3D grazie a moltissime funzioni. Il presente capitolo fornisce le informazioni
fondamentali per la creazione di diagrammi elementari e la loro personalizzazione.
13.1 DIAGRAMMI 2D
I diagrammi bidimensionali sono i più semplici da rappresentare, e probabilmente i più utilizzati. Il comando “base” per la creazione di grafici
bidimensionali è la funzione plot, che consente di rappresentare una o più funzioni:
>> x=0:.01:2*pi;
>> y1=x.*sin(x)+cos(x.^2);
>> y2=x.*-cos(x)+sin(x.^.5);
>> plot(x,y1,x,y2)
>> legend('y_1','y_2')
>> grid on
>> xlabel('x')
>> ylabel('y')
>> xlim([0 2*pi])
L’esempio riportato sopra, il cui risultato è rappresentato in Figura 4, crea contemporaneamente il diagramma di due funzioni; attraverso alcuni
comandi ausiliari (legend, grid, xlabel, ylabel, xlim) si inseriscono inoltre la legenda, la griglia, i titoli degli assi e i limiti dell’asse delle ascisse. La
Tabella 10 riporta i comandi elementari per l’annotazione dei diagrammi.
43
Figura 4 Diagramma di due funzioni (comando plot).
Si osservi che il comando plot, quando utilizzato per rappresentare contemporaneamente uno o più funzioni, attribuisce automaticamente le
proprietà grafiche degli oggetti rappresentati (le funzioni diagrammate in Figura 4 hanno tratti verde e blu, che non sono stati specificati). È
tuttavia possibile specificare le caratteristiche che si vogliono attribuire alle linee all’interno della funzione; la Tabella 11 riporta le stringhe
letterali da assegnare per la caratterizzazione delle proprietà dei tratti delle linee; la Tabella 12 illustra alcune ulteriori opzioni da utilizzarsi nella
particolarizzazione dei diagrammi. Si osservi che – oltre ai colori base riportati in tabella ed espressi tramite identificativo letterale – è possibile
attribuire agli oggetti rappresentati dei diagrammi un qualunque colore RGB (combinazione di 3 valori numerici compresi tra 0 e 1 rappresentanti
il rosso, R, il verde, G, e il blu, B).
Un comando molto versatile, utilizzato da Matlab anche in altri ambiti per modificare le proprietà di svariate tipologie di oggetti, è set, la cui
sintassi è set(H, 'PropertyName', PropertyValue,...), in cui H è l’identificativo dell’oggetto da editare, PropertyName è la proprietà dell’oggetto da
modificare e PropertyValue è il valore che le si vuole assegnare. L’utilizzo di set in ambito di rappresentazione grafica avviene principalmente
modificando le proprietà degli assi (gca) e della figura (gcf).
Ad esempio, il comando:
0 1 2 3 4 5 6-6
-4
-2
0
2
4
6
x
y
y1
y2
44
>> set(gca,'FontName','Times New Roman','Xtick',0:.5:6.5)
Comporta che le indicazioni degli assi siano scritte in font Times New Roman, e che la suddivisione dell’asse delle ascisse sia a passi di 0.5 tra 0 e
6.5.
Tabella 10 Comandi elementari per l’annotazione dei diagrammi.
funzione descrizione
xlim, ylim, zlim fissa i limiti degli assi
axis consente di operare sugli assi attraverso i loro limiti e l’aspetto (opzioni principali: square, equal)
xlabel, ylabel, zlabel inserisce il titolo degli assi
grid inserisce la griglia degli assi
legend inserisce la legenda
title inserisce il titolo del diagramma
text inserisce una stringa di testo a coordinate scelte
Tabella 11 Comandi per la caratterizzazione delle proprietà dei tratti delle linee.
categoria simbolo stile
linea
- linea continua (default)
-- linea tratteggiata
-. tratto punto-linea
: tratto a punti
forma del marker
+ segno più
* asterisco
o circolare
45
s quadrato
. punto
x croce
d rombo
^ triangolo, punta in alto
v triangolo, punta in basso
> triangolo, punta a destra
< triangolo, punta a sinistra
p stella a 5 punte
h stella a 6 punte
colore
k nero
b blu
r rosso
w bianco
g verde
y giallo
m magenta
c ciano
Tabella 12 Opzioni per la caratterizzazione dei tratti dei diagrammi
opzione descrizione
LineWidth definizione spessore della linea
MarkerEdgeColor colore del contorno del marker
46
MarkerFaceColor colore del riempimento del marker
MarkerSize dimensioni del marker
A seconda della tipologia di dati da rappresentare il diagramma base plot potrebbe rivelarsi inadatto, tuttavia in Matlab esiste una vastissima
classe di diagrammi già implementati, che permettono una efficace rappresentazione di pressoché qualunque tipo di struttura dati. La Tabella 13
riporta – suddivise per tipologia di rappresentazione – le funzioni Matlab che realizzano diagrammi 2D.
Tabella 13 Tipologie di diagrammi 2D.
tipologia funzione icona descrizione
diagrammi a linee
plot
diagramma elementare
plotyy
diagramma con doppio asse delle ordinate
loglog
diagramma con assi logaritmici
semilogx
diagramma con asse x logaritmico e y lineare
semilogy
diagramma con asse x lineare e y logaritmico
area
diagramma rappresentante l’area sottesa da una o più curve
errorbar
diagramma rappresentante una curva e l’errore ad essa associato
comet
diagramma animato
47
stem
diagramma rappresentante una curva e i “gambi” relativi a ogni punto
stairs
diagramma a scalini
diagrammi a barre/istogrammi
bar
diagramma a barre (verticali)
barh
diagramma a barre (orizzontali)
hist
istogramma
pareto
istogramma in ordine decrescente con la cumulativa (95% dei valori)
rose
Istogramma polare
diagrammi di dispersione
scatter
diagramma di dispersione
spy
visualizzazione degli elementi non nulli di una matrice
diagrammi a “torta” pie
diagramma a torta
diagrammi polari
polar
diagramma in coordinate polari
compass
diagramma vettoriale (frecce uscenti dall’origine degli assi)
48
diagrammi a curve di livello
contour
curve di livello di una matrice
contourf
curve di livello di una matrice e aree tra le isolinee
rappresentazione di immagini
image
rappresentazione dei valori di una matrice come valori RGB
imagesc
rappresentazione dei valori di una matrice come valori RGB e scalatura sul colormap11.
pcolor
rappresentazione dei valori di una matrice come celle colorate
volumetrie streamslice
rappresentazione di linee di flusso
campi vettoriali
feather
rappresentazione di vettori come frecce aventi origine equidistante
quiver
rappresentazione di vettori aventi origine predefinita
Si supponga di volere rappresentare una funzione del tipo z = f(x, y), con −5 ≤ x ≤ 5, −3 ≤ y ≤ 3. La creazione di una griglia di valori di ascisse e
ordinate semplifica notevolmente le cose; scegliendo ad esempio in entrambi i casi un incremento pari a 0.05, la griglia viene creata attraverso il
comando:
>> [x,y] = meshgrid(-5:0.05:5,-3:0.05:3);
La funzione da rappresentare sia z = cos(x)sin(y), e la rappresentazione avvenga attraverso curve di livello equidistanti a passo 0.1:
11 §13.4.
49
>> z = cos(x).*sin(y);
>> v=floor(min(min(z))):.1:ceil(max(max(z)));
>> [C,h] = contour(x,y,z,v);
>> clabel(C,h,v(1:4:end))
In questo modo attraverso il comando clabel si sono anche indicati i valori delle curve di livello (una indicazione ogni 4 valori del vettore v). Il
risultato è mostrato in Figura 5.
Le etichette sulle curve di livello possono inoltre essere personalizzate a piacimento (consultare l’Help). Talvolta, in questo genere di
rappresentazione, è altresì utile collocare manualmente le etichette sulle curve di livello. Questo si può fare attraverso la sintassi:
>> clabel(C,h,’manual’)
SI osservi infine che senza che sia stato specificato il diagramma è stato rappresentato con linee i cui colori vanno dal rosso al blu. Questa è
l’impostazione base di Matlab (combinazione di colori Jet). È possibile rappresentare le curve di livello (così come le superfici) utilizzando altre
combinazioni cromatiche, attraverso il comando colormap nome combinazione. La Figura 6 mostra le mappe di colore implementate in Matlab. È
comunque possibile crearne di personalizzate attraverso combinazioni RGB.
50
Figura 5 Esempio di rappresentazione di una funzione a due variabili tramite curve di livello.
-0.6
-0.6 -0.6
-0.6
-0.6
-0.6-0
.2-0
.2
-0.2
-0.2
-0.2
-0.2
-0.2-0
.2
-0.2
-0.2
-0.2
-0.2-0
.2-0.2
0.2
0.2
0.2
0.2
0.2
0.2 0
.2
0.2
0.2 0
.2
0.2
0.2
0.2
0.2
0.60
.6
0.6
0.6
0.6
0.6
-5 -4 -3 -2 -1 0 1 2 3 4 5-3
-2
-1
0
1
2
3
51
Figura 6 Mappe di colore implementate in Matlab.
13.2 DIAGRAMMI 3D
La rappresentazione di diagrammi in un piano è probabilmente lo strumento grafico più soventemente utilizzato, tuttavia spesso si rivela
inefficace nella rappresentazione di strutture dati più complesse, o a un elevato numero di dimensioni. Matlab contiene molte funzioni per la
creazione di diagrammi 3D. La Tabella 14 riporta – suddivise per tipologia di rappresentazione – le funzioni Matlab che realizzano diagrammi 3D.
52
Tabella 14 Tipologie di diagrammi 3D.
tipologia funzione icona descrizione
diagrammi a linee
plot3
rappresentazione di linee nello spazio
stem3
rappresentazione di una curva nello spazio e dei “gambi” relativi a ogni punto
comet3
diagramma animato 3D
diagrammi a barre
bar3
diagramma a barre 3D (orientamento verticale)
bar3h
diagramma a barre 3D (orientamento orizzontale)
diagrammi di dispersione
scatter3
diagramma di dispersione 3D
diagrammi a “torta”
pie3
diagramma a torta 3D
diagrammi a curve di livello
contour3
rappresentazione di curve di livello nello spazio
contourslice
rappresentazione di curve di livello corrispondenti a sezioni nello spazio
superfici surf
rappresentazione di una superficie 3D
53
surfc
rappresentazione di una superficie 3D con proiezione delle curve di livello
surfl
rappresentazione di una superficie 3D con illuminazione
mesh
rappresentazione di una superficie 3D tramite griglia
meshc
rappresentazione di una superficie 3D tramite griglia con proiezione delle curve di livello
meshz
rappresentazione di una superficie 3D tramite griglia e piani di riferimento attorno alla superficie stessa
waterfall
rappresentazione di una matrice tramite linee corrispondenti alle righe, e piano di riferimento attorno alla superficie stessa
ribbon
rappresentazione di una matrice tramite linee corrispondenti alle colonne
volumetrie/campi vettoriali
slice
sezione di un volume effettuata con un piano avente orientamento stabilito
streamline
rappresentazione di linee di flusso (3D o 2D)
streamribbon
rappresentazione di linee di flusso tramite nastri
streamtube
rappresentazione di linee di flusso tramite tubi
coneplot
rappresentazione di linee di flusso tramite coni
54
quiver3
rappresentazione di vettori con frecce aventi dimensione proporzionale al modulo
A titolo di esempio, si consideri di rappresentare tridimensionalmente la funzione z=cos(x)sin(y) definita al §13.1 attraverso curve di livello (25
curve) e una griglia a passi di 5 valori, di colore rosso.
I comandi per creare tale grafico, riportato in Figura 7, possono essere i seguenti:
>> mesh(x(1:5:end,1:5:end),y(1:5:end,1:5:end),z(1:5:end,1:5:end),'EdgeColor', 'r')
>> hold on
>> contour3(x,y,z,25)
>> colormap winter
>> set(gca,'FontName','Calibri','FontSize',11)
>> ylabel('y')
>> xlabel('x')
>> title('z=cos(x)sin(y)')
>> zlabel('z')
>> box on
Figura 7 Esempio di rappresentazione 3D di una funzione a 2 variabili.
55
Il commando hold serve a bloccare gli assi, cosicché i successivi diagrammi vengano rappresentati sugli stessi assi precedentemente utilizzati. Il
comando box serve a creare la gabbia degli assi. La scelta cromatica delle curve di livello è effettuata dal comando colormap.
13.3 DIAGRAMMI MULTIPLI
Nel caso si desideri rappresentare grafici in finestre separate, è necessario, prima di invocare i comandi per la realizzazione dei diagrammi, il
comando figure. Il comando figure crea una nuova finestra su cui si possono andare a creare nuovi assi; è inoltre possibile stabilire le proprietà
della nuova finestra (ad esempio le dimensioni e la posizione). La chiusura della figura corrente avviene attraverso il comando close, mentre il
comando close all chiude tutte le figure aperte.
Inoltre, è possibile rappresentare nella stessa figura più diagrammi, attraverso il comando subplot, la cui sintassi è subplot(m, n, p, ‘options’). In
questo contesto m e n impongono a Matlab di generare un array di plot a m righe e n colonne; p indica in quale posizione inserire il diagramma
che si sta invocando. Ciascun diagramma creato col comando subplot ha caratteristiche indipendenti dagli altri diagrammi creati all’interno della
stessa figura. Le opzioni consentono di caratterizzare ciascun diagramma.
13.4 EDITING AVANZATO: FUNZIONI ACCESSORIE, CARATTERI E SIMBOLI PARTICOLARI
Talvolta si rende necessario caratterizzare i diagrammi con informazioni supplementari, così come spesso si deve far ricorso a caratteri tipografici
particolari (simboli matematici, lettere greche…).
Nel caso in cui si desideri inserire una stringa di testo in un grafico (ad esempio per visualizzare un valore) si può utilizzare il comando text
(sintassi: text(x,y,’stringa’, ‘opzioni’)).
Si considerino le seguenti righe di comando:
x=0:.1:10;
omega =pi*3/2; y=exp(-x.^.5).*sin(2*(x+omega));
plot(x,y)
[minimo pos_min]=min(y);
[massimo pos_max]=max(y);
hold on
plot([x(pos_min) x(pos_max)],[minimo massimo],'xr')
text(x(pos_max),massimo,[' \leftarrow \cong' num2str(massimo, '%5.2f')],'FontSize',10)
text(x(pos_min),minimo,[' \leftarrow \cong' num2str(minimo, '%5.2f')],'FontSize',10)
56
title('\ity\rm = e^{-\itx\rm^{1/2}}sin( 2( \itx\rm+\omega ) ), \omega=3/2\pi, 0 \leq \itx\rm \leq 10')
Dapprima si è creato un vettore di ascisse, si è poi creata una funzione e la si è rappresentata. Si sono poi cercati gli estremi della funzione nel
dominio con i comandi min e max, e in corrispondenza di tali punti se ne è inserito il valore numerico con un certo arrotondamento. Si è infine
inserita la funzione assieme al dominio di integrazione come titolo del diagramma. Il risultato è mostrato in Figura 8.
Figura 8 Annotazioni su un diagramma.
Per annotare i valori degli estremi e il titolo si sono utilizzati alcuni caratteri speciali ( , , , lettere greche..), inseriti attraverso comandi specifici.
La Tabella 15 e la Tabella 16 riportano le stringhe letterali da utilizzare per inserire lettere greche minuscole e maiuscole. La Tabella 17 riporta le
stringhe preposte alla creazione di altri simboli speciali.
0 1 2 3 4 5 6 7 8 9 10-0.5
-0.4
-0.3
-0.2
-0.1
0
0.1
0.2
0.3
0.22
-0.43
y = e-x1/2
sin( 2( x+ ) ), =3/2 , 0 x 10
57
Tabella 15 Lettere greche minuscole.
Sequenza Simbolo Sequenza Simbolo Sequenza Simbolo Sequenza Simbolo
\alpha \theta \xi \tau
\beta \vartheta ϑ \phi \upsilon υ
\gamma \iota \pi \chi
\delta \kappa \varpi \psi
\epsilon \lambda \rho \omega
\zeta \mu \sigma
\eta \nu \varsigma ς
Tabella 16 Lettere greche maiuscole.
Sequenza Simbolo Sequenza Simbolo Sequenza Simbolo Sequenza Simbolo
\Gamma \Lambda \Sigma \Psi
\Delta \Xi \Upsilon Υ \Omega Ω
\Theta \Pi \Phi Φ
58
Tabella 17 Altri simboli.
Sequenza Simbolo Sequenza Simbolo Sequenza Simbolo Sequenza Simbolo
\pm ± \leftrightarrow ⟷ \exists ∃ \oplus ⊕
\div ÷ \leftarrow ← \ni ϶ \otimes ⨂
\bullet • \uparrow ↑ \forall ∀ \oslash
\cdot · \rightarrow ⟶ \cap ∩ \lfloor ⌊
\times × \downarrow ↓ \cup ∪ \rfloor ⌋
\geq ≥ \prime ′ \subseteq ⊆ \lceil ⌈
\leq ≤ \partial ∂ \supseteq ⊇ \rceil ⌉
\equiv \int ∫ \subset ⊂ \perp ⊥
\approx ≈ \nabla ∇ \supset ⊃ \langle ⟨
\cong ≅ \Im ℑ \in ∈ \rangle ⟩
\propto ∝ \Re ℜ \0 ∅ \o ο
\neq ≠ \aleph ℵ \vee \clubsuit
\neg ¬ \wp ℘ \wedge \diamondsuit
\surd √ \ldots … \circ ° \heartsuit
\infty ∞ \copyright © \mid \spadesuit
59
13.5 EDITING DA GUI
In alcuni contesti può risultare molto vantaggioso, per modificare i grafici che si sono realizzati, ricorrere agli strumenti che Matlab mette a
disposizione nella finestra che contiene la figura. Di default, nella parte superiore della finestra, compare la Figure Toolbar.
Attraverso la Figure Toolbar, rappresentata in Figura 9, è possibile eseguire degli zoom, tracciare le curve facendo comparire a video il valore
numerico, inserire la legenda, il colorbar, etc…
Figura 9 Figure Toolbar.
Dal menu a tendina “view” della finestra contenente la figura è possibile inoltre abilitare altre toolbar: la Camera Toolbar, che consente di
cambiare i settaggi relativi alla vista 3D, e la Plot Edit Toolbar, che permette di aggiungere elementi grafici.
Dalla Command Window è infine possibile richiamare un ulteriore strumento di editing attraverso il comando plottools.
La modifica interattiva dei diagrammi è estremamente pratica qualora non si abbia molta dimestichezza con la sintassi dei comandi o si debbano
modificare poche figure; qualora si abbia necessità di caratterizzare un elevato numero di diagrammi è però indispensabile utilizzare le functions.
13.6 SALVATAGGIO DI DIAGRAMMI
I diagrammi di Matlab possono essere salvati in formato “proprietario” (i.e. files che possono essere aperti da Matlab e conservano la
modificabilità) o esportati. Il comando principale per il salvataggio di diagrammi è saveas. Tale comando permette di salvare i diagrammi nel
60
formato desiderato. È anche possibile stampare le immagini attraverso il comando print. Le funzionalità di saveas e print sono accessibili anche da
GUI.
14 FUNZIONI “DETECT STATE”
In Matlab esiste una classe di funzioni preposte a stabilire lo stato di svariate “entità”. Tali funzioni sono dette “detect state”, e spesso risultano
essere particolarmente utili in fase di programmazione e gestione delle variabili. Sono elencate, assieme a una sintetica spiegazione del loro
utilizzo, in Tabella 18.
Tabella 18 Funzioni “detect state”.
funzione scopo
isa Detect object of given Matlab class or Java™ class
isappdata Determine if object has specific application-defined data
iscell Determine if input is cell array
iscellstr Determine if input is cell array of strings
ischar Determine if input is character array
iscom Determine if input is Component Object Model (COM) object
isdir Determine if input is directory
isempty Determine if input is empty array
isequal Determine if arrays are numerically equal
isequalwithequalnans Determine if arrays are numerically equal, treating NaNs as equal
isevent Determine if input is object event
isfield Determine if input is Matlab structure array field
61
isfinite Detect finite elements of array
isfloat Determine if input is floating-point array
isglobal Determine if input is global variable
ishandle Detect valid graphics object handles
ishold Determine if graphics hold state is on
isinf Detect infinite elements of array
isinteger Determine if input is integer array
isinterface Determine if input is Component Object Model (COM) interface
isjava Determine if input is Java object
iskeyword Determine if input is Matlab keyword
isletter Detect elements that are alphabetic letters
islogical Determine if input is logical array
ismac Determine if running Matlab for Macintosh® OS X platform
ismember Detect members of specific set
ismethod Determine if input is object method
isnan Detect elements of array that are not a number (NaN)
isnumeric Determine if input is numeric array
ispc Determine if running Matlab for PC (Windows®) platform
isprime Detect prime elements of array
isprop Determine if input is object property
isreal Determine if all array elements are real numbers
isscalar Determine if input is scalar
62
issorted Determine if set elements are in sorted order
isspace Detect space characters in array
issparse Determine if input is sparse array
isstrprop Determine if string is of specified category
isstruct Determine if input is Matlab structure array
isstudent Determine if Student Version of Matlab
isunix Determine if running Matlab for UNIX® platform.
isvarname Determine if input is valid variable name
isvector Determine if input is vector
15 PRINCIPI DI PROGRAMMAZIONE
In generale l’efficienza di Matlab è migliore quando si ricorre a operazioni sugli array che non involvono loop, tuttavia spesso – specie operando su
oggetti multidimensionali – la creazione di cicli diventa una necessità inderogabile. La presente sezione illustra i comandi chiave per la
programmazione attraverso istruzioni logiche e loop.
15.1 COMANDI IF, ELSE, ELSEIF
L’istruzione if valuta un’espressione logica ed esegue una sequenza di istruzioni se l’espressione è vera. Nella sua forma più semplice, la sintassi è
la seguente:
if logical_expression
statements
end
La sequenza di istruzioni da eseguire è delimitata dalle parole chiave if e end. Si consideri il seguente esempio che ricorre a una variabile
persistente (§11) e al comando isempty:
63
function findSum(inputvalue)
persistent SUM_X
if isempty(SUM_X)
SUM_X = 0;
end
SUM_X = SUM_X + inputvalue
Tale funzione inizializza a 0 il valore della variabile al primo utilizzo, dopodichè aggiorna il valore a ogni successive richiamo. Se l’espressione
valutata dall’istruzione if non è scalare, tutti gli elementi del risultato della valutazione dell’espressione devono essere diversi da 0, affinché le
istruzioni seguenti vengano eseguite. Ad esempio:
>> x = round(10 * rand(1,2));
>> y = 0;
>> if x ~= 0
y = 1./x;
end
>> x
x =
4 3
>> y
y =
0.2500 0.3333
L’istruzione else precede una sequenza di istruzioni che vengono eseguite se l’espressione calcolata dall’istruzione if a lei associata risulta falsa.
All’istruzione else non è associata alcuna espressione da valutare. L’istruzione elseif valuta l’espressione logica ad essa associata solo se
l’espressione logica associata all’istruzione if che la precede e quelle associate ad eventuali altre istruzioni elseif precedenti sono tutte false. La
sequenza di istruzioni associate ad una istruzione elseif viene eseguita solo se l’istruzione elseif valuta l’espressione logica a lei associata e il
risultato di tale valutazione è diverso da 0 (vero). Un blocco if può contenere più istruzioni elseif.
15.2 COMANDO FOR
Il comando for ripete un blocco di istruzioni un predeterminato numero di volte. La sintassi è la seguente:
64
for index = start:increment:end
statements
end
L’incremento predefinito è 1. E’ tuttavia possibile specificare un incremento diverso, anche negativo. Per indici positivi, l’esecuzione termina
quando il valore dell’indice supera il valore finale. Per incrementi negativi, il ciclo si conclude quando il valore dell’indice scende al di sotto del
valore finale. Si consideri il seguente esempio (stupido e malsano…non vogliatemene!):
>> for i=1:10, x(i)=i; end
>> x
x =
1 2 3 4 5 6 7 8 9 10
Analogamente si possono annidare altri cicli all’interno di quello principale:
>> m=3;n=2;
>> for i=1:m
for j=1:n
a(i,j)=(i-1)+(j-1);
end
end
>> a
a =
0 1
1 2
2 3
15.3 COMANDO WHILE
L’istruzione while esegue un’istruzione o una sequenza di istruzioni ripetutamente finché l’espressione a lei associata risulta vera. La sintassi è la
seguente:
while expression
statements
end
65
Se l’espressione valutata da while non è scalare, tutti gli elementi del risultato della valutazione dell’espressione devono essere diversi da 0,
affinché il ciclo continui ad essere eseguito.
15.4 COMANDI BREAK E RETURN
Si può uscire da un ciclo for o while in qualunque momento usando l’istruzione break.Ad esempio:
>> X = round(10 * rand(1,10) - 2);
>> k = 1;
Sum = 0;
while k <= 10
if X(1, k) == 0
break
end
Sum = Sum + X(1, k);
k = k + 1;
end
>> X
X =
1 6 -2 7 5 3 4 0 3 8
>> k
k =
8
>> Sum
Sum =
24
L’istruzione continue provoca l’esecuzione della successiva iterazione di un ciclo for o while, saltando l’esecuzione della restante parte del ciclo. SI
veda l’esempio seguente:
>> X = round(4 * rand(1,10) - 2);
>> k = 0;
66
Count = 0;
while k <= 9
k = k + 1;
if X(1, k) == 0
continue
end
Count = Count + 1;
end
>> X
X =
1 0 1 1 2 2 -1 1 -1 -2
>> Count
Count =
9
15.5 COMANDO SWITCH
L’istruzione switch esegue una diversa sequenza di istruzioni in base al valore di una variabile o di un’espressione. Le parole chiave case e
otherwise delimitano le diverse sequenze da eseguire. La sintassi è la seguente:
switch expression (scalar or string)
case value1
statements % Executes if expression is value1
case value2
statements % Executes if expression is value2
...
otherwise
statements % Executes if expression does not match any case
end
L’istruzione switch può essere seguita da un qualunque numero di blocchi case. Il blocco otherwise è opzionale e si trova sempre dopo tutti i
blocchi case e prima di end. Se l’espressione da valutare è una stringa, la comparazione con i valori gestiti dai vari blocchi case è operata con la
funzione strcmp.
67
15.6 ERRORI DI PROGRAMMAZIONE
Lo sviluppo di programmi è ovviamente soggetto ad errori da parte del programmatore. Gli errori sono generalmente di due tipi: di sintassi e di
esecuzione. Gli errori di sintassi (syntax errors) sono violazioni della sintassi del linguaggio, ad esempio omettere parentesi, digitare in modo
errato una parola chiave. Gli errori in fase di esecuzione (run-time errors) sono in genere errori nello sviluppo dell’algoritmo, ovvero l’algoritmo
non fa quello che dovrebbe fare. Ad esempio un calcolo errato, la modifica del valore di una variabile che non dovrebbe essere modificata. Gli
errori di sintassi vengono individuati e segnalati dall’interprete di Matlab, durante la fase di interpretazione del codice. Gli errori in fase di
esecuzione si manifestano di solito attraverso risultati inattesi restituiti da una funzione o attraverso anomalie nell’esecuzione di un programma
(ad esempio cicli infiniti, terminazioni anomale). Gli errori in fase di esecuzione sono pertanto più difficili da individuare e correggere. Un valido
strumento per l’individuazione e la correzone degli errori in fase di esecuzione è il debugging. Debugging è il processo attraverso il quale si
individuano e correggono errori in fase di esecuzione all’interno di un programma. L’ambiente di sviluppo Matlab fornisce uno strumento, il
debugger, che assiste il programmatore nell’individuazione e correzione degli errori in fase di esecuzione. Il debugger Matlab è integrato con
l’editor predefinito per gli M-file.
Il debugger consente di impostare punti in cui sospendere l’esecuzione di un M-file allo scopo di esaminare i valori correnti delle variabili. Tali
punti sono chiamati breakpoints. I breakpoints possono essere impostati solo in corrispondenza di linee di codice eseguibile contenute in file
salvati nella directory corrente o in una directory inclusa tra i path di Matlab. I breakpoint possono essere impostati nell’editor predefinito
cliccando a sinistra della linea di codice in corrispondenza della quale si desidera il breakpoint. E’ possibile eseguire un programma istruzione per
istruzione in modo da esaminarlo nel dettaglio. Nel menu Debug dell’editor predefinito:
Step: esegue la riga corrente di un M-file
Step In: esegue la riga corrente di un M-file e, se la linea è una chiamata ad un’altra funzione, entra all’interno della funzione chiamata.
Step Out: dopo uno Step In, esegue il resto del codice della funzione chiamata, lascia la funzione chiamata e sospende l’esecuzione del
programma.
Continue: continua l’esecuzione di un M-file fino al prossimo breakpoint o al completamento dell’esecuzione
Go until cursor: continua l’esecuzione di un M-file fino alla riga su cui è posizionato il cursore.
Si osservi che occorre salvare le modifiche apportate ad un M-file prima di iniziare il debug. Se si prova ad operare il debug di un file non salvato,
Matlab salva automaticamente il file prima di iniziare il debug.
68
15.7 EFFICIENZA
Matlab è un linguaggio non strutturato, e in quanto tale non necessita di allocare variabili, vettori o matrici prima dell'uso. Questo semplifica la
programmazione, ma è potenzialmente fonte di inefficenza computazionale.
Ad esempio, volendo generare un vettore del tipo x = (1; 2; 3; 4; … ; 105), si potrebbe digitare (si potrebbe in questo contesto significa che è
possibile, non che è una possibilità auspicabile!):
>> for i=1:10^5, x(i)=i; end
Tuttavia, in questo modo la generazione del vettore x richiede molto tempo. Il motivo di tale inefficienza risiede nel fatto che Matlab non conosce
a priori la dimensione del vettore, perciò ad ogni ciclo alloca un nuovo elemento in coda al vettore generato ai cicli precedenti. È noto che
l'operazione di allocazione ha un costo elevato in quanto coinvolge primitive del sistema operativo che devono cercare una locazione di memoria
libera ecc.
In questo caso Matlab deve eseguire 105 allocazioni…Per ovviare a questo inconveniente si può forzare Matlab ad allocare (ed inizializzare) il
vettore x prima del suo utilizzo tramite la funzione zeros (§7):
>> x=zeros(1,10^5);
>> for i=1:10^5, x(i)=i; end;
In questo modo la generazione è immediata in quanto l'allocazione avviene in un colpo solo. Un’ulteriore possibilità, certamente più “elegante” e
computazionalmente preferibile, è poi quella di semplificare ulteriormente le cose:
>> x=1:10^5;
Su un comune PC con processore dual core e 2GB di RAM le tre diverse opzioni richidedono rispettivamente circa 59, 1.7*10-3 e 5*10-4 secondi di
CPU.
Un altro aspetto molto importante è l’occupare quanta meno memoria possibile, ad esempio cancellando le variabili inutilizzate, chiudendo le
figure non necessarie, etc…
69
16 I/O
Con I/O si intendono tutte le operazioni di input e output. Esistono due principali categorie di operazioni I/O inerenti la gestione di dati
precedentemente salvati o generati all’interno di Matlab durante una sessione di lavoro: quelle a video e quelle su file.
Matlab fornisce inoltre la possibilità di eseguire operazioni I/O hardware (ad esempio acquisizione dati), ma tale tematica non può essere
affrontata durante il corso per ragioni di tempo.
16.1 I/O SU VIDEO
Per la stampa a video Matlab segue una sintassi del tipo:
>> fprintf('Il valore di P greco risulta %f \n',pi);
Il valore di P greco risulta 3.141593
Mentre se si devono immettere dati da input:
>> p=input('Immettere il valore della pressione di riferimento = ')
Immettere il valore della pressione di riferimento = 342
p =
342
Qualora l’input sia una stringa, la sintassi è: stringa=input(‘richiesta’,’s’).
16.2 I/O SU FILE
Spesso si rende necessario accedere da Matlab a dati raccolti o creati con altri programmi. Il metodo più semplice consiste nell'avere questi dati in
un file in formato ASCII, di modo che possano essere semplicemente caricati in Matlab attraverso il comando load.
Il salvataggio di dati viene eseguito specificando un formato con il comando save. Le opzioni del comando save sono riportate in Tabella 19.
70
Tabella 19 Opzioni di salvataggio dei dati tramite comando save.
opzione effetto
-ascii Salva i dati in formato 8-digit ASCII.
-ascii -tabs Salva i dati in formato 8-digit ASCII delimitato da tabulazioni
-ascii -double Salva i dati in formato 16-digit ASCII.
-ascii -double -tabs Salva i dati in formato 16-digit ASCII delimitato da tabulazioni
-mat Salva i dati in formato binario Matlab (default)
Tale procedura funziona con dati numerici organizzati in matrici. Se la struttura dati è più complessa (dati alfanumerici, campi vuoti….), per
leggere e scrivere dati una procedura sufficientemente generale è la seguente:
1. Apertura del file attraverso il commando fopen, il quale restituisce un identificatore che poi verrà utilizzato in tutte le altre operazioni
di I/O.
2. Operazioni sul file; i comandi da utilizzare sono diversi a seconda dello scopo dell’accesso al file (lettura o scrittura) e della struttura
dati. In generale:
Lettura di dati binari: comando fread.
Scrittura di dati binari: comando fwrite.
Lettura di stringhe di testo linea per linea: comandi fgets o fgetl.
Lettura di dati formattati ASCII: comando fscanf.
Scrittura di dati formattati ASCII: comando fprintf.
3. Chiusura del file: comando fclose.
I dati formattati in lettura e in scrittura devono rispettare precise regole di formattazione. La Figura 10 mostra la formattazione che può essere
applicata; essa consta di 4 campi: un flag (ad esempio il segno, Tabella 20), la lunghezza (in caratteri) del campo e la precisione (numero di cifre
dopo la virgola, Tabella 21) e il carattere di conversione (Tabella 22).
71
Figura 10 Formato dei dati da specificare in lettura e scrittura: flags, field width, precision e conversion character.
Tabella 20 Flags di formattazione.
Character Description Example
Minus sign (-) Left-justifies the converted argument in its field %-5.2d
Plus sign (+) Always prints a sign character (+ or – ) %+5.2d
Space character Inserts a space before the value % 5.2d
Zero (0) Pads with zeros rather than spaces %05.2d
Tabella 21 Field width e precision della formattazione.
Character Description Example
Field width A digit string specifying the minimum number of digits to be printed
%6f
Precision A digit string including a period (.) specifying the number of digits to be printed to the right of the decimal point
%6.2f
Tabella 22 Conversion characters utilizzati in formattazione.
Specifier Description
%c Single character
%d Decimal notation (signed)
72
%e Exponential notation (using a lowercase e as in 3.1415e+00)
%E Exponential notation (using an uppercase E as in 3.1415E+00)
%f Fixed-point notation
%g The more compact of %e or %f. Insignificant zeros do not print.
%G Same as %g, but using an uppercase E
%i Decimal notation (signed)
%o Octal notation (unsigned)
%s String of characters
%u Decimal notation (unsigned)
%x Hexadecimal notation (using lowercase letters a – f )
%X Hexadecimal notation (using uppercase letters A – F )
Si consideri il seguente esempio esplicativo:
A = pi*100*ones(1,5);
sprintf(' %f \n %.2f \n %+.2f \n %12.2f \n %012.2f \n', A)
ans =
314.159265 % Display in fixed-point notation (%f)
314.16 % Display 2 decimal digits (%.2f)
+314.16 % Display + for positive numbers (%+.2f)
314.16 % Set width to 12 characters (%12.2f)
000000314.16 % Replace leading spaces with 0 (%012.2f)
In tale esempio si è fatto ricorso a un carattere particolare, \n, il quale ha il compito di mandare a capo. Altri simboli di terminazione linea o
tabulazione (escape characters) sono riportati in Tabella 23.
73
Tabella 23 Escape characters.
Character Description
\b Backspace
\f Form feed
\n New line
\r Carriage return
\t Horizontal tab
\\ Backslash
\'' or '' Single quotation mark
%% Percent character
Infine, per scrivere su un file di testo i valori di una funzione, si consideri il prossimo esempio:
>> t=0 :pi/20 :2*pi;
>> y=2*sin(t).*cos(t);
>> funz=[t ;y] ;
>> fid=fopen('funzione.txt','w') ;
>> fprintf(fid,'Valori della funzione sin(t)*cos(t) tra 0 e 2*pi\n\n') ;
>> fprintf(fid,'%4.2f %10.6f\n',funz) ;
>> fclose(fid)
Malab dispone inoltre di alcuni comandi per leggere e scrivere file Excel. Il comando per importare dati da un file Excel è xlsread, che di default
importa i dati numerici del primo foglio di calcolo ma che può essere caratterizzato per selezionare i folgi di calcolo di interesse e il range dei dati.
Ad esempio, l’istruzione:
[dati header]=xlsread(nomefile,3);
importa i dati del terzo foglio di calcolo del file nomefile; i dati numerici sono salvati nella variabile dati, mentre i dati letterali sono salvati nella
variabile header.
La scrittura di file Excel avviene col comando xlswrite, che ha sintassi analoga a xlsread.
74
17 BIBLIOGRAFIA ESSENZIALE
MATLAB online help Version 7.6, The Math Works Inc., Natick, Massachusetts, 2008.
William J. Palm, Introduction to MATLAB 7 For Engineers, 2d Ed., McGraw-Hill, New York, 2005.
David McMahon, 2007. Matlab Demystified – a self-teaching guide, McGraw-Hill, New York, 2007.