生成方形网格,给出无序的X,Y和Z向量

时间:2009-11-11 14:37:24

标签: matlab

我在Matlab中有三个相同长度的数组,XYZX(i)Y(i)Z(i)形成一对3D坐标。

现在的问题是,如何使用这三个数组生成方形网格,如下所示: alt text http://www.mathworks.com/access/helpdesk/help/techdoc/ref/graphics_m3.gif

我在Matlab文档中从mesh plot获得了图像。显然mesh命令不是我想要的,因为它在Matlab程序中绘制网格本身,而我需要网格元素(以及坐标),以便我可以在其他程序中自己绘制它们,例如C#。

换句话说,我正在寻找数学算法来生成网格,允许mesh命令绘制下面的图形。

编辑:我意识到睡个好觉后我的问题并不清楚。所以这里有更多细节。我使用此命令x生成y[x,y]=meshgrid[rangex, rangy]向量,然后使用函数z(x,y)定义向量z。我必须返回一个方形元素列表(如下图所示)及其对应的xy坐标。所以基本上我只想用这些数据重新绘制下图。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

你基本上有3个矩阵:

% define x_range and y_range as you wish
[x, y] - meshgrid(x_range,y_range)

z = some_function_of_x_and_y

现在你必须将这三个矩阵重塑为行向量:

sizes = size(x)   
x_row = reshape(x, sizes(1) * sizes(2), 1)
y_row = reshape(y, sizes(1) * sizes(2), 1)
z_row = reshape(z, sizes(1) * sizes(2), 1)

和另一个指数:

indeces = [1:length(x_row)]'

现在您的列表是:

result = [indeces x_row y_row z_row]

例如:

x_range = [1,2,3];
y_range = [1,2,3];

>> [x,y] = meshgrid(x_range, y_range)

x =

     1     2     3
     1     2     3
     1     2     3


y =

     1     1     1
     2     2     2
     3     3     3

>> z = x+y

z =

     2     3     4
     3     4     5
     4     5     6

>> x_row = reshape(x, sizes(1) * sizes(2), 1);
>> y_row = reshape(y, sizes(1) * sizes(2), 1);
>> z_row = reshape(z, sizes(1) * sizes(2), 1);

>> indeces = [1:length(x_row)]';

>> result = [indeces x_row y_row z_row]

result =

     1     1     1     2
     2     1     2     3
     3     1     3     4
     4     2     1     3
     5     2     2     4
     6     2     3     5
     7     3     1     4
     8     3     2     5
     9     3     3     6

现在result包含第一列中的indeces,以及其余列中的(x,y,z)。你应该能够从那里提取你想要的东西。

答案 1 :(得分:0)

    x = [1 2 3]; 
    y = [11 22 33]';
    [X, Y] = meshgrid(x,y)
X =

     1     2     3
     1     2     3
     1     2     3


Y =

    11    11    11
    22    22    22
    33    33    33

答案 2 :(得分:0)

这里有两种可能性。如果这些点实际上已经在(x,y)平面中形成了一个规则点阵,并且您需要做的就是解读哪些点到哪里,那么排序将解决您的问题。具体来说,在(x,y)对上使用sortrows,然后应用于z的reshape将使数组成为正确的形状。大致像这样......

[xy,tags] = sortrows([x(:),y(:)]);
z = reshape(z(tags),[n,m]);

但是,如果您的数据是分散的,那么您需要使用插值或曲面拟合。 GRIDDATA将解决插值问题,尽管它只会插入到数据的边界。

GRIDFIT是在文件交换中找到的工具,它将解决将基本上低阶样条曲面拟合到数据中的问题。