Octave -...

30
1 Vittorio Maniezzo – Università di Bologna Octave crashcourse tutorial

Transcript of Octave -...

1Vittorio Maniezzo – Università di Bologna

Octavecrashcourse

tutorial

Ringraziamenti

Materiale preso prevalentemente da:

wikibooks

http://en.wikibooks.org/wiki/Octave_Programming_Tutorial

coursera, corso machine learning prof. Andrew Ng

https://class.coursera.org/ml-005

Vittorio Maniezzo – Università di Bologna 2

Octave

Octave è un linguaggio interpretato, ad alto livello, pensato per calcolo

numerico.

Si utilizza tramite una GUI o una interfaccia a linea di comando per

risolvere numericamente problemi lineari e non lineari.

Permette di relizzare esperimenti numerici utilizzando un linguaggio

largamente compatibile con Matlab

https://www.gnu.org/software/octave/

Per windows, scaricare da

http://mxeoctave.osuv.de/

Dalla versione 3.8 si può usare anche via GUI

Accessibile anche via cloud: http://femhub.com/octave/ e su mobile! https://www.verbosus.com/

Vittorio Maniezzo – Università di Bologna

Operatori e costanti di base+ addizione

- sottrazione

* moltiplicazione

/ divisione

^ esponenziazione

sin, cos, tan funzioni trigonometriche

asin, acos, atan funzioni trigonometriche inverse

log, log10 logaritmo naturale e base 10

exp esponenziale

abs valore assoluto

Costanti predefinite: pi, e , i (immaginario, sqrt(-1)), inf , NaN (Not

a Number), eps (2.2204e-016), …

Le stringhe sono racchiuse fra apici singoli: ’...’;Vittorio Maniezzo – Università di Bologna 4

Operatori logici

>> 1 == 2 % uguale

ans = 0 % 0 è false

>> 1 ~= 2 % diverso

ans = 1 % 1 è true

>> 1 && 0 % and

ans = 0

>> 1 || 0 % or

ans = 1

>> xor(1,0) % xor

ans = 1

% è il commento, arriva fino a fine riga

Vittorio Maniezzo – Università di Bologna 5

Vettori e matrici

Una matrice rettangolare – es. 2x3 – si inserisce così:

A = [1, 1, 2; 3, 5, 8; 13, 21, 34]

; separatore di righe,

Vettore riga: x = [1, 3, 2]

Vettore colonna: x = [1; 3; 2]

Operatori su matrici

+ addizione di matrici

- sottrazione di matrici

* moltiplicazione di matrici, vettori e scalari

' trasposizione

size(A) ritorna le dimensioni della matrice A

length(A) ritorna la dimensione più grande della matrice A

Vittorio Maniezzo – Università di Bologna 6

Matrici particolaritril(A) sottomatrice triangolare inferiore di A.

triu(A) sottomatrice triangolare superiore di A.

eye(n) matrice identità nxn.

ones(m, n) matrice mxn piena di 1. ones(n) matrice quadrata nxn piena di 1.

zeros(m, n) matrice mxn piena di 10. zeros(n) matrice quadrata nxn piena di 0.

rand(m, n) matrice mxn con numeri casuali uniformi in [0, 1). rand(n) matrice quadrata con numeri casuali uniformi in [0, 1)

randn(m, n) matrice mxn con numeri casuali normali in [0, 1).

randperm(n) vettore con una permutazione casuale di n numeri

magic(n) matrice magica nxn

Vittorio Maniezzo – Università di Bologna 7

Indicizzazione elementioctave> x = [1, 2, 3; 4, 5, 6; 7, 8, 9]

octave> x(2) % per vedere il secondo elemento di x

ans = 4

octave> x([1, 3, 4]) % mostra il primo, terzo e quarto elemento

ans = 1 7 2

octave> x([1, 3], [2, 3]) % righe 1 e 3, colonne 2 e 3

ans =

2 3

8 9

octave> x(2, :) % tutti gli elementi della seconda riga

ans = 4 5 6

octave> x(:,:) % tutti gli elementi della matrice

Vittorio Maniezzo – Università di Bologna 8

RangePossibile selezionare un intervallo di righe o colonne di una matrice. Il range è specificato con: start:step:stop

Il risultato di un comando range è un vettore di interi

octave:3> 1:3:10 ans = 1 4 7 10

Qui 1 è lo start, 4 è start + step, 7 è start + (2 * step), 10 è ≤ stop.

Con step = 1 si può omettere il terzo parametro

octave:4> 1:10 ans = 1 2 3 4 5 6 7 8 9 10.

I range sono molto usati per indicizzare vettori o matrici. Es., per selezionare la sottomatrice superiore sinistra di A:

octave:4> A(1:2, 1:2) ans = 1 2 4 5

la keyword end indica l'ultimo elemento di una riga o di una colonna. Per es., ultima colonna di una matrice:

octave:5> A(:,end) ans = 3 6 9

Vittorio Maniezzo – Università di Bologna 9

Operazioni elemento per elementoA .* B prende ogni elemento di A e lo moltiplica per il corrispondente elemento di B (cfr. A*B).

