2015-12-14 9 views
5

mia funzione è ratio = rapporto (x, y, z) e il rapporto è array multidimensionale come 4x4x4Come per tracciare un array multidimensionale con tre variabile

val (:,:, 1) =

0.0378 0.0642 0.0824 0.0973 
0.0480 0.0770 0.0980 0.1142 
0.0541 0.0845 0.1068 0.1236 
0.0574 0.0899 0.1128 0.1311 

val (:,:, 2) =

0.0392 0.0750 0.1041 0.1277 
0.0520 0.0953 0.1277 0.1541 
0.0601 0.1068 0.1412 0.1689 
0.0655 0.1142 0.1500 0.1791 

val (:,:, 3) =

val (:,:, 4) =

0.0392 0.0770 0.1155 0.1493 
0.0520 0.1034 0.1500 0.1899 
0.0608 0.1196 0.1703 0.2122 
0.0669 0.1304 0.1831 0.2270 

E anche x, sono vettori yez (1x4). Come posso tracciare la mappa del contorno in un sistema cubico come si può vedere in figura?

plot

+1

Forse un'occhiata a 'slice'? – David

+0

dai un'occhiata qui: https: // StackOverflow.it/questions/27659632/recostructing-three-dimensions-image-matlab/27660039 # 27660039 –

+0

I punti in x, ye le dimensioni sono equidistanti nel tuo caso? Se x, yez hanno solo 4 valori, il cubo risultante non sarà così liscio come nella figura sopra. I vettori sono così brevi? – Anton

risposta

2

Se i dati hanno una migliore risoluzione, il modo più semplice sarebbe quella di utilizzare scatter3. Ad esempio:

[xx, yy, zz] = meshgrid(1:0.1:10); 
vv = cos(xx).*sin(yy).*sin(zz).^2; 

scatter3(xx(:),yy(:),zz(:),5,vv(:)); 

colormap(jet); 
colorbar; 

L'immagine risultante è simile al cubo nella domanda. Sfortunatamente ci vuole molto tempo per rendere la trama.

enter image description here

Nel tuo caso vorrei aggiungere dati falsi per aumentare la risoluzione:

val1 = [0.0378 0.0642 0.0824 0.0973; 
0.0480 0.0770 0.0980 0.1142; 
0.0541 0.0845 0.1068 0.1236; 
0.0574 0.0899 0.1128 0.1311]; 

val2 = [0.0392 0.0750 0.1041 0.1277; 
0.0520 0.0953 0.1277 0.1541; 
0.0601 0.1068 0.1412 0.1689; 
0.0655 0.1142 0.1500 0.1791]; 

val3 = [0.0392 0.0770 0.1122 0.1426; 
0.0520 0.1014 0.1426 0.1764; 
0.0608 0.1155 0.1595 0.1953; 
0.0669 0.1257 0.1709 0.2081]; 

val4 = [0.0392 0.0770 0.1155 0.1493; 
0.0520 0.1034 0.1500 0.1899; 
0.0608 0.1196 0.1703 0.2122; 
0.0669 0.1304 0.1831 0.2270]; 

[x, y, z] = meshgrid(1:4); 

ratio = zeros(4, 4, 4); 
ratio(:,:,1) = val1; 
ratio(:,:,2) = val2; 
ratio(:,:,3) = val3; 
ratio(:,:,4) = val4; 

ff = 25; 
[xx, yy, zz] = meshgrid(1/ff:1/ff:4); 
ratio_scaled = zeros(ff*4, ff*4, ff*4); 

for xi=1:4 
    for yi=1:4 
     for zi=1:4 
      ratio_scaled((xi - 1)*ff + 1 : xi*ff, (yi - 1)*ff + 1 : yi*ff, (zi - 1)*ff + 1 : zi*ff) = ratio(xi, yi, zi); 
     end 
    end 
end 

scatter3(xx(:),yy(:),zz(:),5,ratio_scaled(:)); 

colormap(jet); 
colorbar; 

enter image description here

Al fine di modificare la risoluzione basta prendere diversi valori per la variabile e segg.

** UPDATE **

Al fine di ottimizzare le prestazioni ed evitare calcoli inutili, è possibile infatti utilizzare fette. Per le grandi dimensioni funziona davvero cool:

