【问题标题】:Fortran equivalent of the MATLAB meshgrid function?MATLAB meshgrid 函数的 Fortran 等价物?
【发布时间】:2016-05-08 02:03:50
【问题描述】:

在 Fortran 中是否有 meshgrid 等效项?

这是我试图用 Fortran 重写的 Matlab 代码:

n = a;  %same in fortran
m = n*(n-1)/2; %same in fortran 
offdiags = dec2bin(0:2^m-1,m)-48; % found a subroutine online
A = zeros(n,n,2^m); %multi-dimensional array same concept in fortran

[ind_i,ind_j,ind_k] = meshgrid(1:n,1:n,1:2^m); % ?
A(ind_i>ind_j) = offdiags.'; 

A = A + permute(A,[2 1 3]); 

此代码旨在生成具有 $n$ 个顶点的所有可能的邻接矩阵(或具有无向边的图形配置)。这种配置的数量正好是$2^{n(n-1)/2}$。它们可以通过“手动”循环生成,也可以简单地使用上面在stackoverflow上建议的代码来生成。

对于 n=3,此代码中使用 meshgrid 生成 3D 坐标数组 ind_i、ind_j 和 ind_z,它们有 3 行 (length(1:3))、3 列 (length(1:3)) 和 8 页(length(1:1:2^m)) 并且它们包含网格中指定的向量的副本。就我而言,设 $L=[1,2,3]$。然后我从 1 到 8 得到 i,$ind_i(:,:,i)=[L;L;L]$, $ind_j(:,:,i)=[ones(1,3);2*ones (1,3);3*ones(1,3)]$ 和 $ind_k(:,:,i)=i*ones(3)$。

从他们的网站复制的 Matlab 描述:[X,Y,Z] = meshgrid(xgv,ygv,zgv) 生成三维坐标数组。输出坐标数组 X、Y 和 Z 分别包含网格向量 xgv、ygv 和 zgv 的副本。输出数组的大小由网格向量的长度决定。对于长度分别为 M、N 和 P 的网格向量 xgv、ygv 和 zgv,X、Y 和 Z 将有 N 行、M 列和 P 页。

【问题讨论】:

  • 至少有一个关于函数实际作用的句子是有序的。
  • 谢谢我刚刚编辑了我的帖子
  • @AlexanderVogt 是的,这就是我引用文本的原因,但我可以更改它。谢谢。

标签: matlab fortran


【解决方案1】:

不,Fortran 没有 meshgrid 内在函数。 然而,这里是一个使用 spread 内在函数的 meshgrid 在 3D 中的简单实现:

subroutine meshgrid(xgv, ygv, zgv, X, Y, Z)
  implicit none
  real,intent(in)   :: xgv(:), ygv(:), zgv(:)
  real,intent(out)  :: X(:,:,:), Y(:,:,:), Z(:,:,:)
  integer           :: sX, sY, sZ, i

  sX = size(xgv) ; sY = size(ygv) ; sZ = size(zgv)

  do i=1,sZ
    X(:,:,i) = spread( xgv, 1, sY )
    Y(:,:,i) = spread( ygv, 2, sX )
  enddo ! i
  do i=1,sX
    Z(i,:,:) = spread( zgv, 1, sY)
  enddo ! i
end subroutine

针对 Octave 进行了测试(我没有可用的 Matlab)。


YZ 的操作可以写成一行:

  Y = reshape( spread( ygv, 2, sX*sZ ), [sX,sY,sZ] )
  Z = reshape( spread( zgv, 1, sX*sY ), [sX,sY,sZ] )

【讨论】:

  • 编译时出现错误 - 它显示错误:(1) 处的符号‘sy’没有隐式类型 - 其他参数也一样。可能是什么(我是 Fortran 的初学者)?另外,你能写一个二维网格的代码吗? (我只需要 xgv 和 ygv)。
猜你喜欢
  • 2013-11-28
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 2019-12-15
  • 1970-01-01
  • 2021-11-02
  • 2016-09-18
相关资源
最近更新 更多