In generale il punto ’.’ prima di una operazione la fa applicare elemento per elemento (element wise). Le dimensioni delle matrici devono permetterlo.

Con un solo operando (es. in A.^2) non ci sono mai problemi di dimensioni.

Dato un vettore colonna v=[1; 2; 3]:

• 1 ./ v è il reciproco element wise di v [1/1, 1/2, 1/3]. Uguale per le matrici, 1./A è l'inversa element wise di A.

• Possibili log(v), logaritmo element wise di v, exp(v), abs(v) …

• -v è il simmetrico di v, uguale a -1*v

• v+1 aggiunge 1 element wise a tutti gli elementi di v

Vittorio Maniezzo – Università di Bologna 10

Ricerche e confronti

A = [1 2; 3 4]

max(A) % max column wise. ans = [3 4]

A<3 minore element wise. Si ottiene la matrice booleana [1 1; 0 0].

[r,c] = find(A >= 2) trova tutti gli elementi di A che sono >=7 e restituisce in r i loro indici di riga e in c gli indici di colonna:

r = 2 1 2

c = 1 2 2

Vittorio Maniezzo – Università di Bologna 11

2D plot

plot(y)

l'argomento è inteso come vettore delle coordinate y. Le x sono per default gli indici degli elementi, partendo da 1.

plot(x, y)

• x vettore y matrice: il vettore è disegnato rispetto alle colone (righe) della matrice.

• x matrice y vettore: le colonne (righe) della matrice sono disegnate rispetto al vettore.

• x e y vettori: gli elementi di Y sono disegnati rispetto a quelli di X.

• x e y matrici: le colonne di Y sono disegnate rispetto a quelle di X. Le due matrici devono avere lo stesso numero di righe e di colonne.

linspace(b, l, n): un vettore con n numeri equispaziati fra b e l. Usato soprattutto per produrre vettori X in plot(X,y).

Vittorio Maniezzo – Università di Bologna 12

2D plot, esempio

x = linspace(0, 2*pi, 100);

y = sin(x);

plot(x, y);

Vittorio Maniezzo – Università di Bologna 13

2D plot, formattazioneplot (x, [y,] FMT, …)

possibile inserire un numero qualunque delle seguenti opzioni

:

'N' interpretato come colore se N è un intero nel range 1 - 6.

'C' interpretato come colore se C è "r", "g", "b", "m", "c", o "w", (red, green, blue, magenta, cyan, white).

";title;" è l'etichetta (il nome) della opzione.

'+' '*' 'o' 'x' stile del punto se usati assieme agli stili points o linespoints.

E' possibile usare insiemi di coppie attributo-valore per ogni linea di comando plot.

Vittorio Maniezzo – Università di Bologna 14

‘-' lines plot style (default). '.' dots plot style.

'@' points plot style. '-@' linespoints plot style.

'^' impulses plot style. 'L' steps plot style.

2D plot, esempio

x = linspace(0, 2*pi, 100);

y = sin(x);

y2 = cos(x);

plot(x, y, '+1;sin(x);', "markersize", 10, x, y2, ";cos(x);", "markersize", 5, "marker", '*');

Vittorio Maniezzo – Università di Bologna 15

2D plot - funzioni

fplot ("[cos(x), sin(x)]", [0, 2*pi])

La funzione può essere una funzioneinline, o una stringa con il/i nome/i dellefunzioni da plottare.

I limiti del plot sono nel formato [xlo, xhi] oppure [xlo, xhi, ylo, yhi].

Se chiamata [x, y] = fplot (…) sonoritornati i dati del 2D plot, che possonopoi essere plottati con plot(x, y).

Vittorio Maniezzo – Università di Bologna 16

2D plot - grafici

Istogramma (10000 numeridistribuiti normali), 30 bins:

hist (randn (10000, 1), 30);

Vittorio Maniezzo – Università di Bologna 17

Diagramma a barre (5 serie di 10 numeri l’una):

bar (randn (10, 5))

3D plot - generalemesh produce disegni di superfici tipo mesh (tipo reti).

meshgrid crea matrici di coordinate X e Y su cui plottare i valori di Z.

tx = ty = linspace (-8, 8, 41);

[xx, yy] = meshgrid (tx, ty);

r = sqrt (xx .^ 2 + yy .^ 2) + eps;

tz = sin (r) ./ r;

mesh (tx, ty, tz);

Guardare il manuale.

C'è molto da dire.

Vittorio Maniezzo – Università di Bologna 18

3D plot - ezmeshf = @(x,y) sqrt (abs (x .* y)) ./ (1 + x.^2 + y.^2);

ezmeshc (f, [-3, 3]);

Vittorio Maniezzo – Università di Bologna 19

• f deve essere una funzioneinline, o un handle a unafunzione con due argomenti.

• Il dominio deve essere o un vettore di due elementi, valorimin e max sia di x che di y, o un vettore di 4 elementi intesicome [xmin xmax ymin ymax].

3D plot – ezsurf, ezsurfc

ezsurf (f, [-3, 3]);

Plotta la superficie con mesh

Vittorio Maniezzo – Università di Bologna 20

