Introduzione a GNU Octave
Ing. Andrea Spadaccini [email protected]
Dipartimento di Ingegneria Informatica e delle Telecomunicazioni
Universita di Catania
21 Aprile 2009
Sommario
Introduzione
Tipi di dato
Controllo di usso
Funzioni
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Introduzione (I)
Cos'e GNU Octave?
E un linguaggio di alto livello destinato principalmente ad
elaborazioni numeriche
E compatibile a livello di sintassi conMatlab
TM
Perche preferire GNU Octave aMatlab
TM
?
GNU Octave e softwarelibero!sono garantite 4 liberta fondamentali:
1Liberta di usare il programma per qualsiasi scopo
2Liberta di studiare il programma e modicarlo
3Liberta di copiare il programma
4Liberta di migliorare il programma e redistribuirlo
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Convenzioni
Input/Output dell'interprete di Octave
>>input inserito
output fornito da Octave
Esempio
>>1 + 1
ans = 2
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Tipi di dato numerici
Parte I
Tipi di dato
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Tipi di dato numerici
Tipi di dato numerici (I)
Scalari
Matrici (e vettori)
Scalari
>>42
>>4.2e1
>>30 + 2i
Vettori
>>[1 2 3 4 10]
ans =
1 2 3 4 10
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Tipi di dato numerici
Tipi di dato numerici (II)
Matrici
>>[1 2; 3 4]
ans =
1 2
3 4
Costanti
>>e
ans = 2.7183
>>pi
ans = 3.1416
>>i
ans = 0 + 1i
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Tipi di dato numerici
Funzioni che generano matrici (I)
Matrice identita
>>eye(2)
ans =
1 0
0 1
Matrici composte da soli 1 o 0
>>ones(2)
ans =
1 1
1 1
>>zeros(2, 3)
ans =
0 0 0
0 0 0
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Tipi di dato numerici
Funzioni che generano matrici (II)
Numeri pseudo-casuali
>>rand()
ans = 0.021416
>>rand(1, 3)
ans =
0.38035 0.29420 0.69839
>>rand(2)
ans =
0.40080 0.60590
0.26180 0.13349
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Tipi di dato numerici
Variabili
Tipizzazione
Octave e un linguaggio tipizzato:
fortemente: la conversione tra tipi va fatta in maniera esplicita
dinamicamente: ciascuna variabile puo contenere diversi tipi di
dato (non contemporaneamente, ovviamente)
Assegnazione di un valore ad una variabile
>>x = 1
x = 1
>>x = rand(1, 4)
x =
0.59510 0.52206 0.72653 0.88393
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Tipi di dato numerici
Operatori aritmetici
Tabella dei principali operatori aritmetici:
x + ysomma
x - ysottrazione
x * ymoltiplicazione (sexedysono matrici,
moltiplicazione tra matrici)
x .* ymoltiplicazione elemento per elemento
x / ydivisione (sexedysono matrici,
e equivalente ainv(y') * x')
x ./ ydivisione elemento per elemento
x ^ yelevamento a potenza
x .^ yelevamento a potenza elemento per elemento
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Tipi di dato numerici
Esempi su operatori aritmetici (I)
Moltiplicazioni
>>A = [2 3 4; 5 6 7; 8 9 10];
>>B = [2; 3; 4];
>>A * B
ans =
29
56
83
>>A * 2
ans =
4 6 8
10 12 14
16 18 20
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Tipi di dato numerici
Esempi su operatori aritmetici (II)
Divisioni
>>A ./ 2
ans =
1.000 1.500 2.000
2.500 3.000 3.500
4.000 4.500 5.000
>>A / B
ans =
1.0000
1.93103
2.86207
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Tipi di dato numerici
Esempi su operatori aritmetici (III)
Potenze
>>A .^ 2
ans =
4 9 16
25 36 49
64 81 100
>>A ^ 2
ans =
51 60 69
96 114 132
141 168 195
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Tipi di dato numerici
Intervalli
Un intervallo e un vettore composto da numeri, denito tramite la
seguente notazione:inizio:intervallo:fine
Esempi
>>1:4
ans =
1 2 3 4
>>1:4:40
ans =
1 5 9 13 17 21 25 29 33 37
>>1:0.1:2
ans =
1.0000 1.1000 1.2000 1.3000 1.4000 1.5000 1.6000 1.7000
1.8000 1.9000 2.0000
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Tipi di dato numerici
Indicizzazione di matrici
L'indicizzazione avviene tramite l'operatore (), specicando due indici:
M(idx1, idx2).
Ciascuno dei due indici puo essere:
Uno scalare
Un vettore(quindi anche un intervallo)
Il carattere:, che indica di selezionare tutta la riga (o colonna) in
oggetto
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Tipi di dato numerici
Esempi di indicizzazione (I)
>>a = [1 2 3; 4 5 6; 7 8 9];
Selezione dell'elemento (i;j)
>>a(2,1)
ans = 4
Selezione di una colonna
>>a(:,2)
ans =
2
5
8
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Tipi di dato numerici
Esempi di indicizzazione (II)
>>a = [1 2 3; 4 5 6; 7 8 9];
Selezione di una riga
>>a(2,:)
ans =
4 5 6
Selezione di parte di una riga
>>a(2,1:2)
ans =
4 5
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Tipi di dato numerici
Stringhe
Una stringa e una sequenza di caratteri racchiusa tra apici.
>>s = 'ciao'
Concatenazione
>>strcat('c', 'iao', ' ', 'mondo')
ans = ciao mondo
Confronto
Si usa la funzionestrcmp, che pero funzionaal contrariorispetto
all'equivalente C, ovvero torna 1 se le stringhe sono uguali, 0 altrimenti.
>>strcmp(s, 'ciao')
ans = 1
>>s == 'ciao'
ans =
1 1 1 1
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Tipi di dato numerici
Conversione tra tipi numerici e stringhe
Tipo numerico!stringa:
num2str
int2str
mat2str
Stringa!tipo numerico:
str2num
Output formattato su stringa:
sprintf
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Tipi di dato numerici
Stampa di una stringa dal prompt
Funzionedisp(stringa)
Esempio
disp('ciao')stampa la stringaciao. (com'era prevedibile)
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Operatori di confronto
Parte II
Controllo di usso
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Operatori di confronto
Operatori di confronto
Gli operatori di confronto lavorano elemento per elemento.
x < y
x <= y
x == y
x >= y
x > y
x= y
(oppurex != y, ma non funziona inMatlab
TM
)
x & y
x | y
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Operatori di confronto
Esempi di confronto (I)
Tra scalari
>>1 > 2
ans = 0
>>1 & 0
ans = 0
>>1 & 1
ans = 1
>>1 | 1
ans = 1
Tra vettori (o matrici) e scalari
>>[0 1 2 3 4 5 6] < 3
ans =
1 1 1 0 0 0 0
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Operatori di confronto
Esempi di confronto (II)
Tra vettori omogenei (o matrici omogenee)
>>[1 3 4 5] <= [4 1 4 4]
ans =
1 0 1 0
>>[1 3; 4 5] <= [4 1; 4 4]
ans =
1 0
1 0
In generale, gli operatori di confronto si utilizzano per:
Controllo di usso
Ricerca di elementi in matrici o vettori che soddisno determinate
condizioni
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Operatori di confronto
Costruttoif
Sintassi
ifcondizione
istruzioni
elseifcondizione-2
altre istruzioni
...
elsecondizione-n
ulteriori istruzioni
end
Note
I blocchielseifedelsesono opzionali
Possono esserci diversi blocchielseif, ma un solo bloccoelse
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Operatori di confronto
Esempio di costruttoif
Codice dell'esempio
a = 1;
if a < 1
disp('< 1')
elseif a > 1
disp('> 1')
else
disp('= 1')
end
Risultato dell'esecuzione?
La stampa della stringa '= 1'.
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Operatori di confronto
Costruttofor
Sintassi
foridenticatore=espressione
istruzioni
end
Note
L'identicatoreindica una variabile
L'espressionepuo essere un dato di qualsiasi tipo (generalmente e
un intervallo)
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Operatori di confronto
Esempi di costruttofor(I)
Codice dell'esempio
for i = 0 : 10 : 50
disp(i)
end
Risultato dell'esecuzione?
0
10
20
30
40
50
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Operatori di confronto
Esempi di costruttofor(II)
Codice dell'esempio
A = (1:10) .^ 2;
for i = 1 :length(A)
A(i) = sqrt(A(i));
end
Risultato dell'esecuzione?
A = [1 2 3 4 5 6 7 8 9 10]
Attenzione
Il codice e sintatticamente corretto, ed esegue le operazioni che ci
aspettiamo, ma quando e possibile e meglio evitare di eettuare cicli,
vettorializzandoil codice.
In questo caso,A = sqrt(A);sortisce lo stesso eetto.
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Operatori di confronto
Costruttowhile
Sintassi
whilecondizione
istruzioni
end
Note
Lacondizionegeneralmente eettua un confronto su una variabile
che viene modicata durante il blocco diistruzioni, in modo da
potere uscire, prima o poi, dal ciclo
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Operatori di confronto
Esempio di costruttowhile
Codice dell'esempio
x = 10;
while x > 0
x = x - 1;
disp(x)
end
Risultato dell'esecuzione?
Stampa dei numeri da 9 ad 1
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Denizione di funzioni
Parte III
Funzioni
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Denizione di funzioni
Denizione di funzioni
Quando si scrivono programmi non banali, e fondamentale suddividerli in
unita logiche (funzioni), ciascuna con uno scopo ben preciso, in modo
che siano facilmente vericabili ed eventualmente riutilizzabili.
Sintassi
function [valori-di-ritorno] = funzione(parametri)
corpo della funzione
end
Valori di ritorno
Diversamente da linguaggi come il C, in Octave e possibile creare
funzioni che abbiano piu di un valore di ritorno
Ciascun valore di ritorno va creato all'interno della funzione, e non
va ritornato esplicitamente
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Denizione di funzioni
Esempio: somma degli elementi di un vettore
Corpo della funzione
function s = somma(vettore)
s = 0;
for i = 1 : length(vettore)
s = s + vettore(i);
end
end
Esempi di utilizzo
>>somma([1 2 3 4 5 6])
ans = 21
>>3 * somma([1 2 3])
ans = 18
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Denizione di funzioni
Esempio: Ricerca minimo, massimo e media di un vettore
Attenzione
La funzione che verra mostrata non e scritta bene, ed ha uno scopo
puramente didattico. Ecco un elenco di difetti della funzione:
Duplica funzionalita gia presenti nella libreria standard
Esegue troppe operazioni, non ha uno scopo univoco
Non esegue controlli sui dati in input
Non e vettorializzata
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Denizione di funzioni
Codice della funzione minmaxavg
function [minimo massimo media] = minmaxavg(vettore)
somma = massimo = 0;
minimo = Inf;
for i = 1 : length(vettore)
if vettore(i) > massimo
massimo = vettore(i);
end
if vettore(i) < minimo
minimo = vettore(i);
end
somma = somma + vettore(i);
end
media = somma / length(vettore);
end
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Denizione di funzioni
Utilizzo della funzione minmaxavg
>>minmaxavg(1:10)
ans = 1
>>m = minmaxavg(1:10)
m = 1
>>[m mx] = minmaxavg(1:10)
m = 1
mx = 10
>>[m mx av] = minmaxavg(1:10)
m = 1
mx = 10
av = 5.5000
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Denizione di funzioni
Aiuto!
La funzionehelp
La funzionehelp, seguita da un comando, fornisce tutte le
informazioni sul comando in oggetto.
Utile per vericare parametri e valori di ritorno delle funzioni
La funzionedoc
La funzionedoc, seguita da una stringa, cerca nel manuale di
Octave una tematica ane e ne mostra l'help
Generalmente il risultato e piu approfondito dihelp, e mostra anche
argomenti correlati
Per confrontare i due, digitare ad esempiohelp helpedoc help.
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Denizione di funzioni
Massimo, minimo e media di un vettore
Le funzionimaxemin
Trovano il valore massimo (o minimo) di un vettore e lo restituiscono
Se chiamate con due valori di ritorno, restituiscono anche l'indice del
massimo (minimo)
La funzionemean
Calcola la media dei valori di un vettore
Ha un parametro opzionale che consente di specicare il tipo di
media (aritmetica, geometrica, armonica)
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Denizione di funzioni
Altre funzioni che operano su vettori o matrici
rows(A): numero di righe di A
columns(A): numero di colonne di A
size(A): dimensioni di A (valori di ritorno multipli)
sum(A): A vettore!somma degli elementi; A matrice!somma
per colonne; somma di tutti gli elementi di una matrice:
sum(sum(A))
sort(A): ordina gli elementi di un vettore in ordine crescente
det(A): determinante di una matrice
inverse(A): inversa di una matrice quadrata
rank(A): rango di una matrice
eig(A): autovettori (ed autovalori) di una matrice
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Riferimenti
Sito uciale di GNU Octave
http://www.octave.org
Documentazione
John W. Eaton et al.GNU Octave Manual-
http://www.gnu.org/software/octave/doc/interpreter/
Ing. Andrea Spadaccini
Introduzione a GNU Octave
Licenza
Licenza Creative Commons
Questo lavoro e rilasciato sotto licenza Creative Commons
Attribution-Share Alike 2.5 Italy
(http://creativecommons.org/licenses/by-sa/2.5/it/)
Signicato della licenza
La presentazione e liberamente scaricabile e redistribuibile per
qualsiasi ne
E necessario citare l'autore
E necessario redistribuire secondo gli stessi termini eventuali lavori
derivati da questa presentazione
Ing. Andrea Spadaccini
Introduzione a GNU Octave