我在圆柱形网格上输入数据,并希望在MATLAB中使用slice
绘制它们。为此,我首先使用pol2cart
将参考坐标转换为笛卡尔坐标。
r = linspace(1,4,4);
phi = linspace(0,2*pi,10);
z = linspace(1,3,3);
[rmesh,phimesh,zmesh]=meshgrid(r,phi,z)
[xmesh,ymesh,zmesh]=pol2cart(phimesh,rmesh,zmesh)
当我现在使用slice
(例如slice(xmesh,ymesh,zmesh,ones(10,4,3),2,2,2)
)抛出错误,因为坐标矩阵没有正确排序(Input grid is not a valid MESHGRID.
)
如何修改矩阵以获得可绘图的结果?
遗憾的是,您不能将柱面坐标给出的数据用于slice。
取自matlab文档:
slice(X,Y,Z,V,sx,sy,sz) draws slices of the volume V. X, Y, and Z are three-dimensional arrays specifying the coordinates for V.
X, Y, and Z must be monotonic and orthogonally spaced (as if produced by the function meshgrid).
你能做的就是使用griddata
。
下面是一个例子:
r = linspace(1,4,4);
phi = linspace(0,2*pi,10);
z = linspace(1,3,3);
data = repmat(linspace(1,0,4),[10,1,3]);
[rmesh,phimesh,zmesh]=meshgrid(r,phi,z);
[xmesh,ymesh,zmesh]=pol2cart(phimesh,rmesh,zmesh);
[xg, yg, zg] = meshgrid(linspace(-4,4,50),linspace(-4,4,50),linspace(1,3,3));
gdata = griddata(xmesh,ymesh,zmesh,data,xg,yg,zg);
slice(xg,yg,zg,gdata,2,2,2)
根据您拥有的数据类型以及不显示"越界"数据的重要性(意思是,按照您的示例:半径小于1或大于4),您可以添加以下内容来隐藏超出您感兴趣领域的数据:
rg = sqrt(xg.^2+yg.^2);
gdataNaN = gdata;
gdataNaN(rg<min(r)) = NaN;
gdataNaN(rg>max(r)) = NaN;
figure
slice(xg,yg,zg,gdataNaN,2,2,2)
如果这还不够,您将不得不实现自己的slice
方法(基本上使用griddata方法)或查看matlab中央文件交换。我还没有测试过,但是分析MRI图像的工具可能会奏效(例如,检查这个:http://www.mathworks.com/matlabcentral/fileexchange/27983-3d-slicer)。
编辑:http://www.mathworks.com/matlabcentral/fileexchange/30147-smartslice-and-igslice这似乎是由有同样问题的人开发的
可以在笛卡尔坐标上调用meshgrid吗?
r = linspace(1,4,4);
phi = linspace(0,2*pi,10);
z = linspace(1,3,3);
[x, y] = pol2cart(r,phi);
[xmesh,ymesh,zmesh]=meshgrid(x, y, z);
顺便说一句,有时您可能会发现[ymesh,xmesh,zmesh]=meshgrid(x, y, z);
对您的应用程序更有意义。