2017-11-03 15 views
1

私は、具体的Fortranの同等

separation[a, :] = sum(np.minimum(1 - distances, distances) ** 2)

ラインが重要な部分は、エレメントを取るためにnp.minimumの使用され、Fortranで再書き込みいくつかのPythonコードにしようとしています少なくとも2つの多次元配列を含む。距離はN座標(x、y、z)の(3、N)配列です。私は、Fortranで同様の機能を見つけることができないので、私は使って自分の書いた:

do b = 1, N 
    temp = 0.0 
    do c = 1, 3 
     if ((1 - distances(c, b)) .LE. distances(c, b)) then 
     temp = temp + (1 - distances(c, b)) ** 2 
     else 
     temp = temp + (distances(c, b)) ** 2 
     end if 
    end do 
    separation(a, b) = temp 
    end do 

当然のことながら、このコードは非常に遅いですが、私はFortranで非常に経験豊富ではないよ、まだこのコードを改善したり示唆するように推奨事項代わりの方法が大いに評価されるであろう。

Pythonで次のコードは、

separation[a, :] = sum(np.where(1 - distances <= distances, (1 - distances), distances) ** 2) 

を作品としてではなく、文は、彼らはものをPythonのためにかなり異なる動作をすると、彼らはしていないように見えるところFortranが持っている間、私は、おそらくどこ文が役立つかもしれないと思いましたここで多用してください。

答えて

0

ほぼ同じです。ほとんどのFORTRAN組み込み関数は

real a(2,4),b(4) 
a=reshape([.1,.2,.3,.4,.5,.6,.7,.8],shape(a)) 
b=sum(min(1-a,a)**2,1) 
write(*,'(4f5.2)')b 
end 

0.05 0.25 0.41 0.13

ノートFORTRANのsumだろうが、デフォルトの合計によって、アレイ全体(あなたは、少なくともfortran95を持っていると仮定)成分ごとアレイ上で動作します。

+0

ありがとうございます!それはそれほど簡単ではないと信じられない。 –