ezsurfc (f, [-3, 3]);

Plotta la superficie con mesh e contour lines (sotto)

3D plot (2D) – Contour lines

Vittorio Maniezzo – Università di Bologna 21

ezcontour (f, [-3, 3]);

ezcontourf (f, [-3, 3]);

Output: dispdisp: display del valore di qualunque tipo di variabile (scalare, vettore, matrice, stringa, ecc.), uguale a scrivere il nome della variabile tranne che non scrive il nome stesso.

disp mostra anche il risultato di un calcolo senza l' "ans =" che normalmente lo precede.

L'output specifico di disp dipende anche dal comando format.

octave:5> format long

octave:6> disp(log(10))

2.30258509299405

I valori possono essere scritti a schermo, salvati in una stringa o su file se si usa fdisp.

octave> s = disp(log(10))

s = 2.30258509299405

Vittorio Maniezzo – Università di Bologna 22

Output: printf, sprintf, fprintf

Derivate dal c

La funzione printf è più potente che disp, permette anche lei di scrivere su schermo strighe o file ma in modo formattato

printf scrive sullo schermo.

sprintf ritorna il valore in una stringa

fprintf scrive su un file.

Sintassi:

printf(format, value, ...)

sprintf(format, value, ...)

fprintf(fid, format, value, ...)

Vittorio Maniezzo – Università di Bologna 23

Output: printf per matriciPassando a printf un vettore o una matrice, ne sono stampati tutti i valori. Se c'è una sola opzione di formato, viene usata per ogni cella della matrice.

octave> A = [1, 2, 3; 4, 5, 6; 7, 8, 9];

octave> printf("%i\n", A)

Se ci sono più opzioni di formato, le usa ciclicamente.

octave> printf("[%i, %.1f, %.2e]\n", A)

[1, 4.0, 7.00e+00]

[2, 5.0, 8.00e+00]

[3, 6.0, 9.00e+00]

Le celle della matrice sono sempre lette per colonne (column-major

order).

Vittorio Maniezzo – Università di Bologna 24

Controllo: forIl ciclo for ripete un blocco di codice su ogni elemento di una lista di valori noti.

for variable = vector... end

Dove ... rappresenta il blocco di codice eseguito per ogni elemento.

Es., calcolare la media di una lista di valori

octave:1> x = [1.2, 6.3, 7.8, 3.6]; octave:2> sum = 0; octave:3> for entry = x, octave:4> sum = sum + entry; octave:5> end; octave:6> x_mean = sum / length(x)

Linea 3: Per ogni valore in x, lo assegna a entry.Linea 4: Incrementa sum della quantità entry.Linea 5: Termina il ciclo for quando non ci sono più elementi in x.

Vittorio Maniezzo – Università di Bologna 25

Controllo: while

Il ciclo while esegue un blocco di codice più volte, finendo sulla base di una condizione logica.

while condition

...

endwhile

Esempio:

x = 1.0;

while x < 1000

disp(x); x = x*2;

endwhile

moltiplica x per 2 finché non ottiene un valore maggiore di 1000.

Vittorio Maniezzo – Università di Bologna 26

Controllo: if

La forma generale dell’istruzione if è:

if condition1

...

elseif condition2

...

else

...

endif

si possono inserire tutti gli elseif che si vuole.

L’ultimo blocco di istruzioni, dopo l’else, viene eseguito solo se tutte le condizioni precedenti sono false.

Sia gli elseif che l’else sono opzionali.

Vittorio Maniezzo – Università di Bologna 27

FunzioniSintassi dichiarazione di funzioni:

function [return value 1, return value 2, ...] = name( [arg1, arg2, ...] )

body

endfunction

Esempio, funzione fattoriale:

function result = factorial( n )

if( n == 0 )

result = 1;

return;

else

result = prod( 1:n );

endif

endfunctionVittorio Maniezzo – Università di Bologna 28

Funzioni ad argomenti multipliEsempio, la funzione maxmin ritorna i valori max e min di due interi:

function [max,min] = maxmin( a, b )if(a >= b )

max = a; min = b; return;else

max = b; min = a; return;endif

endfunction

La chiamata è:

[big,small] = maxmin(7,10);

La var 'big' varrà 10 e la variabile 'small' varrà 7.

Se si usano meno di due variabili per memorizzare i risultati, verranno ritornati meno valori. Ad es.

a = maxmin(13,5)

memorizza 13 in 'a' e scarta il 5.Vittorio Maniezzo – Università di Bologna 29

File IOIl comando ‘pwd’ (copiato da Unix, significa ‘print working

directory’) mostra la directory di lavoro corrente.

Il comando ’cd’ permette di cambiare directory.

Il camando ’ls’ elenca i file della directory corrente

Il commando ‘load’ permette di caricare file di dati in Octave. Es., ’load mayData.dat’

Il commando ‘save’ permette di salvare i dati su file. Con l’opzione –ascii li scrive in formato testo.

Es.’save hello.txt vecdata –ascii’.

Il vettore può essere ripristinato con ’load hello.txt’Vittorio Maniezzo – Università di Bologna 30