2016-05-07 32 views
1

Fortranにはmeshgrid相当ですか?MATLAB meshgrid関数のFortranに相当しますか?

これは私が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の場合、このコードでは3つの線(長さ(1:3))、3つの列(長さ(1:3))、および8つの線を持つ3D座標配列ind_i、ind_jおよびind_zを生成するためにmeshgridが使用されます。ページ(長さ(1:1:2^m))であり、グリッド内に指定されたベクトルのコピーを含みます。私の場合、$ L = [1,2,3] $としましょう。 $ 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 description copied from their site: [X,Y,Z] = meshgrid(xgv,ygv,zgv) produces three-dimensional coordinate arrays. The output coordinate arrays X, Y, and Z contain copies of the grid vectors xgv, ygv, and zgv respectively. The sizes of the output arrays are determined by the length of the grid vectors. For grid vectors xgv, ygv, and zgv of length M, N, and P respectively, X, Y, and Z will have N rows, M columns, and P pages.

+1

機能は、実際に順番になるんかについて、少なくとも文:YZため


操作は、1行のように記述することができます。 –

+0

ありがとう私は私の投稿を編集しました – Sha

+0

@AlexanderVogtはいこれが私がテキストを引用した理由ですが、私はそれを変更することができます。ありがとう。 – Sha

答えて

4

いいえ、Fortranには固有ベクトルがありません。 はしかし、ここに固有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 

はオクターブに対してテスト(私はMATLABは利用できていません)。

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

大変ありがとうございます。 – Sha

+0

これをコンパイルするときにエラーが発生します。エラー:(1)のエラー 'シンボル'は 'IMPLICIT'タイプがなく、他のパラメータも同じです。何ができるのですか(私はFortranの初心者です)?また、2Dメッシュグリッド用のコードを記述できますか? (私はxgvとygvのみ必要です)。 – odnerpmocon

関連する問題