Errori di programmazione Lo sviluppo di programmi è ovviamente soggetto ad errori da parte del programmatore. Gli errori sono generalmente di due tipi: Errori di sintassi (syntax errors): violazioni della sintassi del linguaggio, ad esempio omettere parentesi, digitare in modo errato una parola chiave. Errori in fase di esecuzione (run-time errors): sono in genere errori nello sviluppo dell algoritmo, ovvero l algoritmo non fa quello che dovrebbe fare. Ad esempio un calcolo errato o la modifica del valore di una variabile che non dovrebbe essere modificata
Errori di programmazione Gli errori di sintassi vengono individuati e segnalati dall interprete, durante la fase di interpretazione del codice. Gli errori in fase di esecuzione si manifestano di solito attraverso risultati inattesi restituiti da una funzione o attraverso anomalie nell esecuzione di un programma (ad esempio cicli infiniti, terminazioni anomale). Gli errori in fase di esecuzione sono pertanto più difficili da individuare e correggere.
Debugging Il Debugging è il processo attraverso il quale si individuano e correggono errori in fase di esecuzione all interno di un programma. L ambiente di sviluppo MATLAB fornisce uno strumento, il debugger, che assiste il programmatore nell individuazione e correzione degli errori in fase di esecuzione. Il debugger MATLAB è integrato con l editor predefinito per gli M-file.
Debugging Il debugger consente di impostare punti in cui sospendere l esecuzione di un M-file allo scopo di esaminare i valori correnti delle variabili. Tali punti sono chiamati breakpoint I breakpoint possono essere impostati solo in corrispondenza di linee di codice eseguibili contenute in file salvati nella directory corrente o in una directory inclusa tra i path di MATLAB. I breakpoint possono essere impostati nell editor predefinito cliccando a sinistra della linea di codice in corrispondenza della quale si desidera il breakpoint.
Debugging Quando l esecuzione di un programma è sospesa si può esaminare il valore corrente delle variabili. Ad esempio è possibile esaminare le variabili presenti nel workspace di una funzione. Se si riscontrano valori inattesi, ciò significa che nelle linee di codice precedentemente eseguite è presente un errore. Se invece tutti i valori sono corretti, si può proseguire con l esecuzione delle linee di codice successive. I valori possono essere esaminati per esempio attraverso il Workspace Browser.
Esecuzione passo-passo E possibile eseguire un programma istruzione per istruzione in modo da esaminarlo nel dettaglio. Nel menu Debug dell editor predefinito: Step: esegue la riga corrente di un M-file Step In: esegue la riga corrente di un M-file e, se la linea è una chiamata ad un altra funzione, entra all interno della funzione chiamata. Step Out: dopo uno Step In, esegue il resto del codice della funzione chiamata, lascia la funzione chiamata e sospende l esecuzione del programma
Esecuzione passo-passo Nel menu Debug dell editor predefinito: Continue: continua l esecuzione di un M-file fino al prossimo breakpoint o al completamento dell esecuzione Go until cursor: continua l esecuzione di un M-file fino alla riga su cui è posizionato il cursore. Nota: occorre salvare le modifiche apportate ad un M-file prima di iniziare il debug. Se si prova ad operare il debug di un file non salvato, MATLAB salva automaticamente il file prima di iniziare il debug.
Importazione/Esportazione di Dati In MATLAB si possono importare ed esportare dati in uno dei seguenti tipi di file: -MAT-file (file binari con estensione.mat) -File di testo (dati in formato ASCII) -File di tipo grafico (ad esempio file tiff, gif, jpeg, png) -File audio e video (ad esempio file wav, avi) -Fogli di calcolo (ad esempio file Excel)
Esportazione in formato MAT Per esportare dati in formato MAT sintassi: save file_name variables_name >> save test A B oppure save('test', 'A', 'B') Le variabili A e B vengono salvate nel file test.mat >> save work Le variabili nel workspace vengono salvate nel file work.mat
Importazione di MATfile load permette di caricare file.mat precedentemente salvati >> load test carica il file test.mat >> load work
Esportazione in formato testo Per esportare dati in formato testo (codifica ASCII) si può usare il comando save con l opzione -ASCII. Sintassi: save file_name variable_name -ASCII Esempio: >> save test.txt A -ASCII Nel file test.txt troveremo gli elementi dell'oggetto A separati da spazi Nel caso si voglia usare la tabulazione si può aggiungere l opzione -tabs >> save test.txt A -ASCII -tabs La funzione dlmwrite consente di impostare qualsivoglia carattere separatore, passandolo come parametro alla funzione stessa. >> dlmwrite( test.txt, A, ; );
Importazione da file di testo Se i dati sono numerici, sono contenuti in un file di testo (la cui estensione tipica è.txt) e sono separati da spazi vuoti o tab, è possibile caricarli in MATLAB attraverso il comando load, utilizzandolo nel modo seguente: load percorso_del_file dlmread permette di leggere file di testo specificando in input il separatore >> dlmwrite('test.txt', A, ';'); >> dlmread('test.txt',';') MATLAB salva i dati in una matrice avente lo stesso nome del file. È poi possibile ridenominare la matrice come una qualsiasi altra matrice.
Importazione da file di testo Per altre tipologie di dati in formato testo possiamo usare importdata >> a=importdata('../stringhe.txt') a = 'stringa1' 'stringa2' 'stringa3' >> a(1) ans = 'stringa1'
Esempi >> B=[1:2:11; 2:7; 1:6] >> save frommat.txt B -ASCII >> save frommat.txt B -ASCII -tabs >> save('frommattab.txt', 'B', '-ASCII', '-tabs') >> load frommat.txt >> load frommattab.txt >> dlmwrite('frommatdot.txt', B, ';'); >> dlmread('frommatdot.txt',';') ans = 1 3 5 7 9 11 2 3 4 5 6 7 1 2 3 4 5 6
Import Wizard Oltre alla funzione load e ad altre funzioni simili, MATLAB mette a disposizione uno strumento, Import Wizard, per l importazione di dati. Usando Import Wizard spesso non è necessario imporre o conoscere il formato esatto dei dati, in quanto questo viene generalmente rilevato dal Wizard stesso. Import Wizard si lancia dal menu File nel menu principale di MATLAB: File -> Import Data. Dopo averlo lanciato è sufficiente specificare quale sia il carattere separatore per i dati e se il file abbia una intestazione (header) Il Wizard genera una preview dei dati da importare.
Import Wizard Attenzione: se il workspace base contiene già una variabile avente lo stesso nome del file da importare, il suo contenuto andrà perduto
Insertion Sort InsertionSort(Array A) 1.for i = 2 to length(a) do 2. v A[i] 3. j i - 1 4. while j >= 1 and A[j] > v do 5. A[j + 1] A[j] 6. j j - 1 7. end while 8. A[j + 1] v 9. end for 10. return A j = 1 v = 2 5 2 3 8 7 1 Linea 5 j = 0 Linea 6 j = 1 i=2 2 5 3 8 7 1 Linea 8 v j = 2 v = 3 2 5 3 8 7 1 Linea 6 Linea 5 2 3 5 8 7 1 Linea 8 v i=3 A[j] < v i=4
Insertion Sort InsertionSort(Array A) 1.for i = 2 to length(a) do 2. v A[i] 3. j i - 1 4. while j >= 1 and A[j] > v do 5. A[j + 1] A[j] 6. j j - 1 7. end while 8. A[j + 1] v 9. end for 10. return A Costo Ripetizioni 1 n-1 1 n-1 1 2*m? 1 m* 1 m* 1 n -1 -------------------------------- T(n,m) = 3*(n-1) + 4*m*
Insertion Sort Caso peggiore: quanto vale m? m = 1 quando i = 2, m = 2 quando i = 3,..., m = n-1 quando i=n. Il ciclo while viene eseguito n 1 i=n n 1 /2= n2 i=1 2 n 2 volte. T n =3 n 1 4 n2 2 n 2 =2n2 n 3 E nel caso migliore? Qual è la classe di complessità di T(n)?
Esercizi 3.1.Scrivere un algoritmo di ordinamento degli elementi di un vettore di taglia n calcolando, ad ogni passo 'i', il minimo nel sotto vettore di indici i:n e scambiandolo con l'elemento di posizione i 1) provare l'algoritmo per vettori casuali di taglia diversa e memorizzarne i tempi di esecuzione 2) scrivere la funzione di complessità dell'algoritmo in funzione della taglia dell'input
Esercizi 3.2. Ripetere i passi 1) e 2) dell'esercizio precedente con l'algoritmo Insertion Sort e confrontare le due funzioni di complessità nel caso peggiore e nel caso migliore 3.3. Scrivere uno script che legge dal file numeri.txt dei valori, li ordina e scrive nel file ordinati.txt la sequenza ordinata in ordine decrescente. 3.4. Scrivere una funzione che riceve come input il nome di un file, legge da tale file un un numero n, genera un vettore distribuito normalmente con media e deviazione standard a piacere, lo ordina e scrive nel file ordinati.txt la sequenza ordinata in ordine decrescente