Strumenti Utente

Strumenti Sito


roberto.alfieri:pub:matlab

Questa è una vecchia versione del documento!


Matlab/Octave

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.

Installazione di Matlab per studenti UniPR

Octave download - 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 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

Matrici

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 
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 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 
print('plot_matlab.pdf','-dpdf'); # stampa su file il plot in formato pdf 

Distribuzione normale

Distribuzione Normale (wp)

X=randn(r,c)  #Matrice rxc di casuali con distribuzione normale (mean=0, std=1)
m=mean(A)     #Valor medio di ogni colonna di A
s=std(A)      #Deviazione standard di ogni colonna A
std(A(:,2)) #Std della seconda colonna
normpdf(X,m,s)         #Densita' di prob. per ogni elemento di X, con mean=m e std=s
X=abs(rand(1,20))*10 ; # Crea un vettore di 20 numeri casuali tra 0 e 10
Y=hist(X,10);          # Suddivide l'intervallo del vettore in 10 intervalli e calcola le frequenze

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 
plot(x,y,'+');          # plot della curva

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

Cell Array

I Cell Arrays sono delle collezioni di matrici multidimensionali di qualunque tipo di dato, come ad esempio matrici numeriche e stringhe, oppure matrici numeriche di diverse dimensioni.

I cells array vengono rappresentati con la funzione cell() oppure parentesi graffe {}.

Ad esempio, il seguente comando crea una array 1x3 composta da 2 array numerici e una stringa:

C={[1,2,3], [4,5], "ciao"}
C(1,2)=[6,7]  sovrascrive il secondo array

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)

altri esercizi

roberto.alfieri/pub/matlab.1575482330.txt.gz · Ultima modifica: 04/12/2019 18:58 da roberto.alfieri