2012-02-14 25 views
5

Bazı Fortran90 kodlarını C# 'a dönüştürüyorum. Fortran77 hakkında biraz bilgim var ama Fortran90 ile aşina değilim. Aşağıdaki kod satırında, nasıl çeviri yapacağımdan emin değilim. Bunu düşünüyorumFortran90 - C# Dönüştürme Sayı

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

olarak dönüştürülmesi gerekir:

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); 

Benim belirsizlik zımni diziler başlatılıyor için döngü inşaat yapmak var olduğu gerçeğinden kaynaklanır; yani ben söz konusu Fortran açıklamada olarak kullanılan kelime "ürün" görmedim ama

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

. Ben PRODUCT denilen vektör veya matris çarpma için içsel bir işlev olduğunu biliyorum ama "ürün" ile çalıştığım kodda bir dizi ve PRODUCK MASK kullanır bu yüzden intik fonksiyonun sözdizimi çok net bir şekilde benim deyim bu işlevi kullanmıyor.

Herhangi bir fikir veya yardım büyük takdir edilecektir. Teşekkür ederim. Eğer parçaları ayrıştırmak ve bunları yazdırırsanız

+2

Muhtemelen denemelisiniz Kodun ne anlama geldiğini anlamak ve sadece körü körüne çevirmek değil. – svick

+2

Matematiksel olarak yukarıdakiler -cos (π * m) * m! 'Dır. Böylece ilk ürün işareti çevirir, ikincisi ise m' faktoriyelini değerlendirir. C# 'de her' m' için işareti çevirmek için '1-2 * (m% 2)' kullanabilirsiniz. – ja72

+0

Teşekkür ederim ja72. – Zeos6

cevap

7

, bu özlü vectorized terimleri kullanılarak oluşturulan basit terimler fark edeceksiniz:

! 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 

nota başka bir şey product() 3 bağımsız değişken gerektirmez olmasıdır. İkinci argüman (kullanılacak boyut) ve üçüncü argüman (bir dizi maskesi) gerekli değildir. Bu noktada

ilk ürün aslında -1m-1 ve ikinci ürün m! olduğu ortaya çıkıyor.

Yani, uygun bir (ama mutlaka verimli değildir) çeviri olabilir:

// 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; 

, Özlü F90 ile "ruh" yakın, ama pek verimli:

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

Çok teşekkür ederim. Ja72'nin tabelayı [-1 + 2 * (m% 2)] için önerisini kullanarak bitirdim ve kuyruk özyinesini kullanarak faktörü hesapladım. Hepinize çok teşekkür ederim. – Zeos6