2012-02-14 2 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/) 

그러나 나는 제품의 단어를 본 적이 없다. 나는 벡터 또는 행렬 곱셈에 대한 PRODUCT라는 내장 함수가 있음을 알고 있지만 "제품"은 내가 작업중인 코드의 배열이 아니며 intrisic 함수의 구문을 사용합니다. PRODUCT은 마스크를 사용하여 명확하게 내 문장에서이 함수를 사용하지 않습니다.

모든 통찰력이나 도움을 주시면 감사하겠습니다. 고맙습니다. 당신은 부품을 분해하고이를 인쇄 할 경우

+2

당신은 아마 시도해야 코드가하는 일을 이해하고 그것을 맹목적으로 번역하는 것이 아닙니다. – svick

+2

수학적으로 위의 것은'-cos (π * m) * m!'입니다. 따라서 첫 번째 제품은 부호를 반전시키고 두 번째 제품은'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 개 인수가 필요하지 않습니다. 두 번째 인수 (사용할 차원)와 세 번째 인수 (배열 마스크)는 필요하지 않습니다. 이 시점에서

그것은 첫 번째 제품이 실제로 -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