1

我在圆柱网格上输入了数据,并希望slice在 MATLAB 中使用它们来绘制它们。为此,我首先使用 . 将参考坐标转换为笛卡尔坐标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.

如何修改矩阵以获得可绘制的结果?

4

2 回答 2

2

遗憾的是,您不能将柱坐标中给出的数据用于切片。

来自 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 这似乎是由有同样问题的人开发的。

于 2013-01-14T13:22:57.720 回答
0

你可以在笛卡尔坐标上调用 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);对您的应用程序更有意义。

于 2013-01-14T10:41:03.780 回答