next up previous

Next:Polinomi Up: Matlab Tutorial Previous: Strutture di controllo del flusso

Scripts e Funzioni


 
MATLAB è un linguaggio di programmazione potente così come un   
ambiente  computazionale interattivo. Files che contengono codice MATLAB  
sono chiamati M-files. 
Dopo aver creato un  M-file usando un qualsiasi editor di testo,  tale file  
può essere usato come un comando od una funzione MATLAB.  
Ci sono due generi di M-file:  

1)Scripts che non accettano argomenti d'entrata o argomenti di uscita.  
  Loro operano su dati nel workspace.  
2)Functions che possono accettare argomenti d'entrata e argomenti di uscita.  
Una variabile interna è locale alla funzione.
  
Se sei un nuovo programmatore di MATLAB,crea gli M-file di prova e posizionali 
nella directory corrente. In seguito gli M-file,potranno essere organizzati in altre directory  
e toolboxes personali che puoi aggiungere al percorso di ricerca di MATLAB.  
Se si duplicano nomi di funzioni, MATLAB esegue quello che  viene prima  
nel percorso di ricerca.  
Per vedere i contenuti di un M-file, per esempio myfunction.m, posso digitare 

myfunction 

 

  • Script
  • Quando si richiama uno script, MATLAB esegue semplicemente i comandi presenti nel file.Gli Script possono operare su dati esistenti nel workspace, o loro possono creare dati nuovi su cui operare. Sebbene gli script non non forniscono dati di output, qualsiasi variabile che loro creano rimane nel workspace, per essere usata in calcoli susseguenti. Inoltre, gli script possono produrre dei grafici, usando funzioni come plot. Per esempio, creiamo un file chiamato magicrank.m che contiene questi comandi MATLAB: % Determinazione del rango della magic squares r = zeros(1,32); for n = 3:32 r(n) = rank(magic(n)); end r bar(r) Digitando l'asserzione: magicrank imponiamo a MATLAB di eseguire i comandi, calcola il rango delle prime 30 magic squares, e traccia il grafico del risultato. Dopo l'esecuzione del file , le variabili n e r rimangono nel workspace.
  • Funzioni
  • Le Funzioni sono M-file che possono accettare argomenti d'entrata e forniscono argomenti di uscita. Il nome dell'M-file e della funzione deve essere lo stesso. Le Funzioni operano su variabili definite nel workspace proprio, separato dal workspace a cui si accede all'ingresso di MATLAB, cioè le variabili usate all'interno della funzione sono locali. Un buono esempio è fornito dalla funzione rank. L'M-file rank.m è disponibile nella directory toolbox/matlab/matfun Si può lanciare il file digitando rank Il file in questione è il seguente. function r = rank(A,tol) % RANK Matrix rank. % RANK(A) provides an estimate of the number of linearly % independent rows or columns of a matrix A. % RANK(A,tol) is the number of singular values of A % that are larger than tol. % RANK(A) uses the default tol = max(size(A)) * norm(A) * eps. s = svd(A); if nargin==1 tol = max(size(A)) * max(s) * eps; end r = sum(s > tol); La prima linea di una funzione M-file comincia con la funzione keyword.La quale da il nome alla funzione ed ordina gli argomenti. In questo caso,ci sono due argomenti di input ed uno di output. Le righe seguenti, rappresentano dei commenti per un aiuto, non vengono considerate nell'applicazione, e sono precedute dal simbolo %. Queste linee si stampano quando si digita help rank La prima linea del testo di aiuto è la H1 line che MATLAB espone quando si ricerca aiuto digitando help on nella directory che contiene la funzione. Il resto del file rappresenta codice eseguibile MATLAB definendo la funzione. La variabile s presente nel corpo della funzione, così come le variabili sulla prima fila r, A e tol, sono del tutto locali alla funzione;sono indipendenti e separate da qualsiasi variabile nel workspace di MATLAB. Questo esempio illustra un aspetto delle funzioni di MATLAB, che ordinariamente non si trovano negli altri linguaggi di programmazione - un numero variabile di argomenti. La funzione rank può essere usata in molti modi diversi: rank(A) r = rank(A) r = rank(A,1.e-6) Molte M-file lavorano così. Se nessuno argomento di output è approvvigionato, il risultato è immagazzinato in ans. Se il secondo argomento di input non è approvvigionato, la funzione calcola un valore di default. Fra il corpo della funzione, due quantità chiamate nargin e nargout sono disponibili,le quali ci dicono il numero di argomenti di input e di output coinvolti in ciascun uso della funzione. La funzione rank usa nargin, ma non ha bisogno di usare nargout.
  • Variabile globale
  • Se si vuole che più di una funzione condivida una singola copia di una variabile, basta semplicemente dichiarare la variabile come globale in tutte le funzioni. Si faccia la stessa cosa alla linea di comando se si desidera che ad essa acceda anche il workspace. La dichiarazione globale deve essere posizionata prima che la variabile sia usata in una funzione. Sebbene non sia richiesto, usando lettere maiuscole per i nomi di variabili globali ci si aiuta a distingurle dalle altre variabili. Per esempio, creiamo un M-file chiamato falling.m: function h = falling(t) global GRAVITY h = 1/2*GRAVITY*t.^2; Poi interattivamente introduciamo le asserzioni: global GRAVITY GRAVITY = 32; y = falling((0:.1:5)'); Le due asserzioni globali danno il valore assegnato a GRAVITY al prompt di comando nella funzione. Si può cambiare poi GRAVITY interattivamente per ottenere soluzioni nuove senza compilare alcun file.
  • Dualità Command/Function
  • Comandi di MATLAB sono : load help Molti comandi accettano modificatori che specificano operandi. load August17.dat help magic type rank Un metodo alternato di approvvigionare i modificatori di comando fornisce una sequenza di argomenti di funzioni. load('August17.dat') help('magic') type('rank') Questa è la "dualità tra command/function" di MATLAB. Qualsiasi comando della forma command argument può essere scritto anche nella forma funzionale command('argument') Il vantaggio dell'approccio funzionale viene quando l'argomento della sequenza è costruito dagli altri pezzi. L'esempio seguente processa files multipli, August1.dat, August2.dat e così via.In esso si usa la funzione int2str, che converte un numero intero in una sequenza di caratteri, per aiutare alla costruzione del nome del file. for d = 1:31 s = ['August' int2str(n) '.dat'] load(s) % Process the contents of the d-th file end
  • La funzione eval
  • La funzione eval lavora con variabili di testo per implementare una più potente agevolazione delle macro. L'espressione o asserzione: eval(s) usa l'interprete di MATLAB per valutare l'espressione o eseguire l'asserzione contenuta nella sequenza del testo s. L'esempio della sezione precedente potrebbe essere fatto anche col codice seguente, sebbene questo risulta meno efficiente perché coinvolge il pieno interprete, non solo una chiamata alla funzione. for d = 1:31 s = ['load August' int2char(n) '.dat'] eval(s) % Process the contents of the d-th file end
  • Vettorizzazione
  • È importante una vettorizzazione per ottenere la più alta velocità di MATLAB, nell'eseguire gli algoritmi contenuti negli M-file. Dove gli altri linguaggi di programmazione userebbero cicli for o do , MATLAB può usare operazioni su vettori o matrici. Un semplice esempio si ottiene creando una tavola di logaritmi. x = 0; for k = 1:1001 y(k) = log10(x); x = x + .01; end Agli utenti di MATLAB esperti piace dire "La Vita è troppo corta per spenderla scrivendo dei cicli." Una versione vettorizzata dello stesso codice è: x = 0:.01:10; y = log10(x); Per codici più complicati, le opzioni di vettorizzazione non sono sempre così ovvie. Quando la velocità è importante, si dovrebbe sempre cercare di vettorizzare i propri algoritmi.
  • Preallocation
  • Se non si può vettorizzare un pezzo di codice, si può fare velocizzare un ciclo FOR preallocando qualsiasi vettore o array nei quali sono immagazzinati i risultati di output. Per esempio, questo codice usa la funzione zeros per preallocare il vettore creato nel ciclo FOR. Questo fa sì che il ciclo sia eseguito più velocemente. r = zeros(32,1); for n = 1:32 r(n) = rank(magic(n)); end Senza la preallocation nell'esempio precedente, l'interprete di MATLAB allarga il vettore r di un elemento ad ogni ciclo. La vector preallocation elimina questo passo ed il risultato è una esecuzione più veloce.
  • Funzioni della funzione
  • Una classe di funzioni, chiamate "funzioni della funzione," lavorano con funzioni nonlineari di una variabile scalare . Ovvero, una funzione lavora su un altra funzione. Le funzioni della funzione includono: -Zero finding -Optimization -Quadrature -Ordinary differential equations MATLAB rappresenta le funzioni nonlineari attraverso una M-file funzione. Per esempio, qui c'è una versione semplificata della funzione humps dalla directory matlab/demos: function y = humps(x) y = 1./((x-.3).^2 + .01) + 1./((x-.9).^2 + .04) - 6; Valutare questa funzione per un set di valori nell'intervallo seguente: x = 0:.002:1; y = humps(x); Poitracciare il grafico della funzione con: plot(x,y) Il grafico mostra che la funzione ha un minimo locale vicino a x= 0.6. La funzione fmins trova il minimo valore di x . Il primo argomento di fmins è il nome del funzione di cui deve essere trovato il minimo, il secondo argomento è una supposizione grezza dell'ubicazione del minimo. p = fmins('humps',.5) p = 0.6370 Per valutare la funzione in corrispondenza del, humps(p) ans = 11.2528 Analisti numerici usano i termini quadratura ed integrazione per distinguere tra approssimazione numerica di un integrale definito e integrazione numerico di equazioni differenziali. Le routine di quadratura di MATLAB sono quad e quad8. L'asserzione: Q = quad8('humps',0,1) calcola l'area sotto la curva nel grafico e fornisce Q = 29.8583 Finalmente, il grafico mostra che la funzione non èmai zero su questo intervallo. Così, se si cerca uno zero con z = fzero('humps',.5) lo si troverà fuori dell'intervallo z = -0.1316.