Comincia qui la seconda lezione di Octave
Script-file
Normalmente è possibile navigare nella cronologia dei comandi effettuati premendo il tasto su o giu, risulta però molto comodo salvare su dei file tutte le istruzioni date, con tanto di commenti, in modo da poter ritirare fuori, a distanza di giorni, mesi o anni, il proprio lavoro.
I file che introduciamo ora si chiamano script-file, per saranno file con estensione .m, e il loro contenuto è una sequenza di istruzioni, scritte come se fossero digitate direttamente in Octave.
Per eseguirli, da Octave, se ci si trova nella stessa cartella dello script-file, basta digitare il nome del file (senza l’estensione).
Notate che normalmente si deve ad uno script-file un nome diverso dalle funzioni già presenti in Octave, altrimenti Octave utilizzerà la funzione al posto del vostro script-file.
Per controllare se un nome esiste già potete dare il comando
exist('nome_file')
Se il comando esiste vi verrà riportato un numero diverso da 0.
Il seguente script-file calcola, ad esempio, la somma dei primi n numeri:
somma.m
%Questo script-file (somma.m) calcola la somma da 1 a n.
n=input('inserisci un numero intero positivo')
v=[1:n];
s=sum(v);
disp('somma= ')
disp(s)
I commenti sono normalmente preceduti da %, oppure, per chi conosce già il C o un minimo di bash, #. Tuttavia in Matlab non è possibile, quindi in questi tutorial, userò la sintassi compatibile con Matlab, appunto per mostrare quanto siano intercambiabili (almeno fino ad un certo livello) i due programmi. Come potete infatti notare, nella documentazione di Octave i commenti vengono dati antecedendo il simbolo ‘#’, mentre nella documentazione di Matlab si usa il simbolo ‘%’ che può appunto venir anche usato in Octave.
Function
Le function sono, normalmente, degli “script-file” che accettano dei parametri e danno un risultato. Normalmente vengono richiamate dagli script-file, inoltre la loro sintassi è leggermente diversa, in modo da essere facilmente interpretati da altri file.
L’intestazione deve avere la struttura
Il file deve avere il nome “nomefunction.m” e un file può contenere una e una sola function.
Per interrompere la function è consigliato usare la parola return, e i valori output1,output2,…outputn devono essere stati tutti assegnati.
Una function viene richiamata semplicemente nel seguente modo:
[value1, value2, ...valuen]=nomefunction(input1, input2, ...inputn)
A titolo di esempio scriviamo un function che, dato un vettore, riporta il minimo e massimo e elemento
function [min, max]=minmax(v) %Questa function riporta il minimo e massimo elemento di un vettore min=min(v); max=max(v); return
Come già scritto più volte in precedenza, uso questa sintassi per il Matlab, mentre per Octave sarebbero possibile anche altre soluzioni più specifiche che non presento, appunto per mantenermi compatibili con ambedue i programmi. Qui trovate ad esempio la documentazione per Octave, non sono però sicuro che Matlab riconosca il comando endfunction (purtroppo non possiedo Matlab e quindi non ho potuto controllare), per evitare questo problema vi do’ il link alla documentazione di Matlab.
In uno dei primi articoli ho scritto che avremmo dovuto creare una cartella dove avremmo posizionato le nostre function. Se non lo avete ancora fatte fatelo, e salvate la function minmax.m (assicuratevi di salvarla con il nome giusto!)
Cicli in Octave
Come in tutti i linguaggi di programmazione anche in Octave è possibile definire dei cicli. In sostanza si dice a Octave di ripetere un certo calcolo (in cui ovviamente i numeri dati varieranno) finché non accade una certa condizione preimpostata.
Cicli while
La sintassi è la seguente
while (condizione==true)
istruzione
end
un esempio sciocco
>n=0; >while (n<5) >n=n+1 >end
Questo ciclo aumenta di 1 il numero n (che abbiamo impostato a 0 prima) finché esso è minore di 5, per n=0,1,2,3,4 questa condizione è vera, quando n=5 non lo è più e il ciclo si ferma.
Cicli for
La sintassi è la seguente:
for contatore=inizio:passo:fine
istruzioni
end
oppure al contatore possiamo assegnare i valori di un vettore.
In ambedue i casi nel ciclo for un istruzione viene eseguito un numero predefinito di volte per i valori che il contato assume.
ad esempio
>for i=1:10 %(oppure i=1:1:10)
>disp('ciao')
>end
Qui il ciclo viene eseguito 10 volte, e in ogni ciclo verrà visualizzata la scritta “ciao”
Normalmente in Octave è sconsigliato, quando si può, scrivere cicli.
Ovviamente gli esempi di prima sono poco significativi, supponiamo però di voler calcolare la media di un vettore v=[1 2 3 4 5 6]
con un ciclo for scriveremmo
>n=0 >for i=v %v è il vettore, i assume i valori presenti nel vettore >n=n+i >end >media=n/lenght(v)
Un modo molto più elegante è quello di scrivere
>media=sum(v)/length(v)
oppure
>mean(v)
visto che in questo caso esiste la funzione apposita.
Evitare cicli, ma effettuare operazioni vettoriali o matriciali permette di risparmiare tempo, su vettori con pochi componenti, come tutti quelli tratti in esempio, la differenza sarà praticamente nulla, ma se si deve lavorare con centinaia di centinaia di valori, dati che vengono da un esperimento, allora anche risparmiare pochi decimi di secondo ad ogni operazione può significare di risparmiare ore e ore di elaborazione dei dati per un codice scritto in maniera più pulita e efficiente.
Operatori logici
In informatica vengono spesso usato operatori logici (oppure booleani), che riportano il valore 0 se una cosa è falsa, un numero diverso da 0 (per convenzione 1) se una cosa è vera.
Gli operatori logici in Octave sono:
>,<,>=,<=,==,~=
potete provare a definire un vettore (o un numero) a e b provare i comandi
>a==b >a~=b
e via dicendo e osservare i risultato. Le operazioni vengono fatte per ogni componente.
Vi sono poi i seguenti operatori
& , ||, ~, xor
a & b vi da una condizione vera se gli vengono passate due condizioni vere (cioè due numeri diversi da 0, ad esempio
>6 & 3)
a||b da una condizione vera se almeno una delle due condizione che gli vengono passate è vera
xor(a,b) da vero se solo una delle due condizioni è vera/falsa
~a vi da la condizione opposta; da falso se gli passata un qualcosa di vero, da vero se gli passate qualcosa di falso.
Istruzioni if
la sintassi generica è
if (condizione1==true)
istruzione1
elseif (condizione2==true)
istruzione2
elseif …
…
else
istruzione3
end
In pratica Octave controlla se una condizione è vera (cioè se nella parentesi ha un numero diverso da 0), se lo è esegue una operazione, se non lo è va a controllare se è vera un’altra condizione per eseguire un’altra istruzione.
Esempio
if (n==5) %si vedano gli operatori logici per il significato
disp('n è uguale a cinque')
elseif (n>5)
disp('n è maggiore di cinque')
else
disp('n è minore di cinque')
end
Finita anche questa lezione, eccovi gli esercizi e le soluzioni. Ovviamente è un’ottima idea salvare anche tutti gli esercizi del capitolo precedente sotto forma di script-file, in modo da averli tutti salvati insieme









Il Bloggatore
LinuxFeed
Pupugnao
Smilla Magazine
Tuxfeed