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.
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;
Để 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;
Nhưng trong trường hợp của bạn khối lập phương sẽ trông như thế này:
Đ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:
Có lẽ nhìn vào 'slice'? – David
có một cái nhìn ở đây: https: // stackoverflow.com/questions/27659632/reconstructing-ba-dimension-image-matlab/27660039 # 27660039 –
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