3

我在 Fortran 中有这个函数,我正在尝试用 C# 重新编码它

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# 中重新实现它

4

4 回答 4

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

不翻译的位是将 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;
}
于 2012-04-16T12:54:37.180 回答
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 的数组索引。因此,此函数计算x以下形式的多项式:

a[0] + a[1]x + a[2]x^2 + ... a[N-1]x^(N-1)
于 2012-04-16T12:32:34.147 回答
2

稍微猜测一下,我认为这是指定参数A本身是一个N元素数组。

因此,对于 C# 等效项,您不需要单独的N参数;您只需要作为 .NET 数组传递Adouble[]因为 .NET 数组可以告诉您它们的.Length.

该函数使用霍纳方法计算多项式。

于 2012-04-16T12:38:27.253 回答
2

该行DIMENSION A(N)仅声明了 A 虚拟参数的详细信息(PARAMETERs在 Fortran 中非常不同),即它说它是一个从 1 到 N 的数组。其他的没有以这种方式声明,因为该函数使用隐式类型。

于 2012-04-16T12:51:16.950 回答