16
1 Mastering Matlab C. Guerrini 1 Mastering Matlab Grafici 3D e altre strutture Mastering Matlab C. Guerrini 2 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)+(X- 1).*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') 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

Mastering Matlab - Dipartimento di Matematicaguerrini/html/an_09_10/Mastering_Matlab.pdf3 Mastering Matlab C. Guerrini 5 view - cambia l’orientamento del grafico colormap - cambia

Embed Size (px)

Citation preview

Page 1: Mastering Matlab - Dipartimento di Matematicaguerrini/html/an_09_10/Mastering_Matlab.pdf3 Mastering Matlab C. Guerrini 5 view - cambia l’orientamento del grafico colormap - cambia

1

Mastering Matlab C. Guerrini 1

Mastering Matlab

Grafici 3D e altre strutture

Mastering Matlab C. Guerrini 2

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)+(X-1).*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')

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

Page 2: Mastering Matlab - Dipartimento di Matematicaguerrini/html/an_09_10/Mastering_Matlab.pdf3 Mastering Matlab C. Guerrini 5 view - cambia l’orientamento del grafico colormap - cambia

2

Mastering Matlab C. Guerrini 3

Mastering Matlab C. Guerrini 4

>> 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)

Il comando surfl permette di abbinare l’ombreggiaturaImmaginando 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

Page 3: Mastering Matlab - Dipartimento di Matematicaguerrini/html/an_09_10/Mastering_Matlab.pdf3 Mastering Matlab C. Guerrini 5 view - cambia l’orientamento del grafico colormap - cambia

3

Mastering Matlab C. Guerrini 5

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 6

>> Z=X.^2+Y.^2;

>> pcolor(X,Y,z)

>> Z=X.^2+Y.^2;>> pcolor(X,Y,z)>> shading interp

Page 4: Mastering Matlab - Dipartimento di Matematicaguerrini/html/an_09_10/Mastering_Matlab.pdf3 Mastering Matlab C. Guerrini 5 view - cambia l’orientamento del grafico colormap - cambia

4

Mastering Matlab C. Guerrini 7

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 8

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 cell-arrayoccorre 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.

Page 5: Mastering Matlab - Dipartimento di Matematicaguerrini/html/an_09_10/Mastering_Matlab.pdf3 Mastering Matlab C. Guerrini 5 view - cambia l’orientamento del grafico colormap - cambia

5

Mastering Matlab C. Guerrini 9

Cell ArrayEsempio: 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 2,2

[-3.14…………3.14]

Cell 2,1

3+7i

Cell 1,2

“Anne Smith”

Cell 1,11 4 3

0 5 8

7 2 9

Si puo creare un cell array , una cella alla volta

A(1,1) = {[1 4 3; 0 5 8; 7 2 9]};

A(1,2) = {'Anne Smith'};

A(2,1) = {3+7i};

A(2,2) = {-pi:pi/4:pi};

Mastering Matlab C. Guerrini 10

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};

Cell 3,2

[ ]

Cell 2,1

3+7i

Cell 1,1

Cell 3,2

[ ]

Cell 2,2

[-3.14…………3.14]

Cell 1,2

“AnneSmith”

Cell 3,3

5

Cell 2,3

[ ]

Cell 1,3

[ ]

1 4 30 5 87 2 9

Page 6: Mastering Matlab - Dipartimento di Matematicaguerrini/html/an_09_10/Mastering_Matlab.pdf3 Mastering Matlab C. Guerrini 5 view - cambia l’orientamento del grafico colormap - cambia

6

Mastering Matlab C. Guerrini 11

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 arrayscostruendo 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 12

Ora invece usiamo le parentesi quadre sulla stessa combinazione di cell –arraysIn questo caso Matlab concatena i contenuti delle celle insieme e produce un 3 x 6 cell-array

C5=[C1 C2 C3]C5=

Jan‘ 'Feb‘ 'Mar‘ 'Apr‘ 'May‘ 'Jun‘'10‘ '17‘ '31‘ '2‘ '10‘ '23'

[2004] [2001] [2006] [2005] [1994] [2002]

Page 7: Mastering Matlab - Dipartimento di Matematicaguerrini/html/an_09_10/Mastering_Matlab.pdf3 Mastering Matlab C. Guerrini 5 view - cambia l’orientamento del grafico colormap - cambia

7

Mastering Matlab C. Guerrini 13

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:AA = [3x5 double] [ 3.1416] [1x2 struct ]

[3x8 char ] {4x4 cell} [3x5 logical] Per ispezionare il contenuto di una singola cellaA{1,1}ans =

19.0026 9.7196 9.1294 8.8941 18.43634.6228 17.8260 0.3701 12.3086 14.7641

12.1369 15.2419 16.4281 15.8387 3.5253

Mastering Matlab C. Guerrini 14

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};>> CC =

[1x3 double] [1x3 double] [1x10 double] [1x3 double] [3]

Calcolo la convoluzionefra i due arrayC(1) e C(2)

>> d=conv(C{1:2})d =

1 2 4 2 3

Ispeziono il contenuto delle celle 2:4>> C{2:4}ans =

1 0 1ans =

1 2 3 4 5 6 7 8 9 10ans =

9 8 7

Creo un nuovo arrayNumerico

>>B = [C{1}; C{2}; C{4}] B =

1 2 3 1 0 1 9 8 7

Page 8: Mastering Matlab - Dipartimento di Matematicaguerrini/html/an_09_10/Mastering_Matlab.pdf3 Mastering Matlab C. Guerrini 5 view - cambia l’orientamento del grafico colormap - cambia

8

Mastering Matlab C. Guerrini 15

Passaggio da cell-array a numeric arraye 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 16

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 nidificatecon 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)