[xx, yy, zz] = meshgrid(1:0.05:10); 
vv = cos(xx).*sin(yy).*sin(zz).^2; 

xslice = [1, 10]; 
yslice = [1, 10]; 
zslice = [1, 10]; 

h = slice(xx,yy,zz,vv,xslice,yslice, zslice); 
set(h, 'EdgeColor', 'none'); 
axis vis3d; 

box on; 

colormap(jet); 
colorbar; 

enter image description here

Ma nel tuo caso il cubo sarà simile a questa:

enter image description here

Questo perché i dati sono nei nodi di rete e non sulle facce in mezzo. Per ottenere un risultato migliore è necessario modificare un po 'l'input. È possibile aggiungere un'altra riga in ogni dimensione del rapporto e modificare l'asse X, Y, Z per poter tagliare il cubo lungo le righe di dati. Date un'occhiata a questo:

ratio = zeros(4, 4, 4); 

ratio(:,:,1) = [0.0378 0.0642 0.0824 0.0973; 
0.0480 0.0770 0.0980 0.1142; 
0.0541 0.0845 0.1068 0.1236; 
0.0574 0.0899 0.1128 0.1311]; 

ratio(:,:,2) = [0.0392 0.0750 0.1041 0.1277; 
0.0520 0.0953 0.1277 0.1541; 
0.0601 0.1068 0.1412 0.1689; 
0.0655 0.1142 0.1500 0.1791]; 

ratio(:,:,3) = [0.0392 0.0770 0.1122 0.1426; 
0.0520 0.1014 0.1426 0.1764; 
0.0608 0.1155 0.1595 0.1953; 
0.0669 0.1257 0.1709 0.2081]; 

ratio(:,:,4) = [0.0392 0.0770 0.1155 0.1493; 
0.0520 0.1034 0.1500 0.1899; 
0.0608 0.1196 0.1703 0.2122; 
0.0669 0.1304 0.1831 0.2270]; 

%define limits of the axis 
x_min = 0.1; x_max = 0.4; 
y_min = 0.2; y_max = 0.8; 
z_min = 0.05;z_max = 0.2; 

%calculate the grid step 
x_step = (x_max - x_min)/(4-1); 
y_step = (y_max - y_min)/(4-1); 
z_step = (z_max - z_min)/(4-1); 

%define the mesh 
[xx, yy, zz] = meshgrid(x_min-x_step/2 : x_step : x_max+x_step/2, y_min-y_step/2 : y_step : y_max+y_step/2, z_min-z_step/2 : z_step : z_max+z_step/2); 

%extend all 3 dimensions of the ratio by one new row 
ratio(end+1, :, :) = ratio(end, :, :); 
ratio(:, end+1, :) = ratio(:, end, :); 
ratio(:, :, end+1) = ratio(:, :, end); 

%define the cutting slices 
xslice = [x_min-x_step/2, x_max+x_step/2]; 
yslice = [y_min-y_step/2, y_max+y_step/2]; 
zslice = [z_min-z_step/2, z_max+z_step/2]; 

h = slice(xx,yy,zz,ratio,xslice,yslice, zslice); 
%fix the axis 
axis([x_min-x_step/2 x_max+x_step/2 y_min-y_step/2 y_max+y_step/2 z_min-z_step/2 z_max+z_step/2]); 
%use EdgeColor to show/hide the edges 
%set(h, 'EdgeColor', 'none'); 

%hide all Ticks that you do not need 
set(gca, 'XTick', (x_min:x_step:x_max)); 
set(gca, 'YTick', (y_min:y_step:y_max)); 
set(gca, 'ZTick', (z_min:z_step:z_max)); 

%define the colormap 
colormap(jet); 
colorbar; 

Otterrete quindi questo risultato:

enter image description here

+0

Anton è molto utile grazie. Voglio fare l'ultima domanda per il mio caso. Dove devo inserire le mie dimensioni x, ye in questo codice? 'rapporto = rapporto (x, y, z)' 'x = [0,1 0,2,3 0,4]' 'y = [0,2 0,4 0,6 0,8]' 'z = [0,05 0,1 0,15 0,2]' – CanYusuf

+0

Ciao CanYusuf, controllare il nuova soluzione nell'aggiornamento – Anton

+0

Grazie Anton, è molto utile per me. – CanYusuf

Problemi correlati