Matlab新手,只是粗略看过一遍b站的教程。在使用Matlab的过程中,深感函数使用、编程思维等的困难。感觉还是要加强编程思维的训练比较好。
书归正传,这是我第一次运用Matlab绘制三维图。需要将一组四维数据可视化,其中前三维是xyz坐标,第四维是在该点上的数值大小, 用颜色来表示。曾在网络上查找了很久,都没找到合适的模板,最后自己动脑写了一个。
输入数据是:柱坐标下的(ia,ir,iz)上的数值A_xyz。在Matlab中需要:
1读入数据A_xyz;
2.将用网格划分的柱坐标换算成用网格划分的笛卡尔坐标;
3.可视化思维数据。
程序的中心是scatter3函数。
clear
clc;
%网格参数
g_z = 50;
g_a = 50;
g_r = 50;
dz = 0.01;
dr = 0.01;
%读取A_xyz
fid = fopen('*****0828.mco','r');
A = fscanf(fid,'%e',g_z*g_r*g_a);
A_xyz = log10(A);%为了视觉效果进行的处理
%划分网格
A_0 = linspace(pi/(g_a*2),pi/2,g_a);
R_0 = linspace(dr,dr*g_r,g_r);
Z0 = linspace(dz,dz*g_z,g_z);
%[X0,Y0]=pol2cart(A_0,R_0);
%极直转换,但因为所得参数的物理意义不同于pol2car这种,所以按照物理意义编辑
X=zeros(g_a ,g_r);
Y=zeros(g_a ,g_r);
%一个角度对应50个rho
for m =1:g_a
for n = 1:g_r
X(m,n) = R_0(1,n) * cos(A_0(1,m));
Y(m,n) = R_0(1,n) * sin(A_0(1,m));
end
end
J1=zeros(1,g_z*g_r*g_a);
J2=zeros(1,g_z*g_r*g_a);
J3=zeros(1,g_z*g_r*g_a);
%按输出顺序zra赋值,扩充J组成为1,grid_z*grid_r*grid_a
for i = 0:g_a - 1
for j = 0:g_r - 1
for k = 1:g_z
J1(1,k+g_r*j+g_r*g_a*i) = X(i+1,j+1);%注意此时的赋值
J2(1,k+g_r*j+g_r*g_a*i) = Y(i+1,j+1);
J3(1,k+g_r*j+g_r*g_a*i) = Z0(1,k);%z轴的网格
end
end
end
%画图,(x,y,z)坐标轴,不过下列文本无意义
scatter3(J1,J2,J3,40,A_xyz,'filled')
colorbar
xlabel('X(0.5*PI/na,PI/2;0.01,50)')
ylabel('Y(0.5*PI/na,PI/2;0.01,50)')
zlabel('Z(0.01,40)')
%创建旁边的色卡
cb = colorbar;
cb.Label.String = 'Absorbtion in XYZ(a,r,z)';
最后出现的问题:本次实验的数值极值差过大,导致视觉效果很差。这种可视化方式的缺点很明显。希望能做成切片或者其他形式的图。
——————更新,21/8/30
之前的代码在网格划分时出错了。
我的数据是“a角变化一次,划分的rho变化g_r次”,因此在极直转换中不能直接用pol2cart。用循环赋值,其中的逻辑关系我想了一天多,,,我好菜。希望有这次经验后下次就能做得更好更快了。
从封面图来看,颜色几乎不随z坐标变化。也许是网格划分小而色差大的缘故?不然就是程序又出错了emmmm
——————更新,21/9/01
为了视觉效果更好,进行了一些数值处理
——————更新,22/06/10
J1(1,k+(m-1)*g_x+(i-1)*g_y) = Z(1,k);%6
J2(1,k+(m-1)*g_x+(i-1)*g_y) = X(1,m);%500
J3(1,k+(m-1)*g_x+(i-1)*g_y) = Y(1,i);%6*500
A0(1,k+(m-1)*g_x+(i-1)*g_y) = A(k,m,i);
用来处理大数据图像(图像拼接)时做的一些改进,虽然还是转python了