2012-04-16 71 views
3

我在Fortran語言這個功能,我試圖重新編碼在C#Fortran的功能說明

C **************************************************************** 
C FUNCTION POLY 
C***************************************************************** 
     FUNCTION POLY(N,A,X) 
     DIMENSION A(N) 
C 
     POLY = 0. 
     L  = N 
     DO 1 K = 1,N 
     POLY = POLY*X + A(L) 
1  L  = L-1 
     RETURN 
     END 
C***************************************************************** 

我發現DIMENSION A(N)創建N值的向量,但我們已經有了一個變量A從函數參數,這是否意味着數組值都等於A?如果是的話那麼A(N)有什麼用處。 順便說任何人都可以只解釋請問這個功能,這樣做,我可以在C#中重新實現它

回答

5
 FUNCTION POLY(N,A,X)  ! implicitly real (float) function poly(int n,int a,real x) 
     DIMENSION A(N)   ! shape A as 1d array of n values in this scope 
C        ! say nothing (blank comment) 
     POLY = 0.    ! initialise return variable to float value 0 
     L  = N    ! set L (implicitly integer) to n 
     DO 1 K = 1,N    ! for(int k=1; k<=n; ++k) 
     POLY = POLY*X + A(L) ! update return variable 
1  L  = L-1    ! decrement L 
     RETURN     ! return current value for poly 
     END 

所以在類似C的語法:

float poly(int n, int a, float x) { 
    // redim a(n) 
    float result = 0; 
    int l = n; 
    for(int k=1; k <= n; ++k) { 
     result = result*x + a(l); 
     --l; 
    } 
    return result; 
} 

不翻譯被redimensioning A作爲一個陣列中的位。在C中,你會傳遞一個指針並將它用作一個數組,而在C++/C#中,你可能會傳遞一個具有自身長度屬性的向量結構。

在C#中使用列表:

float poly(List<float> coeffs, float x) { 
    float result = 0; 
    for(int i=coeffs.Count-1; i >= 0; --i) { 
     result = result*x + coeff[i]; 
    } 
    return result; 
} 
+1

FORTRAN代碼的評論很好,但是你提供的C#和Python代碼是不正確的。 – 2012-04-16 13:46:12

+0

@DavidHeffernan:......以什麼方式? – 2012-04-16 13:55:29

+0

在他們給出錯誤答案的方式。在C#代碼中,你的意思是'='而不是'+ ='。你以錯誤的順序迭代係數。你想'coeff [n-1]','coeff [n-2]'等。而Python代碼與多項式評估無關。你可以通過用'*'替換'+'來修復它,但這不是Horner的方法,效率也不高。這很不錯,它只是給出了錯誤的答案。答案中唯一正確的代碼是C僞代碼。我相信你可以很容易地糾正它,但就目前而言,這個答案是貶低投票的誘餌。 – 2012-04-16 13:57:38

3

它評估的多項式形式的x

a[1] + a[2]x + a[3]x^2 + ... a[N]x^(N-1) 

記住,Fortran語言使用基於1數組索引,我在這個方程中遵循了這個約定。


你可以把它寫在C#這樣的:

double EvaluatePolynomial(double[] a, double x) 
{ 
    double result = 0.0; 
    int i = a.Length; 
    while (i>0) 
    { 
     i--; 
     result = result*x + a[i]; 
    } 
    return result; 
} 

這裏我們使用適當的C#爲基礎的0數組索引。因此該功能evalutates多項式形式的x

a[0] + a[1]x + a[2]x^2 + ... a[N-1]x^(N-1) 
2

略微猜測我認爲這是指定該參數A本身是N元件的陣列。

因此對於C#等價物,您不需要單獨的N參數;你只需要通過A作爲double[],因爲在.NET數組可以告訴你他們的.Length

該功能使用Horner's method評估多項式。

2

DIMENSION A(N)只是聲明瞭A僞參數的細節(PARAMETERs在Fortran中是非常不同的),即它表示它是從1到N的數組。其他的不是用這種方式聲明的,因爲函數使用隱式輸入。

+1

是。它不會創建變量A,而是聲明該僞參數來描述傳遞給此函數的實際參數。如果調用例程尚未創建存儲,則存在問題。 – 2012-04-16 15:44:12

+0

這與C&R原型非常相似C – 2012-04-16 15:55:29