mastering matlab - dipartimento di matematicaguerrini/html/an_09_10/mastering_matlab.pdf3 mastering...
Post on 20-May-2018
234 Views
Preview:
TRANSCRIPT
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
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
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
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.
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
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]
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
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};
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
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
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)
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
13
Mastering Matlab C. Guerrini 25
Strutture nidificate
Mastering Matlab C. Guerrini 26
Function per lavorare con cell array
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);
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)
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]);
top related