Matlab è un programma matematico di calcolo numerico, con un linguaggio di programmazione proprietario. Marlab e' sviluppato e commercializzato da MathWorks.
GNU_Octave e' un tool per il calcolo numerico con un interprete compatibile con il linguaggio Matlab. Octave e' parte del progetto open source GNU.
Documentazione in rete:
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.
Esistono 2 modalita' di interazione:
Nelle aule informatiche dell'Ateneo Octave parte in modalita' command-line, mentre Matlab in modalita' IDE.
Matlab utilizza un Workspace che contiene le variabili utilizzate. Vedi 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 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
Vedi 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
Vedi 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)
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
# 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)
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
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
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
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.
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');
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
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')
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:
a = 3; if a > 0 disp(['maggiore di zero ',num2str(a)]); else disp(['minore di zero ',num2str(a)]); end
for i=1:8 disp(['numero: ',num2str(i)]); end
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)
altri esercizi (occorre la VPN)