【 MATLAB 】ndgrid 和 meshgrid 对比理解以及应用

举报
李锐博恩 发表于 2021/07/15 06:45:31 2021/07/15
【摘要】 目录 背景 一维空间中的矩形网格: 二维空间中的矩形网格: 三维空间中的矩形网格: 语法对比 1、在网格域上计算函数: 2、插入数据 背景 本博文主要分析 ndgrid, meshgrid是附送的,都是类似的东西,学会了一个,另一个很容易就理解了。 为什么会对 ndgrid 感兴趣呢?因为对它的不理解,导致我少写了几篇博文,最后,决定将 ndgrid 总...

目录

背景

一维空间中的矩形网格:

二维空间中的矩形网格:

三维空间中的矩形网格:

语法对比

1、在网格域上计算函数:

2、插入数据


背景

本博文主要分析 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 的数组。 

https://blog.csdn.net/u012183487/article/details/76149279

看不懂没关系,这里只是提前预热下而已,正式的内容下面一一呈现。


主题是N-D空间中的矩形网格。

一维空间中的矩形网格:


  
  1. >> a = -3:3
  2. a =
  3.     -3    -2    -1     0     1     2     3
  4. >> x = ndgrid(a)
  5. x =
  6.     -3
  7.     -2
  8.     -1
  9.      0
  10.      1
  11.      2
  12.      3

对一维空间,也即一个坐标轴来划分网格意义不大,主要是做一个对比作用。


二维空间中的矩形网格:


  
  1. >> a = -3:3
  2. a =
  3.     -3    -2    -1     0     1     2     3
  4. >> b = -2:2
  5. b =
  6.     -2    -1     0     1     2
  7. >> [x,y]=ndgrid(a,b)
  8. x =
  9.     -3    -3    -3    -3    -3
  10.     -2    -2    -2    -2    -2
  11.     -1    -1    -1    -1    -1
  12.      0     0     0     0     0
  13.      1     1     1     1     1
  14.      2     2     2     2     2
  15.      3     3     3     3     3
  16. y =
  17.     -2    -1     0     1     2
  18.     -2    -1     0     1     2
  19.     -2    -1     0     1     2
  20.     -2    -1     0     1     2
  21.     -2    -1     0     1     2
  22.     -2    -1     0     1     2
  23.     -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对比一下了:


  
  1. >> [x1,y1] = meshgrid(a,b)
  2. x1 =
  3.     -3    -2    -1     0     1     2     3
  4.     -3    -2    -1     0     1     2     3
  5.     -3    -2    -1     0     1     2     3
  6.     -3    -2    -1     0     1     2     3
  7.     -3    -2    -1     0     1     2     3
  8. y1 =
  9.     -2    -2    -2    -2    -2    -2    -2
  10.     -1    -1    -1    -1    -1    -1    -1
  11.      0     0     0     0     0     0     0
  12.      1     1     1     1     1     1     1
  13.      2     2     2     2     2     2     2

meshgrid也用于生成网格点,只是实现的方式好像有点不一样,同样是a,b两个向量作为输入,输出x1的行成了a的拷贝,b有多少个坐标,a就有多少个行,也就是5行;y的列成了b的拷贝,a有多少个坐标,y就有多少个列,可见有7个列。

二者也构成了一系列的网格点。


三维空间中的矩形网格:


  
  1. >> a = -3:3
  2. a =
  3. -3 -2 -1 0 1 2 3
  4. >> b=-2:2
  5. b =
  6. -2 -1 0 1 2
  7. >> c=-1:1
  8. c =
  9. -1 0 1
  10. >> [x,y,z]=ndgrid(a,b,c)
  11. x(:,:,1) =
  12. -3 -3 -3 -3 -3
  13. -2 -2 -2 -2 -2
  14. -1 -1 -1 -1 -1
  15. 0 0 0 0 0
  16. 1 1 1 1 1
  17. 2 2 2 2 2
  18. 3 3 3 3 3
  19. x(:,:,2) =
  20. -3 -3 -3 -3 -3
  21. -2 -2 -2 -2 -2
  22. -1 -1 -1 -1 -1
  23. 0 0 0 0 0
  24. 1 1 1 1 1
  25. 2 2 2 2 2
  26. 3 3 3 3 3
  27. x(:,:,3) =
  28. -3 -3 -3 -3 -3
  29. -2 -2 -2 -2 -2
  30. -1 -1 -1 -1 -1
  31. 0 0 0 0 0
  32. 1 1 1 1 1
  33. 2 2 2 2 2
  34. 3 3 3 3 3
  35. y(:,:,1) =
  36. -2 -1 0 1 2
  37. -2 -1 0 1 2
  38. -2 -1 0 1 2
  39. -2 -1 0 1 2
  40. -2 -1 0 1 2
  41. -2 -1 0 1 2
  42. -2 -1 0 1 2
  43. y(:,:,2) =
  44. -2 -1 0 1 2
  45. -2 -1 0 1 2
  46. -2 -1 0 1 2
  47. -2 -1 0 1 2
  48. -2 -1 0 1 2
  49. -2 -1 0 1 2
  50. -2 -1 0 1 2
  51. y(:,:,3) =
  52. -2 -1 0 1 2
  53. -2 -1 0 1 2
  54. -2 -1 0 1 2
  55. -2 -1 0 1 2
  56. -2 -1 0 1 2
  57. -2 -1 0 1 2
  58. -2 -1 0 1 2
  59. z(:,:,1) =
  60. -1 -1 -1 -1 -1
  61. -1 -1 -1 -1 -1
  62. -1 -1 -1 -1 -1
  63. -1 -1 -1 -1 -1
  64. -1 -1 -1 -1 -1
  65. -1 -1 -1 -1 -1
  66. -1 -1 -1 -1 -1
  67. z(:,:,2) =
  68. 0 0 0 0 0
  69. 0 0 0 0 0
  70. 0 0 0 0 0
  71. 0 0 0 0 0
  72. 0 0 0 0 0
  73. 0 0 0 0 0
  74. 0 0 0 0 0
  75. z(:,:,3) =
  76. 1 1 1 1 1
  77. 1 1 1 1 1
  78. 1 1 1 1 1
  79. 1 1 1 1 1
  80. 1 1 1 1 1
  81. 1 1 1 1 1
  82. 1 1 1 1 1

