Visualizzazione di dati MATLAB fornisce un estesa serie di strumenti per la visualizzazione di dati in due e tre dimensioni. Questi strumenti consentono di: Creare grafici Editare i grafici ed esplorare il valore degli elementi rappresentati Annotare i grafici con testo o simboli Stampare i grafici Salvare i grafici in MATLAB (FIG-files) e/o esportarli in formati grafici standard
La funzione di base per creare grafici in MATLAB è plot. La funzione plot appare in diverse forme in base al numero ed al tipo degli argomenti in input. Ad esempio, se y è un vettore, plot(y) crea un grafico in cui i valori contenuti nel vettore y sono rappresentati come ordinate rispetto agli indici di y. In altre parole, il grafico riporterà in ascissa gli indici di y ed in ordinata il valore dei suoi elementi.
Se invece x e y sono due vettori, plot(x, y) crea un grafico in cui i valori contenuti nel vettore y sono rappresentati rispetto ai valori contenuti in x. In altre parole, il grafico rappresenterà le coppie (x i, y i ), con in ascissa i valori di x ed in ordinata quelli di y. La funzione plot in questa forma è spesso usata per disegnare il grafico di funzioni: si inseriscono in x i valori in corrispondenza dei quali la funzione deve essere calcolata ed in y i valori calcolati della funzione.
>> x = [0 : pi/100 : 2*pi]; >> y = sin(x); >> plot(y); >> x = [0 : pi/100 : 2*pi]; >> y = sin(x); >> plot(x,y);
Le funzioni xlabel e ylabel permettono di assegnare etichette agli assi delle ascisse e delle ordinate. NOTA: un grafico professionale dovrebbe sempre riportare le etichette degli assi (ovvero che cosa gli assi rappresentano), nonché le rispettive unità di misura. La funzione title permette di assegnare un titolo al grafico. xlabel, ylabel e title devono essere eseguiti dopo il comando plot
>> x = [0 : pi/100 : 2*pi]; >> y = sin(x); >> plot(x, y); >> xlabel( x = 0 : 2\pi ); >> ylabel( Sine of x ); >> title( Plot of the sine function );
Il comando grid visualizza le linee di una griglia in corrispondenza dei segni di graduazione degli assi di un diagramma. Occorre digitare grid on per attivare la griglia e grid off per disattivarla. MATLAB imposta automaticamente il valore minimo e massimo per gli assi. Per modificare le impostazioni predefinite si può utilizzare il comando axis: axis([xmin xmax ymin ymax])
>> x = [0 : pi/100 : 2*pi]; >> y = sin(x); >> plot(x, y); >> xlabel( x = 0 : 2\pi ); >> ylabel( Sine of x ); >> title( Plot of the sine function ); >> grid on >> axis([0 6.5-1.2 1.2]);
Il comando fplot interpreta la rappresentazione simbolica di una funzione, passata come argomento in formato testo, e ne disegna il grafico. >> fplot( string, [xmin xmax]) Il simbolo 'x' in string deve essere usato per la variabile indipendente. [xmin xmax] è l intervallo all interno del quale la funzione viene calcolata ed il grafico disegnato.
>> f = exp(-0.1*x) * sin(log(x + 1)) ; >> fplot(f, [0 20]); >> xlabel( x = 0 : 20 ), ylabel( f = exp(-0.1*x) * sin(log(x + 1)) ); >> title( fplot example );
Il comando subplot consente di generare all interno della stessa finestra grafica più diagrammi di dimensioni ridotte. Sintassi: subplot(m, n, p) La finestra grafica viene suddivisa in m x n pannelli rettangolari ed il successivo comando plot, disegna un grafico all interno del p-esimo pannello. Ad esmpio, subplot(3, 2, 4) crea 6 pannelli (3 x 2) e fa sì che il successivo comando plot disegni all interno del 4 pannello.
>> x = [0 : pi/100 : 2*pi]; >> y = sin(x); >> subplot(1, 2, 1); >> plot(x, y), xlabel( x = 0 : 2\pi ), ylabel( Sine of x ); >> y = exp(-x); >> subplot(1, 2, 2); >> plot(x, y), xlabel( x = 0 : 2\pi ), ylabel( Exp of x );
Si possono generare diagrammi sovrapposti passando come argomento al comando plot più coppie di vettori x e y. Per ogni coppia di vettori (x, y) viene generato un diagramma di colore diverso. MATLAB cicla automaticamente tra i colori disponibili. Tale configurazione può essere modificata a piacimento dall utente. Il comando legend permette di visualizzare una legenda per poter distinguere tra i diagrammi.
>> x = [0 : pi/100 : 2*pi]; >> y = sin(x); >> z = cos(x); >> w = exp(-x).* sin(x); >> plot(x, y, x, z, x, w); >> xlabel( x = 0 : 2\pi ); >> legend( Sin of x, Cos of x, Sin and Exp );
Il comando hold consente di sovrapporre un nuovo grafico ad un grafico già esistente Per attivare la sovrapposizione si digita hold on: d ora in poi ogni comando successivo plot opererà sulla stessa figura. Per disattivare la sovrapposazione si digita invece hold off: d ora in poi ogni successivo comando plot cancellerà la figura precedente e disegnerà una nuova figura. Per impostazione predefinita hold è off.
>> x = [0 : pi/100 : 2*pi]; >> y = sin(x); >> z = cos(x); >> w = exp(-x).* sin(x); >> plot(x, y); >> hold on; >> plot(x, z); >> plot(x, w); >> xlabel('x = 0 : 2\pi'); >> hold off;
Marker, colori e tipi di linea si specificano passando come argomento a plot una stringa i cui elementi sono codici associati allo specifico marker, colore o tipo di linea desiderato. Sintassi: plot(x, y, color_style_marker) Esempio: per marcare con crocette rosse le coppie di valori contenute nei vettori x e y e congiungere ciascun punto con una linea tratteggiata si scrive: plot(x, y, r--+ )
Tipi di marker: crocetta (+), cerchio (o), asterisco (*), simbolo per (x), quadrato (s), rombo (d), triangolo verso l alto (^), triangolo verso il basso (v), triangolo a destra (>), triangolo a sinistra (<), stella (p), esagono (h) Colori: ciano (c), magenta (m), giallo (y), rosso (r), verde (g), blu (b), bianco (w), nero (k) Tipi di linea: continua (-), tratteggiata (--), punteggiata (:), tratto e punto (-.)
>> x = [0 : pi/10 : 2*pi]; >> y = sin(x); >> z = cos(x); >> plot(x, y, 'r--o', x, z, 'b:s'); >> xlabel('x = 0 : 2\pi'); >> legend('sin of x', 'Cos of x'); Specificando solo 'ro' vengono stamapati solo i punti senza linea
Salvare le figure Quando si crea un diagramma, MATLAB genera una finestra grafica all interno della quale viene disegnato il diagramma. Per salvare il diagramma è sufficiente selezionare Save o Save as dal menu File che appare nella parte superiore di tale finestra grafica. Il diagramma viene salvato come opzione base in un FIG-file (file con estensione.fig), me si può scegliere anche una estensione diversa (es. jpeg) Il diagramma (solo nel caso di FIG-file) potrà essere quindi aperto in una nuova sessione di MATLAB, attraverso l opzione di menu File -> Open nel menu principale di MATLAB.
Heapsort Algoritmo di ordinamento detto Heap-Sort che ha le seguenti caratteristiche: T(n) = O(n log(n)) Alg. Ordinamento ottimale Ordina in loco. Usa la una struttura di dati heap. Heap binario = albero binario in cui ogni nodo figlio ha una chiave minore o uguale alla chiave del proprio nodo padre.
Heap Heap binario = albero binario in cui ogni nodo figlio ha una chiave minore o uguale alla chiave del proprio nodo padre. L albero è quasi completo : Completo su tutti i livelli tranne eventualmente sul livello più basso che è riempito da sinistra. Altezza dell albero : lunghezza del più lungo cammino discendente dalla radice ad una foglia.
Heap Proprietà di ordinamento parziale dello heap: Ogni nodo interno contiene un valore maggiore uguale del valore contenuto nei figli. Da ciò segue che: l elemento più grande dello heap è memorizzato nella radice. ogni nodo interno contiene un valore maggiore uguale del valore contenuto in tutti i suoi discendenti.
Heap Heapsize: numero di elementi nello heap Diverso in genere dalla lunghezza del vettore che lo contiene i=1 2 3 4 5 6 7 8 9 10 Length[A] 16 14 10 8 7 9 3 2 4 1 Heap-size[A] Heap-size[A] Length[A] Un albero binario quasi completo può essere descritto da un vettore in cui il figlio sinistro (left(i)) ed il figlio destro (right(i) di un nodo i si trovano nelle posizioni 2i e 2i+1 (se minori di heapsize) rispettivamente Il padre è in posizione floor(i/2), se tale valore è 1.
Altezza albero binario 2 14 16 i=1 3 10 Altezza di un nodo: numero di archi sul più lungo cammino dal nodo ad una foglia H = 3 4 8 5 7 6 9 3 7 Altezza dell'albero: massima altezza di un nodo 8 9 10 2 4 1 H = altezza albero binario; N = numero di elementi nell'albero Se l albero è completo: N = 1 +2 + 2 2 + + 2 H = 2 H *( 1 + (1/2) + + (1/2) H )= 2 H *(2-(1/2) H ) = 2 H+1 1 Se l albero non è completo: 2 H -1 < N < 2 H+1 1 H = Θ(log(n))
Heapify Supponiamo che A sia uno heap. Alteriamo il valore di A[1]. L array che otteniamo non è più un heap. I sottoalberi con radice in A[right(1)] ed A[left(1)] sono ancora heap. Dobbiamo scrivere una procedura che permuti gli elementi A[1],A[2],,A[heap-size[A]] in modo da ricostruire uno heap. Heapify(A,i) l left(i) r right(i) If (l heapsize(a)) and (A[l] > A[i]) then largest l else largest i If (r heapsize(a) )and(a[r] > A[largest]) then largest r If (largest i) then scambia(a[i], A[largest]) Heapify(A, largest)
Heapify function A = heapify(a,i, heapsize) l = 2*i; r = 2*i+1; A = a; if l<=heapsize && A(l) > A(i) largest = l; else largest = i; end if r<=heapsize && A(r) > A(largest) largest = r; end if largest ~= i tmp = A(i); A(i)=A(largest); A(largest) = tmp; A = heapify(a,largest,heapsize); end end
Buildheap La procedura Heapify può essere usata in modo bottom-up per convertire un vettore A[1 n], in uno heap di lunghezza n. Build-heap(A) heapsize(a) lenght(a) for i lenght[a]/2 down to 1 do Heapify(A,i) Complessità - Numero di nodi ad altezza h al più ceil(n/2^(h+1)) (si prova per induzione) - Altezza di uno heap con n elementi floor(log 2 n) log(n) T (n) h=0 h n 2 (h +1) n h=0 h 2 (h +1) n h=0 h 2 (h) 2 n O(n) h=0 h x h = x 1 x 2
Buildheap function A = buildheap(a) n = numel(a); A = a; for i = floor(n/2):-1:1 A=heapify(A,i,n); end end
Heapsort Heapsort(A) Build-heap(A) For i = length(a) down to 2 do scambia(a[1],a[i]) Heapsize(A) = Heapsize(A)-1 Heapify(A,1) O(n) O(n) O(n)*1 O(n)*1 O(n)*O(log(n)) Tempo di esecuzione : O(n log(n)) Ordinamento in loco
Heapsort function A = heapsort(a) A = buildheap(a); n = numel(a); heapsize = n; for i = n:-1:2 tmp = A(i); A(i)=A(1); A(1) = tmp; heapsize = heapsize - 1; A=heapify(A,1,heapsize); end end
Esercizi Scrivere una funzione MATLAB che prende in input una matrice e stampa sullo stesso grafico i valori ordinati di ogni riga della matrice (fatelo per dimensioni ridotte) Scrivere uno script che legge dal file dati.txt una matrice e ne stampa (sovrapposti) i vettori delle medie e delle deviazioni standard di ogni colonna Scrivere una funzione che prende in input un vettore e stampa sullo stesso grafico ma in sottosezioni diverse le funzioni fattoriale ed esponenziale
Esercizi Scrivere un script MATLAB che generi casualmente 100 vettori di 1000 interi compresi tra 1 e 1000000, ordini i vettori con gli algoritmi Heapsort, Insertion Sort e Selection Sort (minsort), e stampi sullo stesso grafico i tempi di esecuzione di ciascun algoritmo su ogni vettore in input con tre colori differenti, tre simboli e tre linee differenti. Adattare l'algoritmo HeapSort in modo da lavorare su vettori di stringhe (suggerimento:usare array di cell per rappresentare tutte le stringhe).