DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOIGNEGNERIA
INFORMATICA BIngegneria Elettrica
Script in Matlab
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Gli script
• Uno script è un file di testo contenente una sequenza di comandi MATLAB (è un “programma”)
• Lo script viene salvato con estensione .m
• I comandi contenuti in uno script sono eseguiti in modo sequenziale, come se fossero scritti nella finestra dei comandi
• Uno script può essere ri-eseguito
essere facilmente modificato
essere distribuito e condiviso con altre persone
2
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Eseguire uno script
• Per eseguire il file Ci si sposta nella cartella che contiene lo script con il comando cd
Si digita il suo nome (senza .m)
• I risultati appaiono nella finestra dei comandi (se non usiamo il ; )
• Uno script opera nello spazio di lavoro (o workspace) principale della linea di comando Può accedere alle variabili dello spazio di lavoro
Può aggiungere nuove variabili allo spazio di lavoro
• Il comando clear permette di cancellare il contenuto dello spazio di lavoro
3
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Creare uno script
• Può essere creato utilizzando un qualsiasi editor di testo
• Matlab include un editor dove creare o modificare script Si può aprire l’editor utilizzando il comando edit <nomefile>
• Ricordarsi di salvare il file come “solo testo” e di dare l’estensione .m
• Il file di script deve essere presente nella directory corrente o comunque in uno dei percorsi standard di Matlab Utilizzando il comando cd <percorso> ci si può spostare tra le
cartelle
Il comando pwd restituisce il percorso della cartella corrente
4
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Creare uno script
• Il nome del file deve essere lungo al massimo 31 caratteri, deve cominciare con una lettera e può contenere cifre e il carattere _
• Si consiglia di specificare un nome univoco. Quindi diverso da Nome di un altro file o variabile
Nome di un comando, variabile o funzione Matlab
• Per verificare un nome è già utilizzato si può utilizzare il comando exist nome (restituisce 0, cioè falso, se il simbolo nome non è in uso, un altro valore altrimenti) Sintassi alternativa: exist('nome')
5
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Struttura di uno script
È consigliabile organizzare uno script nel seguente modo:
• Commento di intestazione Specifica cosa fa lo script
I commenti iniziano con il carattere %
• Sezione di input Contiene i comandi per l’acquisizione dei dati da tastiera o da file
• Sezione di elaborazione Contiene i comandi che eseguono il compito dello script
• Sezione di output Mostrano i risultati a video (testo e/o grafici) o li salvano su file
6
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Acquisizione di dati da tastiera
• La funzione input permette di acquisire dati da tastiera
valore=input('inserisci un valore: ');
• Matlab stampa a video la stringa ‘inserisci un valore:’ ed aspetta i dati che possono essere: Un valore scalare
Un array o una matrice racchiuso tra [], i cui dati sono separati da , e ;
Una stringa racchiusa tra ''
• Il dato inserito viene memorizzato nella variabile valore
• Per acquisire una stringa si può utilizzare anche il comando
valore=input('inserisci un valore ', 's');
In tal caso non c’è bisogno di racchiudere la stringa tra ' '
7
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Stampa a video dei risultati
• Il risultato di un’operazione viene mostrato immediatamente se non viene specificato il carattere ;
• La funzione disp mostra un array a video
disp(pi)
• La funzione num2str può essere utilizzata per fare il cast da numero a stringa
str=['il valore di pi è ' num2str(pi)];
disp(str);
OUTPUT: il valore di pi è 3.1416
8
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Stampa a video dei risultati
• Si può utilizzare anche la funzione fprintf
fprintf('il valore di pi è %f\n', pi);
• Stringhe di formato: %d (formato intero)
%e (formato esponenziale)
%f (formato in virgola mobile)
%g (il più corto tra il formato esponenziale e quello in virgola mobile
• disp è in grado di stampare anche numeri complessi, mentre fprintf ne stampa solo la parte reale
9
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Lettura e scrittura di file
• Matlab è in grado di gestire File di testo (ascii)
File binari (hanno estensione .mat)
• Comandi per leggere e scrivere dati in un file load
save
10
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Salvataggio su file
• save <nomefile>
salva nel file nomefile.mat tutte le variabili contenute nello spazio di lavoro
• save <nomefile> array1 array2
salva nel file solo le variabili array1 ed array2
• I file .mat contengono
Il nome, il tipo, la dimensione ed il valore di ciascuna variabile nello spazio di lavoro
Possono essere trasferiti da un computer ad un altro, anche con sistemi operativi diversi ma possono essere aperti solo da Matlab
11
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Salvataggio su file
• È possibile anche salvare i dati in formato ascii (file di testo)
• Il comando
x= [3, 5.5; 4,5]
save –ascii nomefile.dat x;
Produce un file nomefile.dat con il seguente contenuto:
3.0000000e+00 5.5000000e+00
4.0000000e+00 5.0000000e+00
• Nota: si può utilizzare qualsiasi estensione per i file di testo ma è consigliato evitare di utilizzare l’estensione .mat
12
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Lettura da file
• load <nomefile.mat>
carica nello spazio di lavoro tutte le variabili contenute nel file binario .mat
• load <nomefile.mat> x y
carica nello spazio di lavoro solo le variabili specificate
• load <nomefile.dat>
crea una variabile nomefile che conterrà in una matrice tutti i dati letti dal file di testo Il testo nel file deve contenere i dati separati da virgole e spazi ed a-
capo ed deve essere formattato come un’unica matrice
13
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Lettura da file
• a=xlsread('nomefile')
importa il contenuto del file MS Excel nomefile.xls nella matrice a
• Alcuni fogli di calcolo utilizzano il formato .wk1
a=wk1read('nomefile')
14
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Tipo di dato logico
• Il tipo di dato logico è composto da solo due valori true (rappresentato con un numero diverso da 0)
false (rappresentato con il valore 0)
• Un valore logico è restituito da Operatori relazionali
Operatori logici
Funzioni e comandi (come per esempio exist)
15
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Operatori relazionali
• Gli operatori relazionali possono operare su tipi numerici e stringhe
• Forma generale: a OP b Dove a e b possono essere espressioni aritmetiche, variabili o costanti
(stringhe e numeri)
• Operatori disponibili: == ~= > >= < <=
• È possibile confrontare Due valori di egual dimensione (dimensione dell’array)
• Il confronto è eseguito tra valori in posizione equivalente
• Il risultato è un array di ugual dimensione
Un valore scalare ed un array di qualsiasi dimensione
• Il valore scalare è confrontato con ciascuna posizione dell’array
• Il risultato è un array di dimensione uguale all’array ricevuto come parametro
• Il confronto tra i singoli caratteri di una stringa è eseguito in base alla codifica dei caratteri
16
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Operatori relazionali
• Attenzione a non confondere i seguenti operatori == (confronto)
= (assegnamento)
• La precisione finita della rappresentazione in virgola mobile può farci commettere degli errori sin(0)==0 restituisce 1
sin(pi)==0 restituisce 0
• I confronti di uguaglianza/diseguaglianza tra numeri in virgola mobile vanno eseguiti nel seguente modo
abs(sin(pi))<=eps
17
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Operatori relazionali
• Esempi:
18
Espressione Risultato
3<4 1
'a'>'b' 0
[1 0; -2 1]<0 [0 0; 1 0]
[1 0; -2 1]>[2 -1; 0 0] [0 1; 0 1]
'pippo'=='pluto' [1 0 0 0 1]
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Operatori logici
• Gli operatori logici sono simili a quelli del C e funzionano solocon operandi scalari && (AND)
|| (OR)
~ (NOT)
xor(a,b)
19
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Operatori logici
• Nell’esecuzione dell’operazione logica viene valutato prima l’operando a sinistra Se è possibile stabilire già il risultato dell’operazione, l’operando a
destra non viene valutato
Altrimenti viene valutato anche l’operando a destra
• Questo meccanismo funziona allo stesso modo anche il C
• Esempio: a/b>10 Se b è uguale a 0 la divisione non va fatta
(b~=0)&&(a/b>10) è la soluzione corretta: se b è uguale a 0 restituisce 0 senza valutare la seconda espressione
20
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Operatori logici
• Gli operatori & e | operano sui singoli elementi della matrice
• È possibile applicare gli operatori & e | su
Due valori di egual dimensione (dimensione dell’array)
• L’operazione è eseguito tra valori in posizione equivalente
• Il risultato è un array di ugual dimensione
Un valore scalare ed un array di qualsiasi dimensione
• L’operazione è eseguita su ciascuna posizione dell’array ed utilizzando lo scalare come secondo parametro
• Il risultato è un array di dimensione uguale all’array ricevuto come parametro
21
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Accesso ad un array mediante un array logico
• È possibile eseguire un accesso contemporaneo ad un array mediante un array logico di egual dimensione
• Esempio: x = [3 7 5 1 9]
y = [true false true true false]
z = x(y);
• Risultato: y = [3 5 1]
22
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Accesso ad un array mediante un array logico
• La funzione find restituisce gli indici degli elementi diversi da 0 ( o false)
• Esempio: x = [0 0 1; 1 0 0]
y = find(x)
[r c] = find(x)
• Risultato: y = [2; 5]
r = [2; 1]
c = [1; 3]
23
y contiene l’indice della matrice linearizzata
R e c contengono rispettivamente gli indici di riga e colonna
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Operazioni vettorizzate
• È possibile combinare operazioni aritmetiche, logiche e relazionali ed eseguirle direttamente su array Tale operazione semplifica molto l’algoritmo dello script
• Esempio: contare quanti studenti hanno superato un esame con un voto inferiore a 25
voto = [ 12, 15, 8, 29, 23, 24, 27 ]
conta_mediocri = sum(voto>=18 & voto<25)
• Esempio: assegnare un punto extra agli studenti che hanno ottenuto almeno 27
voto = [ 12, 15, 8, 29, 23, 24, 27 ]
voto(voto>=27) = voto(voto>=27) + 1
24
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Ordinamento tra gli operatori
• Le operazioni vengono valutate nel seguente ordine Operatori aritmetici di moltiplicazione e divisione ed elevamento a
potenza
Operatori aritmetici di somma e sottrazione
Operatori relazionali
Operatore logico NOT
Operatori logici AND (&& e &)
Operatori logici OR (|| e|) e XOR
• A parità di livello, la priorità va da sinistra verso destra
25
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Funzioni logiche
• Matlab fornisce le seguenti funzioni logiche
• all ed any funzionano come min e max: operano su vettori restituendo un singolo valore, o su matrici analizzando singolarmente le colonne e restituendo un vettore riga
26
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Strutture di controllo
• Matlab offre le classiche strutture di controllo Per la selezione (if e switch)
Per l’iterazione (while e for)
• Costrutto if:if a==b
c=1;
elseif a<b
c=2;
else
c=3;
end
• Le clausole elseif ed else sono facoltative
27
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Strutture di controllo
• Costrutto switch:switch(x)
case -1
display('meno uno');
case 0
display('zero');
case 1,2
display('uno o due');
otherwise
display('altro valore');
end
28
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA
Strutture di controllo
• Costrutto for:for n=2:1:10
x(n)=2*x(n-1);
end
• A differenza del C, il costrutto for forza alla specifica di un intervallo di valori del parametro di controllo su cui interare
• Costrutto while:n=1;
while n^2 < 100
disp(n);
n=n+1;
end
29