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页。
答案 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可用)。
Y
和Z
的操作可以写成一行:
Y = reshape( spread( ygv, 2, sX*sZ ), [sX,sY,sZ] )
Z = reshape( spread( zgv, 1, sX*sY ), [sX,sY,sZ] )