Fortran 等价于 MATLAB meshgrid 函数?

Sha*_*Sha 1 matlab fortran

meshgridFortran 中有对应的吗?

这是我试图用 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]); 
Run Code Online (Sandbox Code Playgroud)

此代码旨在生成具有 $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 页。

Ale*_*ogt 5

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

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
Run Code Online (Sandbox Code Playgroud)

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


Y和 的运算Z可以写为一行:

  Y = reshape( spread( ygv, 2, sX*sZ ), [sX,sY,sZ] )
  Z = reshape( spread( zgv, 1, sX*sY ), [sX,sY,sZ] )
Run Code Online (Sandbox Code Playgroud)