2012-02-14 6 views
5

Fortran90コードをC#に変換しています。私はFortran77についていくつかの知識を持っていますが、Fortran90には慣れていません。私は翻訳する方法がわからない次のコード行を実行しました。私はこのことを考えていFortran90からC#​​への変換の問題

C1 = real(product((/(-1,i1=1,m-1)/))*product((/(i1,i1=2,m)/))) 

のように変換する必要があります。

int product1 = -1; int product2 = 1; 
for (int i1 = 1 ; i1 <= (m-1); i1++) 
{ 
    product1 *= -1; 
} 
for (int i2 = 2, i2 <= m; i2++) 
{ 
    product2 *= i2; 
} 
float C1 = (float)(product1 * product2); 

私の不確実性が暗黙のは、配列を初期化するためのループの構築を行うが存在するという事実から生じます。すなわち

A = (/2*I, I = 1,5/) 

が、私は、問題のFortranの文のように使用単語「製品」を見たことがありません。私は知っているベクトルまたは行列の乗算PRODUCTと呼ばれる本質的な関数がありますが、 "製品"は私が働いているコードの配列ではないintrisic関数の構文PRODUCTは非常に明確に私の文はこの関数を使用していません。

洞察または助けがあれば幸いです。ありがとうございました。

+2

あなたはおそらく試してみてくださいコードが何をしているのかを理解し、それを盲目的に翻訳するだけではありません。 – svick

+2

数学的には、上記は '-cos(π* m)* m!'です。したがって、最初のプロダクトは符号を反転し、2番目のプロダクトは 'm'の階乗を評価します。 'C#'では '1-2 *(m%2)'を使って 'm 'の記号を反転させることができます。 – ja72

+0

ja72ありがとうございます。 – Zeos6

答えて

7

あなたが部品を分解し、それらを印刷する場合は、これらは、単に簡潔なベクトル化用語を使用して作成された用語ですがわかります:

! given: (/(expr, start, end)/) 
! 
! (/(-1, i1=1, m-1)/) = vector, -1 repeated m-1 times 
! 
! (/(i1, i1=2, m)/) = vector, 2..m 
! 
! Both are vectors with m-1 terms 

注意すべき他の事はproduct()は3つの引数を必要としないことです。 2番目の引数(使用する次元)と3番目の引数(配列マスク)は必要ありません。

この時点で、最初の製品が実際-1m-1であり、第二製品がm!であることが明らかとなります。

ので、適切な(必ずしも効率的ではない)翻訳は次のようになります。

// product((/(-1,i1=1,m-1)/)) => -1^m-1 
double i = (m % 2 == 0 ? -1 : 1); 

// product((/(i1,i1=2,m)/)) => m! 
double mfact = i; 
for (int jj = 2; jj < m; ++jj) 
{ 
    mfact *= jj; 
} // C1 = mfact; 

、簡潔F90と "精神" が近いが、ほとんど効果的な:

double i = (m % 2 == 0 ? -1 : 1); 
double C1 = Enumerable.Range(2, m) 
         .Aggregate(i, (x, y) => x * y); 
+0

ありがとうございます。私は、sign flip [-1 + 2 *(m%2)]に対してja72の提案を使用して終了し、末尾再帰を使用して階乗を計算しました。皆さんありがとうございました。 – Zeos6

関連する問題