在Matlab中将矩形网格转换为数组

3
我正在使用ndgrid创建一系列矩形网格。例如:
nx = [1 2 3];
ny = [4 5 6];
nz = [7 8 9];

[x_mesh, y_mesh, z_mesh] = ndgrid(nx, ny, nz);

有没有一种简单的方法将矩形网格的坐标转换为NxM数组(在这种情况下是27x3)?结果应该像这样:
[1,4,7;
 1,4,8;
 1,4,9;
 1,5,7;
 1,5,8;
 1,5,9;
 1,6,7;
 1,6,8;
 1,6,9;
 ...
 3,6,7;
 3,6,8;
 3,6,9]

如果可能的话,我想指定在数组中编译坐标的方向。例如,上面的移动沿着z,然后是y,最后是x。如果可以指定按照x,然后是y,最后是z的顺序移动,那就太好了。
1个回答

3
下面的代码为你提供了你所描述的数组。
nx = [1 2 3];
ny = [4 5 6];
nz = [7 8 9];

[x_mesh, y_mesh, z_mesh] = ndgrid(nx, ny, nz);

grid = reshape(permute([x_mesh; y_mesh; z_mesh],[3 2 1]),[],3);

要按照x、y、z的顺序迭代,可以使用以下代码:

for x in ...
for y in ...
for z in ...

grid = [x_mesh(:) y_mesh(:) z_mesh(:)]

一种通用解决方案,可以更直接地控制迭代顺序,如下所示:
order = [1 3 2];
grid = reshape(permute(cat(4,x_mesh,y_mesh,z_mesh),[order 4]),[],3)

这个迭代器首先按照x的顺序进行迭代,然后是z,最后是y。


我正准备回来评论一下排序问题,但是看到你更新了答案。这个解决方案非常好!太棒了! - agf1997
可能值得另外提问,但如果有一系列的值在一个数组中,并且知道它们的顺序,将这些数组值放入网格中的机制是什么?换句话说,在nxnynz不一致时执行相反的操作。 - agf1997
1
我需要考虑通用解决方案,但如果您使用x-y-z顺序(第二个表达式),那么您只需执行x_mesh = reshape(grid(:,1),[numel(nx), numel(ny), numel(nz)]);,并使用来自grid的第2列和第3列类似地为y_meshz_mesh。 如果您不知道nxnynz,则可以使用nx = unique(grid(:,1)); ny = unique(grid(:,2)); nz = unique(grid(:,3));获取它们(可能无序)。 - jodag
啊,是的,明白了。 - agf1997
在我的应用程序中,从gridx_meshy_meshz_mesh,并不是因为我不知道nxnynz,而是在这种情况下,grid代表了依赖变量,因此它们并不适用。 - agf1997

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接