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