Fortran相当于MATLAB的meshgrid函数?

时间:2016-05-07 15:56:57

标签: matlab fortran

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} $。它们可以通过" hand"生成。在循环中或简单地使用上面的代码在stackoverflow上建议。

对于n = 3,在此代码中使用meshgrid生成3D坐标数组ind_i,ind_j和ind_z,它们有3行(长度(1:3)),3列(长度(1:3))和8页(长度(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 *(1,3)] $和$ ind_k(:,:,i)= i *(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页。

1 个答案:

答案 0 :(得分:4)

不,Fortran没有meshgrid内在函数。 不过,以下是使用spread内在函数的3D meshgrid的简单实现:

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] )