2015-12-14 14 views
5

chức năng của tôi là tỷ lệ = tỷ lệ (x, y, z) và tỷ lệ là mảng đa chiều như một tạo của cầu 4x4x4Làm thế nào để vẽ mảng đa chiều với ba biến

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 

và cũng x, là (1x4) vectơ y và z. Làm thế nào tôi có thể vẽ bản đồ đường viền trong một hệ thống khối như có thể thấy trong hình?

plot

+1

Có lẽ nhìn vào 'slice'? – David

+0

có một cái nhìn ở đây: https: // stackoverflow.com/questions/27659632/reconstructing-ba-dimension-image-matlab/27660039 # 27660039 –

+0

Các điểm trong x, y và kích thước có cân bằng trong trường hợp của bạn không? Nếu x, y và z của bạn chỉ có 4 giá trị, khối kết quả sẽ không được mịn như trong hình trên. Các vectơ quá ngắn? – Anton

Trả lời

2

Nếu dữ liệu của bạn có độ phân giải tốt hơn, cách dễ nhất là sử dụng phân tán3. Ví dụ:

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

Hình ảnh kết quả trông khá giống với khối lập phương trong câu hỏi của bạn. Thật không may phải mất nhiều thời gian để vẽ cốt truyện.

enter image description here

Trong trường hợp của bạn tôi sẽ thêm dữ liệu giả để tăng độ phân giải:

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

Để thay đổi độ phân giải chỉ có giá trị khác nhau cho biến ff.

** CẬP NHẬT **

Để tối ưu hóa hiệu suất và tránh tính toán unuseful, bạn thực sự có thể sử dụng lát. Đối với kích thước lớn nó hoạt động thực sự mát mẻ:

[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

Nhưng trong trường hợp của bạn khối lập phương sẽ trông như thế này:

enter image description here

Điều này là do các dữ liệu trong các nút lưới và không phải trên khuôn mặt ở giữa. Để có được kết quả tốt hơn, bạn cần thao tác đầu vào một chút. Bạn có thể thêm một hàng nữa vào mỗi thứ nguyên của tỷ lệ và thay đổi trục X, Y, Z để có thể cắt khối lập phương dọc theo các hàng dữ liệu. Có một cái nhìn lúc này:

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; 

Bạn sẽ nhận được sau đó kết quả này:

enter image description here

+0

Anton nó rất hữu ích cảm ơn bạn. Tôi muốn hỏi câu hỏi cuối cùng cho trường hợp của tôi. Tôi phải đặt kích thước x, y và z của mình ở đâu trong mã này? 'tỷ lệ = tỷ lệ (x, y, z)' 'x = [0.1 0.2 0.3 0.4]' 'y = [0.2 0.4 0.6 0.8]' 'z = [0.05 0.1 0.15 0.2]' – CanYusuf

+0

Hi CanYusuf, kiểm tra giải pháp mới trong bản cập nhật – Anton

+0

Cảm ơn Anton, nó rất hữu ích cho tôi. – CanYusuf

Các vấn đề liên quan