我在Matlab中有三个相同长度的数组,X
,Y
和Z
。 X(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。我必须返回一个方形元素列表(如下图所示)及其对应的x
,y
坐标。所以基本上我只想用这些数据重新绘制下图。
有什么想法吗?
答案 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是在文件交换中找到的工具,它将解决将基本上低阶样条曲面拟合到数据中的问题。