Mastering Matlab - Dipartimento di Matematica
Transcript
Mastering Matlab - Dipartimento di Matematica
Mastering Matlab Grafici 3D e altre strutture Mastering Matlab C. Guerrini 1 Grafici di superfici Esempio: consideriamo la funzione f(x,y) = (1-y)cos(x^2)+(x-1)cos(y^2) Nel dominio -1<x<2; -2<y<2. Occorre innanzitutto costruire una griglia di valori (x,y) nei quali valuteremo la funzione f(x,y) n=31;m=31; x=linspace(-2,2,n); y=linspace(-2,2,m); [X,Y]=meshgrid(x,y); Z=(1-Y).*cos(X.^2)+(X1).*cos(Y.^2); subplot(1,2,1),mesh(X,Y,Z); xlabel('x'),ylabel('y');zlabel('z') subplot(1,2,2),contour(X,Y,Z) xlabel('curve di livello') Mastering Matlab La funzione principale è: mesh(Matrice1,Matrice2,Matrice3) dove Matrice1 e Matrice2 sono matrici quadrate costruite a partire dai vettori x e y, mentre Matrice3 è una matrice quadrata tale che l’elemento(i,j) e’ dato da f(x(i),y(j)) ; se non si varia la mappa dei colori i picchi vengono colorati in rosso le valli in blu C. Guerrini 2 1 Mastering Matlab >> subplot(1,2,1),surfl(X,Y,Z) >> subplot(1,2,1),surf(X,Y,Z) >> subplot(1,2,2),surfl(X,Y,Z) >> shading interp >> colormap(pink) Mastering Matlab C. Guerrini 3 Il comando surfl permette di abbinare l’ombreggiatura Immaginando di illuminare la superficie con la luce da un dato punto di vista, è anche possibile agire sull’ombreggiatura shading e la mappa dei colori colormap C. Guerrini 4 2 view - cambia l’orientamento del grafico colormap - cambia tavolozza dei colori shading - cambia l’ombreggiatura del grafico mesh - disegna un grafico a griglia contour - disegna un grafico a curve di livello contourf - disegna un grafico a curve di livello riempite surf - disegna un grafico di superficie surfl - disegna un grafico di superficie con ombreggiatura plot3 - disegna punti e linee nello spazio 3D pcolor - disegna una scacchiera colorando le caselle Mastering Matlab C. Guerrini >> Z=X.^2+Y.^2; >> pcolor(X,Y,z) >> shading interp >> Z=X.^2+Y.^2; >> pcolor(X,Y,z) Mastering Matlab 5 C. Guerrini 6 3 Cell Arrays e Structures Permettono il raggruppamento di tipi di dati diversi, ma in relazione fra loro in una sola variabile, favorendo il data-management, sono in pratica dei contenitori per vari tipi di dati per cui le operazioni matematiche non sono definite. Per eseguire operazioni matematiche occorre indirizzare direttamente il contenuto. Mastering Matlab C. Guerrini 7 cell-array per immaginarlo dobbiamo pensare a una collezione di post-office-boxes. I contenuti di ciascuna box sono differenti. Quando si invia una mail a una casella di posta, questa viene identificata da un numero e similmente quando si vuol immettere un data in un cell-array particolare si deve identificare il numero di cella in cui lo si vuol mettere. In modo analogo quando si vuole estrarre un dato da un cellarray occorre identificare da quale numero di cella lo si vuol prendere. structures sono molto simili ai cell-array eccetto che le singole box non sono identificate da numeri, ma da nomi. Mastering Matlab C. Guerrini 8 4 Cell Array Esempio: per creare un cell-array A 2-per -2 A = {[1 4 3; 0 5 8; 7 2 9], 'Anne Smith'; 3+7i, -pi:pi/4:pi}; Si ottiene il seguente schema: Cell 1,1 Cell 1,2 Si puo creare un cell array , una cella alla volta “Anne Smith” A(1,1) = {[1 4 3; 0 5 8; 7 2 9]}; 143 058 729 A(1,2) = {'Anne Smith'}; Cell 2,1 Cell 2,2 A(2,1) = {3+7i}; 3+7i Mastering Matlab [-3.14…………3.14] A(2,2) = {-pi:pi/4:pi}; C. Guerrini 9 Cell Array Se si assegna un dato a una cella che è fuori dalle dimensioni dell’array corrente, MATLAB espande automaticamente l’array per includere l’indice specificato: A(3,3) = {5}; Mastering Matlab Cell 1,1 Cell 1,2 Cell 1,3 143 058 729 “Anne Smith” [] Cell 2,1 Cell 2,2 Cell 2,3 3+7i [3.14…………3 .14] Cell 3,2 Cell 3,2 [] [] C. Guerrini [] Cell 3,3 5 10 5 Esempio: 1) vengono create 3 3-row cell arrays di differenti dimensioni C1, C2 e C3 C1 = {'Jan' 'Feb'; '10' '17'; uint16(2004) uint16(2001)}; C2 = {'Mar' 'Apr' 'May'; '31' '2' '10'; ... uint16(2006) uint16(2005) uint16(1994)}; C3 = {'Jun'; '23'; uint16(2002)}; C1 C2 C3 'Jan‘ 'Feb‘ 'Mar' 'Apr' 'May' 'Jun' '10‘ '17' '31' '2' '10‘ '23' [2004] [2001] [2006] [2005] [1994] [2002] Ora usiamo le parentesi graffe per concatenare interamente le cell arrays costruendo un cell-array 1 x 3 dai 3 array iniziali. Ciascuna cella di questa nuovo array occupa il proprio cell-array C4 = {C1 C2 C3} C4 = {3x2 cell} {3x3 cell} {3x1 cell} Mastering Matlab C. Guerrini 11 Ora invece usiamo le parentesi quadre sulla stessa combinazione di cell –arrays In questo caso Matlab concatena i contenuti delle celle insieme e produce un 3 x 6 cell-array C5=[C1 C2 C3] C5= Jan‘ '10‘ [2004] Mastering Matlab 'Feb‘ '17‘ [2001] 'Mar‘ '31‘ [2006] C. Guerrini 'Apr‘ '2‘ [2005] 'May‘ '10‘ [1994] 'Jun‘ '23' [2002] 12 6 Costruiamo un elemento per volta del cell-array rand('state', 0); numArray = rand(3,5)*20; chArray = ['Ann Lane'; 'John Doe'; 'Al Smith']; cellArray = {1 4 3 9; 0 5 8 2; 7 2 9 2; 3 3 1 4}; logArray = numArray > 10; stArray(1).name = chArray(1,:); stArray(2).name = chArray(2,:); stArray(1).billing = 28.50; stArray(2).billing = 139.72; stArray(1).test = numArray(1,:); stArray(2).test = numArray(2,:); Poi costruiamo il cell-array da queste componenti usando l’operatore { } : A = {numArray, pi, stArray; chArray, cellArray, logArray}; Per vedere l’ampiezza e il tipo di ciascuna componente: A A = [3x5 double] [ 3.1416] [1x2 struct ] [3x8 char ] {4x4 cell} [3x5 logical] Per ispezionare il contenuto di una singola cella A{1,1} ans = 19.0026 9.7196 9.1294 8.8941 18.4363 4.6228 17.8260 0.3701 12.3086 14.7641 12.1369 15.2419 16.4281 15.8387 3.5253 Mastering Matlab C. Guerrini 13 Inizializzazione di un cell-array C >> C(1) = {[1 2 3]}; >> C(2) = {[1 0 1]}; >> C(3) = {1:10}; >> C(4) = {[9 8 7]}; >> C(5) = {3}; >> C C= [1x3 double] [1x3 double] [1x10 double] [1x3 double] [3] Ispeziono il contenuto delle celle 2:4 >> C{2:4} ans = 1 0 1 ans = 1 2 3 4 5 6 7 8 9 ans = 9 8 7 Mastering Matlab Calcolo la convoluzione fra i due array C(1) e C(2) >> d=conv(C{1:2}) d= 1 2 4 2 3 Creo un nuovo array Numerico 10 C. Guerrini >>B = [C{1}; C{2}; C{4}] B= 123 101 987 14 7 Passaggio da cell-array a numeric array e viceversa: F{1,1} = [1 2; 3 4]; F{1,2} = [-1 0; 0 1]; F{2,1} = [7 8; 4 1]; F{2,2} = [4i 3+2i; 1-8i 5]; Ora si usano 3 loop per coppiare F nell’array numerico NUM: for k = 1:4 for m = 1:2 for n = 1:2 NUM(m,n,k) = F{k}(m,n); end end end In modo analogo usiamo un for-loop per assegnare il valore di un array numerico alla singola cella di un cell array: G = cell(1,16); for m = 1:16 G{m} = NUM(m); end Mastering Matlab C. Guerrini 15 Nidificazione di cell-array Costruzione di cell-array nidificate utilizzando le parentesi { }: >> A(1,1) = {magic(5)}; >> A(1,2) = {{[5 2 8; 7 3 0; 6 7 3] … 'Test 1'; [2-4i 5+7i] {17 []}}}; Costruzione di cell-array nidificate con il comando cell: >> A = cell(1,2); % crea un cell-array 1 x2 vuota >> A(1,2) = {cell(2,2)}; % crea un cell-array 2x2 % entro A(1,2) Mastering Matlab C. Guerrini A viene riempita mediante assegnazione A(1,1) = {magic(5)}; A{1,2}(1,1) = {[5 2 8; 7 3 0; 6 7 3]}; A{1,2}(1,2) = {'Test 1'}; A{1,2}(2,1) = {[2-4i 5+7i]}; A{1,2}(2,2) = {cell(1, 2)} A{1,2}{2,2}(1) = {17}; 16 8 Structures 1. patient.name = 'John Doe'; patient.billing = 127.00; patient.test = [79 75 73; 180 178 177.5; 220 210 205]; Le strutture sono simili ai cell_array nel senso che permettono di raggruppare collezioni di dati dissimili in un’unica variabile. Invece di essere indirizzati con numeri sono indirizzati con nomi chiamati “fields” e invece delle parentesi graffe si usa la notazione con il punto: 2. patient(2).name = 'Ann Lane'; patient(2).billing = 28.50; patient(2).test = [68 70 68; 118 118 119; 172 170 169]; >>patient patient = 1x2 struct array with fields: name billing test >> patient Name: 'John Doe' Billing: 127 Test: [3 x3 duble] >>patient(3).name = 'Alan Johnson' expands the patient array to size [1 3]. Now both patient(3).billing and patient(3).test contain empty matrices Mastering Matlab C. Guerrini 17 Manipolazione structure-array Per reperire le informazioni memorizzate in questa struttura devo considerare sia l’indice la notazione . >>test2b = patient(3).test(2,2) >>str = patient(2).name str = Ann Lane reperire dati patient(3).test(2,2) = 7; assegno un nuovo valore >>bills = [patient.billing] bills = 127.0000 28.5000 504.7000 Mastering Matlab C. Guerrini test2b = 153 >> mean((patient(3).test)') ans = 80.0000 153.3333 184.3333 18 9 % test tossicologici dell'acqua % dati raccolti % di piombo, mercurio e cromo test(1).lead = .007; test(2).lead = .031; test(3).lead = .019; test(4).lead = .015; test(5).lead = 0.025; test(6).lead = 0.12; test(1).mercury = .0021; test(2).mercury = .0009; test(3).mercury = .0013; test(4).mercury = .0031; test(5).mercury = .0017; test(6).mercury = .0025; test(1).chromium test(2).chromium test(3).chromium test(4).chromium test(5).chromium test(6).chromium = .025; = .017; = .10; = .030; = .021; = .11; Mastering Matlab function [r1, r2] = concen(toxtest); % Create two vectors: % r1 contains the ratio of mercury to lead at % each observation. % r2 contains the ratio of lead to chromium. r1 = [toxtest.mercury] ./ [toxtest.lead]; r2 = [toxtest.lead] ./ [toxtest.chromium]; % Plot the concentrations of lead, mercury, % and chromium % on the same plot, using different colors for each. lead = [toxtest.lead]; mercury = [toxtest.mercury]; chromium = [toxtest.chromium]; plot(lead, 'r','linewidth',2); hold on plot(mercury, 'b','linewidth',3) plot(chromium, 'y','linewidth',3); hold off C. Guerrini Cell Array e Structures 19 Inizializzazione di un cell array una cella per volta e visualizzazione del suo formato >> rand('state', 0); numArray = rand(3,5)*20; chArray = ['Ann Lane'; 'John Doe'; 'Al Smith']; cellArray = {1 4 3 9; 0 5 8 2; 7 2 9 2; 3 3 1 4}; logArray = numArray > 10; stArray(1).name = chArray(1,:); stArray(2).name = chArray(2,:); stArray(1).billing = 28.50; stArray(2).billing = 139.72; stArray(1).test = numArray(1,:); stArray(2).test = numArray(2,:); >> A = {numArray, pi, stArray; chArray, cellArray, logArray}; >> cellplot(A) Mastering Matlab C. Guerrini 20 10 Mastering Matlab C. Guerrini 21 Il modo di organizzare i dati in un structure-array dipende da come si vuole accedere ai dati. Per esempio consideriamo tre array contenenti una immagine 128x128 RGB (RED-GREEN-BLUE) Mastering Matlab C. Guerrini 22 11 A.r = RED; A.g = GREEN; A.b = BLUE; Mastering Matlab C. Guerrini for m = 1:size(RED,1) for n = 1:size(RED,2) B(m,n).r = RED(m,n); B(m,n).g = GREEN(m,n); B(m,n).b = BLUE(m,n); end end 23 Si puo usare il cell-array per memorizzare gruppi di strutture con differenti architetture Cell 1 di cStr contiene una struttura con 2 campi: il primo una stringa il secondo un vettore Cell 2 contiene una struttura con tre campi vettore Mastering Matlab C. Guerrini 24 12 Strutture nidificate Mastering Matlab C. Guerrini 25 Function per lavorare con cell array Mastering Matlab C. Guerrini 26 13 Function per lavorare con le structures Mastering Matlab C. Guerrini 27 Lettura di un file qcif % qcif_read clear all;close all; % parameters filename='suzie.qcif'; frames=150; col=176; row=144; UV_ratio=2; UV_col=col/UV_ratio; UV_row=row/UV_ratio; Y=zeros(row,col,frames); % open file Y_size=col*row; U_size=UV_col*UV_row; V_size=UV_col*UV_row; buffer_size=Y_size+U_size+V_size; [fid,message]=fopen(filename,'r'); for ith_frame=1:1:frames [raw_YUV,count]=fread(fid,buffer_size,'uint8'); temp_Y_frame=reshape(uint8(raw_YUV(1:Y_size)),[col row])'; temp_U_frame=reshape(uint8(raw_YUV(Y_size+1:Y_size+U_size)),[UV_col UV_row])'; temp_V_frame=reshape(uint8(raw_YUV(Y_size+U_size+1:Y_size+U_size+V_size)),[UV_col UV_row])'; subplot(3,1,1); imshow(temp_Y_frame,[0 255]); title('Y'); subplot(3,1,2); imshow(temp_U_frame,[0 255]); title('U'); subplot(3,1,3); imshow(temp_V_frame,[0 255]); title('V'); xlabel(strcat(num2str(ith_frame),'th frame. Press any key to show next')); Y(:,:,ith_frame)=temp_Y_frame; pause end status=fclose(fid); Mastering Matlab C. Guerrini 28 14 Utilizzate il sito Stanford Center for Image Systems Engineering http://scien.stanford.edu/labsite/scien_test_images_videos.php Per recuperare un video-sequence memorizzato in formato raw Concatenato con UV componenti sottocampionate (formato qcif) (utilizza la function qcif_read.m) Esercizio sull’uso delle strutture leggere un filmato qcif scritto in formato YUV E convertirlo in RGB Utilizzando la tabella di conversione che puoi trovare in internet per esempio in http://www.fourcc.org/fccyvrgb.php Costruisci un video a colori. Mastering Matlab C. Guerrini 29 Creazione di un filmato % prova movieric.m % Record the movie [m,n,mz]=size(Y); for j = 1:mz imshow(uint8(Y(:,:,j)),[]); F(j) = getframe; end % Play the movie two times movie(F,2) Mastering Matlab C. Guerrini 30 15 Creazione di un movie da immagini tif %% crea un movie leggendo delle immagini tif % presenti nel toobox image/imdemos fileFolder = fullfile(matlabroot,'toolbox','images','imdemos'); dirOutput = dir(fullfile(fileFolder,'AT3_1m4_*.tif')); fileNames = {dirOutput.name}' [m,n]=size(fileNames); for i=1:m simage(:,:,i)=imread(fileNames{i} ); end %% Record the movie for j = 1:m imshow(simage(:,:,j)) F(j) = getframe; end [h, w, p] = size(F(1).cdata); % use 1st frame to get dimensions hf = figure; %% resize figure based on frame's w x h, and place at (150, 150) set(hf, 'position', [150 150 w h]); axis off %% tell movie command to place frames at bottom left movie(hf,F,10,30,[0 0 0 0]); Mastering Matlab C. Guerrini 31 16