也很符合预期吧。

同样需要和meshgrid对比下:


  
  1. >> [x1,y1,z1]=meshgrid(a,b,c)
  2. x1(:,:,1) =
  3. -3 -2 -1 0 1 2 3
  4. -3 -2 -1 0 1 2 3
  5. -3 -2 -1 0 1 2 3
  6. -3 -2 -1 0 1 2 3
  7. -3 -2 -1 0 1 2 3
  8. x1(:,:,2) =
  9. -3 -2 -1 0 1 2 3
  10. -3 -2 -1 0 1 2 3
  11. -3 -2 -1 0 1 2 3
  12. -3 -2 -1 0 1 2 3
  13. -3 -2 -1 0 1 2 3
  14. x1(:,:,3) =
  15. -3 -2 -1 0 1 2 3
  16. -3 -2 -1 0 1 2 3
  17. -3 -2 -1 0 1 2 3
  18. -3 -2 -1 0 1 2 3
  19. -3 -2 -1 0 1 2 3
  20. y1(:,:,1) =
  21. -2 -2 -2 -2 -2 -2 -2
  22. -1 -1 -1 -1 -1 -1 -1
  23. 0 0 0 0 0 0 0
  24. 1 1 1 1 1 1 1
  25. 2 2 2 2 2 2 2
  26. y1(:,:,2) =
  27. -2 -2 -2 -2 -2 -2 -2
  28. -1 -1 -1 -1 -1 -1 -1
  29. 0 0 0 0 0 0 0
  30. 1 1 1 1 1 1 1
  31. 2 2 2 2 2 2 2
  32. y1(:,:,3) =
  33. -2 -2 -2 -2 -2 -2 -2
  34. -1 -1 -1 -1 -1 -1 -1
  35. 0 0 0 0 0 0 0
  36. 1 1 1 1 1 1 1
  37. 2 2 2 2 2 2 2
  38. z1(:,:,1) =
  39. -1 -1 -1 -1 -1 -1 -1
  40. -1 -1 -1 -1 -1 -1 -1
  41. -1 -1 -1 -1 -1 -1 -1
  42. -1 -1 -1 -1 -1 -1 -1
  43. -1 -1 -1 -1 -1 -1 -1
  44. z1(:,:,2) =
  45. 0 0 0 0 0 0 0
  46. 0 0 0 0 0 0 0
  47. 0 0 0 0 0 0 0
  48. 0 0 0 0 0 0 0
  49. 0 0 0 0 0 0 0
  50. z1(:,:,3) =
  51. 1 1 1 1 1 1 1
  52. 1 1 1 1 1 1 1
  53. 1 1 1 1 1 1 1
  54. 1 1 1 1 1 1 1
  55. 1 1 1 1 1 1 1

语法对比

从帮助文档上,我们可以得知,ndgrid的语法形式有两种:

[X1,X2,...,Xn] = ndgrid(x1,x2,...,xn)

[X1,X2,...,Xn] = ndgrid(xg)

事实上,上面我们的举例只是说到了第一种,那第二种是什么情况呢?

其实更加的简单,xg也是一个向量,n为多少,那么替换成第一种形式,就相当于输入有多少个xg向量。

使用二维网格为例试一下:


  
  1. >> clear
  2. >> a = -2:2
  3. a =
  4. -2 -1 0 1 2
  5. >> [x1,x2] = ndgrid(a);
  6. >> [x1,x2] = ndgrid(a)
  7. x1 =
  8. -2 -2 -2 -2 -2
  9. -1 -1 -1 -1 -1
  10. 0 0 0 0 0
  11. 1 1 1 1 1
  12. 2 2 2 2 2
  13. x2 =
  14. -2 -1 0 1 2
  15. -2 -1 0 1 2
  16. -2 -1 0 1 2
  17. -2 -1 0 1 2
  18. -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、在网格域上计算函数:


  
  1. % Evaluate Function Over Gridded Domain
  2. clear
  3. clc
  4. close all
  5. [X1,X2] = ndgrid(-2:.2:2);
  6. Z = X1 .* exp(-X1.^2 - X2.^2);
  7. mesh(X1,X2,Z)


2、插入数据


  
  1. %interpolate data
  2. clear
  3. clc
  4. close all
  5. [X,Y] = ndgrid(-5:0.5:5);
  6. f = sin(X.^2) * cos(Y.^2);
  7. surf(X,Y,f)


  
  1. %interpolate data
  2. clear
  3. clc
  4. close all
  5. [X,Y] = ndgrid(-5:0.5:5);
  6. f = sin(X.^2) * cos(Y.^2);
  7. subplot(2,1,1);
  8. surf(X,Y,f)
  9. % 使用更精细的网格在点之间插值,并绘制结果图。
  10. [X1,Y1] = ndgrid(-5:0.125:5);
  11. F = interpn(X,Y,f,X1,Y1,'spline');
  12. subplot(2,1,2);
  13. surf(X1,Y1,F)

 

参考链接:帮助文档

 

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/82860261

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。