目录
背景
本博文主要分析 ndgrid, meshgrid是附送的,都是类似的东西,学会了一个,另一个很容易就理解了。
为什么会对 ndgrid 感兴趣呢?因为对它的不理解,导致我少写了几篇博文,最后,决定将 ndgrid 总结一番,去除这个绊脚石,或者加工一下,让它称为垫脚石。
我决定从低维到高维的思路来分析 ndgrid 到底怎么用?
ndgrid以及meshgrid其实就是将利用坐标轴上的坐标生成一些网格,一维的情况就不存在网格,所以坐标还是坐标;二维的情况,ndgrid的输入是两个矢量,可以看做是分别在x和y轴上的坐标,然后根据这些坐标生成网格点,所以输出肯定是2阶矩阵了。依次类推,可以得到高维的情况。
下面这句话,摘自网络看到的内容:对于网格矢量(gird vectors)x1gv,x2gv,x3gv,长度分别是M,N,P。ndgrid(x1gv, x2gv)函数输出一个MXN的数组,而meshgrid(x1gv, x2gv)输出一个N*M的数组,类似的,ndgrid(x1gv, x2gv, x3gv)函数输出一个M*N*P 的数组,而meshgrid(x1gv, x2gv,x3gv)输出一个N*M*P 的数组。
看不懂没关系,这里只是提前预热下而已,正式的内容下面一一呈现。
主题是N-D空间中的矩形网格。
一维空间中的矩形网格:
>> a = -3:3
a =
-3 -2 -1 0 1 2 3
>> x = ndgrid(a)
x =
-3
-2
-1
0
1
2
3
对一维空间,也即一个坐标轴来划分网格意义不大,主要是做一个对比作用。
二维空间中的矩形网格:
>> a = -3:3
a =
-3 -2 -1 0 1 2 3
>> b = -2:2
b =
-2 -1 0 1 2
>> [x,y]=ndgrid(a,b)
x =
-3 -3 -3 -3 -3
-2 -2 -2 -2 -2
-1 -1 -1 -1 -1
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
y =
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
从工作空间可以看到,a是7维的向量,b是5维的向量,那么使用ndgrid生成的网格点,x是一个7*5的矩阵,其x的列是a的复制;y是一个7*5的矩阵,b构成y的行,也即是说,y的行是b的复制。
这其实不难理解,毕竟是低维的情况,x这个矩阵的列可以看成是垂直于b轴的坐标点,而b有5个坐标点,所以x有5个列;y这个矩阵的行可以看成是垂直于a轴的坐标点,由于a有7个坐标点,所以y有7个行。x和y的交叉不就构成了一个又一个的网格点了吗,这也就是生成网格的作用体现出现了。
后面更高维的情况类似,我将不进行这样描述了,只给出范例。
这时就需要和meshgrid对比一下了:
>> [x1,y1] = meshgrid(a,b)
x1 =
-3 -2 -1 0 1 2 3
-3 -2 -1 0 1 2 3
-3 -2 -1 0 1 2 3
-3 -2 -1 0 1 2 3
-3 -2 -1 0 1 2 3
y1 =
-2 -2 -2 -2 -2 -2 -2
-1 -1 -1 -1 -1 -1 -1
0 0 0 0 0 0 0
1 1 1 1 1 1 1
2 2 2 2 2 2 2
meshgrid也用于生成网格点,只是实现的方式好像有点不一样,同样是a,b两个向量作为输入,输出x1的行成了a的拷贝,b有多少个坐标,a就有多少个行,也就是5行;y的列成了b的拷贝,a有多少个坐标,y就有多少个列,可见有7个列。
二者也构成了一系列的网格点。
三维空间中的矩形网格:
>> a = -3:3
a =
-3 -2 -1 0 1 2 3
>> b=-2:2
b =
-2 -1 0 1 2
>> c=-1:1
c =
-1 0 1
>> [x,y,z]=ndgrid(a,b,c)
x(:,:,1) =
-3 -3 -3 -3 -3
-2 -2 -2 -2 -2
-1 -1 -1 -1 -1
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
x(:,:,2) =
-3 -3 -3 -3 -3
-2 -2 -2 -2 -2
-1 -1 -1 -1 -1
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
x(:,:,3) =
-3 -3 -3 -3 -3
-2 -2 -2 -2 -2
-1 -1 -1 -1 -1
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
y(:,:,1) =
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
y(:,:,2) =
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
y(:,:,3) =
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
z(:,:,1) =
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
z(:,:,2) =
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
z(:,:,3) =
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
也很符合预期吧。
同样需要和meshgrid对比下:
>> [x1,y1,z1]=meshgrid(a,b,c)
x1(:,:,1) =
-3 -2 -1 0 1 2 3
-3 -2 -1 0 1 2 3
-3 -2 -1 0 1 2 3
-3 -2 -1 0 1 2 3
-3 -2 -1 0 1 2 3
x1(:,:,2) =
-3 -2 -1 0 1 2 3
-3 -2 -1 0 1 2 3
-3 -2 -1 0 1 2 3
-3 -2 -1 0 1 2 3
-3 -2 -1 0 1 2 3
x1(:,:,3) =
-3 -2 -1 0 1 2 3
-3 -2 -1 0 1 2 3
-3 -2 -1 0 1 2 3
-3 -2 -1 0 1 2 3
-3 -2 -1 0 1 2 3
y1(:,:,1) =
-2 -2 -2 -2 -2 -2 -2
-1 -1 -1 -1 -1 -1 -1
0 0 0 0 0 0 0
1 1 1 1 1 1 1
2 2 2 2 2 2 2
y1(:,:,2) =
-2 -2 -2 -2 -2 -2 -2
-1 -1 -1 -1 -1 -1 -1
0 0 0 0 0 0 0
1 1 1 1 1 1 1
2 2 2 2 2 2 2
y1(:,:,3) =
-2 -2 -2 -2 -2 -2 -2
-1 -1 -1 -1 -1 -1 -1
0 0 0 0 0 0 0
1 1 1 1 1 1 1
2 2 2 2 2 2 2
z1(:,:,1) =
-1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1
z1(:,:,2) =
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
z1(:,:,3) =
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
语法对比
从帮助文档上,我们可以得知,ndgrid的语法形式有两种:
[X1,X2,...,Xn] = ndgrid(x1,x2,...,xn)
[X1,X2,...,Xn] = ndgrid(xg)
事实上,上面我们的举例只是说到了第一种,那第二种是什么情况呢?
其实更加的简单,xg也是一个向量,n为多少,那么替换成第一种形式,就相当于输入有多少个xg向量。
使用二维网格为例试一下:
>> clear
>> a = -2:2
a =
-2 -1 0 1 2
>> [x1,x2] = ndgrid(a);
>> [x1,x2] = ndgrid(a)
x1 =
-2 -2 -2 -2 -2
-1 -1 -1 -1 -1
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
x2 =
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
是不是和预期的一样。
那么meshgrid是不是也有这种用法呢?
且看meshgrid的语法格式:
[X,Y] = meshgrid(x,y)
[X,Y] = meshgrid(x)
[X,Y,Z] = meshgrid(x,y,z)
[X,Y,Z] = meshgrid(x)
这里透露出了一个大信息,首先,meshgrid肯定也能那么用;其实,meshgrid只能用于生成2维网格以及三维网格。
对比,ndgrid的语法格式:
[X1,X2,...,Xn] = ndgrid(x1,x2,...,xn)
[X1,X2,...,Xn] = ndgrid(xg)
可见,ndgrid对维度是没有限制的。
1、在网格域上计算函数:
% Evaluate Function Over Gridded Domain
clear
clc
close all
[X1,X2] = ndgrid(-2:.2:2);
Z = X1 .* exp(-X1.^2 - X2.^2);
mesh(X1,X2,Z)
2、插入数据
%interpolate data
clear
clc
close all
[X,Y] = ndgrid(-5:0.5:5);
f = sin(X.^2) * cos(Y.^2);
surf(X,Y,f)
%interpolate data
clear
clc
close all
[X,Y] = ndgrid(-5:0.5:5);
f = sin(X.^2) * cos(Y.^2);
subplot(2,1,1);
surf(X,Y,f)
% 使用更精细的网格在点之间插值,并绘制结果图。
[X1,Y1] = ndgrid(-5:0.125:5);
F = interpn(X,Y,f,X1,Y1,'spline');
subplot(2,1,2);
surf(X1,Y1,F)
参考链接:帮助文档
本文同步分享在 博客“李锐博恩”(CSDN)。
如有侵权,请联系 support@ 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。