A viene riempita mediante assegnazioneA(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};

Page 9: Mastering Matlab - Dipartimento di Matematicaguerrini/html/an_09_10/Mastering_Matlab.pdf3 Mastering Matlab C. Guerrini 5 view - cambia l’orientamento del grafico colormap - cambia

9

Mastering Matlab C. Guerrini 17

Structures 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:

1.patient.name = 'John Doe'; patient.billing = 127.00; patient.test = [79 75 73; 180 178 177.5; 220 210 205];

>> patientName: 'John Doe'Billing: 127Test: [3 x3 duble]

2.patient(2).name = 'Ann Lane'; patient(2).billing = 28.50; patient(2).test = [68 70 68; 118 118 119;172 170 169];

>>patientpatient = 1x2 struct array with fields: namebillingtest

>>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 18

Manipolazione structure-array

Per reperire le informazioni memorizzate in questa struttura devo considerare sia l’indicela notazione .

>>str = patient(2).namestr =

Ann Lane

>>test2b = patient(3).test(2,2) test2b =

153

patient(3).test(2,2) = 7;

reperire dati

assegno un nuovo valore

>>bills = [patient.billing] bills =

127.0000 28.5000 504.7000

>> mean((patient(3).test)')ans =

80.0000 153.3333 184.3333

Page 10: Mastering Matlab - Dipartimento di Matematicaguerrini/html/an_09_10/Mastering_Matlab.pdf3 Mastering Matlab C. Guerrini 5 view - cambia l’orientamento del grafico colormap - cambia

10

Mastering Matlab C. Guerrini 19

% 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 = .025;test(2).chromium = .017;test(3).chromium = .10;test(4).chromium = .030;test(5).chromium = .021;test(6).chromium = .11;

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 onplot(mercury, 'b','linewidth',3)plot(chromium, 'y','linewidth',3); hold off

Mastering Matlab C. Guerrini 20

>> 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)

Inizializzazione di un cell array una cella per volta e visualizzazione del suoformato

Cell Array e Structures

Page 11: Mastering Matlab - Dipartimento di Matematicaguerrini/html/an_09_10/Mastering_Matlab.pdf3 Mastering Matlab C. Guerrini 5 view - cambia l’orientamento del grafico colormap - cambia

11

Mastering Matlab C. Guerrini 21

Mastering Matlab C. Guerrini 22

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)

Page 12: Mastering Matlab - Dipartimento di Matematicaguerrini/html/an_09_10/Mastering_Matlab.pdf3 Mastering Matlab C. Guerrini 5 view - cambia l’orientamento del grafico colormap - cambia

12

Mastering Matlab C. Guerrini 23

A.r = RED; A.g = GREEN; A.b = BLUE;

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

Mastering Matlab C. Guerrini 24

Si puo usare il cell-array per memorizzare gruppi di strutture condifferenti architetture

Cell 1 di cStr contiene una struttura con 2 campi: il primo una stringa il secondo un vettoreCell 2 contiene una struttura con tre campi vettore

Page 13: Mastering Matlab - Dipartimento di Matematicaguerrini/html/an_09_10/Mastering_Matlab.pdf3 Mastering Matlab C. Guerrini 5 view - cambia l’orientamento del grafico colormap - cambia

13

Mastering Matlab C. Guerrini 25

Strutture nidificate

Mastering Matlab C. Guerrini 26

Function per lavorare con cell array

Page 14: Mastering Matlab - Dipartimento di Matematicaguerrini/html/an_09_10/Mastering_Matlab.pdf3 Mastering Matlab C. Guerrini 5 view - cambia l’orientamento del grafico colormap - cambia

14

Mastering Matlab C. Guerrini 27

Function per lavorare con le structures

Mastering Matlab C. Guerrini 28

Lettura di un file qcif

% qcif_readclear all;close all;% parametersfilename='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 fileY_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);

Page 15: Mastering Matlab - Dipartimento di Matematicaguerrini/html/an_09_10/Mastering_Matlab.pdf3 Mastering Matlab C. Guerrini 5 view - cambia l’orientamento del grafico colormap - cambia

15

Mastering Matlab C. Guerrini 29

Utilizzate il sito Stanford Center for Image Systems Engineeringhttp://scien.stanford.edu/labsite/scien_test_images_videos.phpPer recuperare un video-sequence memorizzato in formato rawConcatenato con UV componenti sottocampionate (formato qcif)(utilizza la function qcif_read.m)Esercizio sull’uso delle strutture leggere un filmato qcif scritto in formato YUVE convertirlo in RGBUtilizzando la tabella di conversione che puoi trovare in internet per esempio inhttp://www.fourcc.org/fccyvrgb.php

Costruisci un video a colori.

Mastering Matlab C. Guerrini 30

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 timesmovie(F,2)

Page 16: Mastering Matlab - Dipartimento di Matematicaguerrini/html/an_09_10/Mastering_Matlab.pdf3 Mastering Matlab C. Guerrini 5 view - cambia l’orientamento del grafico colormap - cambia

16

Mastering Matlab C. Guerrini 31

Creazione di un movie da immagini tif

%% crea un movie leggendo delle immagini tif% presenti nel toobox image/imdemosfileFolder = fullfile(matlabroot,'toolbox','images','imdemos');

dirOutput = dir(fullfile(fileFolder,'AT3_1m4_*.tif'));fileNames = {dirOutput.name}'[m,n]=size(fileNames);for i=1:msimage(:,:,i)=imread(fileNames{i} );end

%% Record the moviefor j = 1:m

imshow(simage(:,:,j))F(j) = getframe;

end[h, w, p] = size(F(1).cdata); % use 1st frame to get dimensionshf = 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 leftmovie(hf,F,10,30,[0 0 0 0]);