2012-04-16 91 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