====== Matlab/Octave ======
[[wp>Matlab]] è un programma matematico di calcolo numerico, con un linguaggio di programmazione proprietario.
Marlab e' sviluppato e commercializzato da [[wp> MathWorks]].
[[wp>GNU_Octave]] e' un tool per il calcolo numerico con un interprete compatibile con il linguaggio Matlab.
Octave e' parte del progetto open source [[wp>GNU]].
Documentazione in rete:
* [[http://www.gnu.org/software/octave/doc/interpreter/index.html | Octave Reference]]
* [[http://www.df.unipi.it/~ferrante/Tecnologie_fisiche/matlab.pdf | Manuale Matlab ]]
* [[http://en.wikibooks.org/wiki/MATLAB_Programming/Differences_between_Octave_and_MATLAB | Compatibilita' Octave /Matlab]]
* [[http://www.fis.unipr.it/home/roberto.alfieri/didattica/matdid/prog/octave/tutorial/| Altri manuali di Octave e Matlab ]]
Installazione:
L'Università di Parma ha acquistato la licenza TAH (Total Academic Headcount) di MathWorks, che consente l'installazione di Matlab (inclusi Simulink e una cinquantina circa di toolbox aggiuntivi) per personale e studenti dell'Ateneo. La licenza e' per il solo uso didattico.
[[ https://si.unipr.it/sites/default/files/2018-11/Avviorapido-licenza-TotalAcademicHeadcount-UtenteFinale.pdf | Avvio rapido ]] -
{{ https://si.unipr.it/pagina-base/matlab-luniversita-di-parma
| Installazione di Matlab per studenti UniPR}}
[[ https://www.gnu.org/software/octave/download.html | Octave download]] -
[[ https://octave.sourceforge.io/packages.php | Packages]]
===== Guida Rapida =====
Esistono 2 modalita' di interazione:
* Command line: una sola finestra con l'interprete per l'esecuzione dei comandi
* Tramite IDE (Integrated Development Environment). Diverse finestre, tra cui l'interprete dei comandi, un editor, una finstra per esplorare il file-system e una per visualizzare le variabili nel Workspace.
Nelle aule informatiche dell'Ateneo Octave parte in modalita' command-line, mentre Matlab in modalita' IDE.
==== Ambiente di Lavoro ====
Matlab utilizza un Workspace che contiene le variabili utilizzate.
Vedi [[https://it.mathworks.com/help/matlab/workspace.html | Workspace]]
% Esercizi:
% Il carattere e % serve per i commenti. In Octave si puo' usare anche il carattere #
c=3 # I numeri sono rappresentati unicamente in Floating Point a 64 bit (8 byte)
c # Mostra il contenuto della variabile c
whos c # visualizza i dettagli della variabile c nel workspace
d=4; # il ; sopprime il modo "verboso"
s='stringa' # Nelle stringhe i caratteri sono rappresentati in ASCII
who # visualizza il contenuto del workspace
help who # help mostra sintassi e opzioni di un comando
whos # mostra maggiori dettagli del Workspace
clear # svuota il Workspace
MATLAB/Octave interagisce con il file-system per caricare programmi e dati, e
per salvare i risultati.
Vedi [[ https://it.mathworks.com/help/matlab/files-and-folders.html | File e cartelle]]
# Esercizi:
pwd # mostra la directory (cartella) corrente
ls # lista il contenuto di una directory
ls -l # ls con piu' dettagli (solo Octave)
cd newdir # entra nella sottodir newdir
cd .. # entra nella dir genitore
cd # torna alla cartella home
cd z: # cambia disco di lavoro in Z: (in ambiente windows)
mkdir newdir # crea la directory newdir
history # visulizza la storia dei comandi eseguiti (solo Octave)
diary on # attiva il salvataggio della sessione di comandi
diary nomefile.txt # Scrive in nomefile.txt tutti i comandi eseguiti
type filename.m # visualizza il contenuto
save filename.dat # Salva il Workspace
load filename.dat # Carica il WS
save -ascii file.dat c # Salva in formato ascii la variabile c
==== Matrici ====
Vedi [[https://it.mathworks.com/help/matlab/learn_matlab/matrices-and-arrays.html | matrices and arrays]]
A=[3 5; 7 9] # Crea una matrice 2x2
A1=[1:10] #Array da 1 a 10 con incremento 1
A2=[-3.14:0.2:3.14] # Array da -3.14 a 3.14 con incremento 0.2
A=[1:2:5;7:9;10 20 30] # Crea una matrice 3x3
c=A(2,1) # Scrive in c l'elemento (2,1) della matrice A
B=A’ #Scrive in B la trasposta della matrice A
C=A*B #Prodotto matriciale
A.*B #Prodotto scalare
S=sum(A) #Calcola il vettore delle somme colonna per colonna
size(A) #Determina il vettore [num_righe num_colonne]
rows(A) #Determina il numero di righe (solo Octave)
columns(A) #Determina il numero di colonne (solo Octave)
length(A) #Dimensione massima della matrice
r=8
c=4
zeros(r,c) #Matrice rxc di 0
ones(r,c) #Matrice rxc di 1
eye(n) #Matrice identita' nxn
B=inv(A) #Inversa di A ( A*B = matrice Identita')
rand(r,c) #Matrice rxc di numeri casuali tra 0 e 1
==== Rappresentazione grafica ====
Vedi [[https://it.mathworks.com/help/matlab/ref/plot.html | plot]]
X=[-3.14:0.1:+3.14];
Y=sin(X)
plot(Y) #Grafica gli elementi del vettore Y
plot(X,Y) #Grafica del vettore Y con ascissa in X
bar(Y) #Grafico a barre
title(‘titolo') #Scrive il titolo nel grafico
xlabel ('this is xlabel')
ylabel ("this is ylabel")
grid on #Inserisce la griglia nel grafico
hold on # Mantieni il disegno corrente nel grafico (per plot sovrapposti)
hold off # Disattiva la funzione hold-on
print('plot_matlab.png','-dpng'); # stampa su file il plot in formato png (MATLAB)
print('plot_matlab.pdf','-dpdf'); # stampa su file il plot in formato pdf (MATLAB)
print plot_matlab.png -dpng'; # stampa su file il plot in formato png (OCTAVE)
print plot_matlab.pdf -dpdf'; # stampa su file il plot in formato pdf (OCTAVE)
==== Distribuzione normale ====
[[ https://it.wikipedia.org/wiki/Distribuzione_normale | Distribuzione Normale ]] (wp)
c=2
r=10
RN=randn(r,c) #Matrice rxc di casuali con distribuzione normale (mean=0, std=1)
m=mean(RN) #Valor medio di ogni colonna di X
s=std(RN) #Deviazione standard di ogni colonna X
std(RN(:,2)) #Std della seconda colonna
#
X=[-3.14:0.1:3.14]
Y=normpdf(X,m,s) #Densita' di prob. per ogni elemento di X, con mean=m e std=s
plot(X,Y)
#
X=randn(1,200)*10+5 ; # Crea un vettore di 200 numeri random con distribuzione normale, con valor medio=5 e std=10
hist(X,10); # Suddivide l'intervallo del vettore in 10 intervalli, calcola e disegna le frequenze
==== Distribuzione di Poisson ====
[[ https://it.wikipedia.org/wiki/Distribuzione_di_Poisson | Distribuzione_di_Poisson]] (wp)
# Esercizi:
P=poissrnd(1.5,[1,100]) # genera di 100 numeri random in distribuzione di Poisson con Lambda=1.5
mean(P) # calcola il valor medio
bar(P) # genera un plot a barre con la distribuzione dei 100 numeri
hist(P) # genera un plot a barre con 10 classi di frequenza
hist(P,4) # genera un plot a barre con 4 classi di frequenza
[d,n]=hist(P,6) # scrive in dati e n i valori dei dati (d) e le relative classi (n)
bar(n,d) # plot a barre con dati e frequenze
x=[0:10]
y = poisspdf(x,1.5); # determina la densità di probabilità per i valori in x con Lambda=1.5
bar(x,y)
====Logica e relazioni====
Operatori relazionali:
> < >= <= == ~=
Il risultato e' vero (1) o falso (0).
Esempi:
5>7 # risultato: 0
[ 3 5 2 ] >= [ 1 0 12 ] # risultato: 1 1 0
'Tom' == 'Bob' # risultato: 0 1 0
Operatori logici:
and & or | xor not ~
Esempi:
(0|1)&(1|0) # valuta l'espressione binaria e ritorna il risultato booleano
(eta>=25) & (eta<=30) # eta tra 25 e 30 anni
Altri operatori logici:
any(X) # almeno un elemento del vettore e' vero (diverso da 0)
Esempio: any ( [0 7 0] ) risultato 1 (vero)
all(X) # tutti gli elementi del vettore veri (diversi da 0)
Esempio: all ( [0 7 0] ) risultato 0 (falso)
Funzioni di trasformazione:
hex2dec('FF') # trasforma in numero decimale una stringa esadecimale
dec2hex(1023) # trasforma un numero decimale in una stringa esadecimale
dec2bin(1023) # trasforma un numero decimale in una stringa binaria
bitshift(3,2) # applica uno shift a sinistra di 2 bit di 3
====Input/output ====
n=input('inserisci un numero: ') # legge un numero da tastiera e scrive nella variabile
s=input('inserisci una stringa: ','s') # legge una stringa da tastiera e scrive nella variabile
disp('Riultato'); # scrive sullo schermo una stringa o un variabile
disp(['Risultato',num2str(n)]); # concatena diversi valori
====stringhe====
c='ciao' #Le stringhe si scrivono tra singoli apici
s='l''albero' # Caratteri speciali
s="stringa" # Solo Octave
s=num2str(n) #Conversione da numero a stringa
n=str2num(s) #Conversione da stringa a numero
z=[c,'mondo'] #Concatena 2 (o piu') stringhe
====Script====
Matlab/Octave consente di memorizzare una sequenza di
istruzioni in un file; questo, per essere accessibile,
deve avere l'estensione ".m"e pertanto si chiama M-file.
Se al prompt si digita il nome del file si ottiene lo
stesso risultato che si sarebbe ottenuto scrivendo
uno ad uno i comandi elencati nel file.
Gli M-file possono essere di due tipi: script o function.
==Esempio di script==
**data_gen.m** Genera un vettore di dati con distribuzione normale
e lo scrive in ASCII nel file data.txt
m=input('inserisci valor medio: ');
s=input('inserisci deviazione standard: ');
n=input('inserisci numero di elementi: ');
D=randn(n,1)*s+m
save -ascii data.txt D
Calcola la media dei voti. File **voti.m** :
nvoti = 0; somma = 0;
voto = input('voto? (0 per finire)');
while voto ~= 0
somma = somma + voto;
nvoti = nvoti + 1;
voto = input('voto? (0 per finire)');
end
media = somma/nvoti;
disp (media)
data_analysis.m Analisi e plot dei dati
clear;
load data.txt
mn = min(data);
mx = max(data);
n = length(data); % determina il numero di misure
m = mean(data); % determina il valore medio
s = std(data); % determina la deviazione standard
%hist(data);
title('data plot');
xlabel('xlabel');
ylabel('ylabel');
[d,c]=hist(data,10) % scrive i valori dei dati (d) e le relative classi (c)
bar(c,d)
str = [];
str = [str,'m=', num2str(m), char(10) ];
str = [str,'s=', num2str(s)];
annotation('textbox',[.7 .7 .0 .0],'String',str,'FitBoxToText','on'); % funziona con Matlab
print('data_plot.png','-dpng');
==Esempio di Funzione ==
gauss.m Data una distribuzione gaussiana con valore medio "media" e deviazione
standard "sigma", determina la densita' di probabilita' di un array X.
function F=gauss(X, media,sigma)
F=exp(-((X-media).*(X-media))/(2.0*sigma*sigma));
F=F/sqrt(2*pi*sigma*sigma);
return
==Esempio di script ==
gaussian.m Grafica la funzione distribuzione normale
utilizzando la funzione "gauss()"
%Grafica la funzione distribuzione normale (Gauss)
m=2;
s=1;
X=m-3*s:1/100:m+3*s;
Y=normpdf(X,m,s);
%Y=gauss(X,m,s);
plot(X,Y);
xlabel('X');
ylabel('Densita'' di probabilita''');
title('Distribuzione Normale');
grid on;
print('gauss.png','-dpng')
==== Programmazione ====
MatLab/Octave può essere considerato un linguaggio di
programmazione alla stregua del Fortran o del C.
L’esistenza di strutture sintattiche tradizionali e l’uso
appropriato di funzioni intrinseche consentono di
codificare in modo semplice e flessibile algoritmi
semplici e più complessi.
Ci sono cinque strutture di controllo di flusso:
* if statements
* switch statements
* for loops
* while loops
* break statements
== esempio_if.m ==
a = 3;
if a > 0
disp(['maggiore di zero ',num2str(a)]);
else
disp(['minore di zero ',num2str(a)]);
end
== esempio_for.m ==
for i=1:8
disp(['numero: ',num2str(i)]);
end
== esempio_while.m ==
nvoti = 0; somma = 0;
voto = input('voto? (0 per finire)');
while voto ~= 0
somma = somma + voto;
nvoti = nvoti + 1;
voto = input('voto? (0 per finire)');
end
media = somma/nvoti;
disp (media)
[[http://didattica-linux.unipr.it/home/alfieri/matdid/LABI/octave/ | altri esercizi ]] (occorre la VPN)