问题:现在有一个三维数组(100*100*20),数组的第一列数据与x轴对应,第二列数据与y轴对应,第三列数据与z轴对应。求(Xi,Yi,Zi)(有很多个点)落在由这个三维数组确定的各个小立方区域的频数。详细说明:若坐标轴划分的网格区域x=[1:1:100],y=[1:1:100],z=[1:1:20]是以1为间隔的小立方体,(x1,y1,z1)=(2.5,2.3,1.2),则该点落在[2 2 3 3 1 2]的矩形框内;求这1000个点落在各个小矩形框内的频数.
% 随机数据 [xi,yi,zi] 正态分布产生随机数
xi = 10+2*randn(10000,1);
yi = 10+5*randn(10000,1);
zi = 15+5*randn(10000,1);
% x,y,z 方向上的格数
nx=10; ny=15; nz=10;
% 范围
x_min=5; x_max=15;
y_min=0; y_max=20;
z_min=0; z_max=30;
% 步长
dx = (x_max-x_min)/nx;
dy = (y_max-y_min)/ny;
dz = (z_max-z_min)/nz;
isout= ... % 范围之外的
xi<=x_min | xi>x_max | ...
yi<=y_min | yi>y_max | ...
zi<=z_min | zi>z_max;
% 删除范围外的点
xi(isout)=[]; yi(isout)=[]; zi(isout)=[];
% x,y,z 方向上的格位,ceil是朝正无穷大四舍五入
xi = ceil((xi-x_min)/dx);
yi = ceil((yi-y_min)/dy);
zi = ceil((zi-z_min)/dz);
% 计数
counts=accumarray([xi,yi,zi],1,[nx,ny,nz],@sum,0);
set(gca,'nextplot','replacechild')
axis([1,ny,1,nx,1,nz])
daspect([1,1,1])
colormap hsv
dt=10/nz; % 大约 10s 显示完
for ind = 1:nz % z 方向
slice(counts,[],[],ind)
pause(dt)
end
dt=10/nx; % 大约 10s 显示完
for ind = 1:nx % y 方向
slice(counts,[],ind,[])
pause(dt)
end
dt=10/ny; % 大约 10s 显示完
for ind = 1:ny % x 方向
slice(counts,ind,[],[])
pause(dt)
end