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要素の配列であることを指定していると思います。

Nしたがって、C# に相当するものについては、別のパラメーターは必要ありません。Aとして渡すだけdouble[]で済みます。.NET 配列では、その.Length.

この関数は、ホーナー法を使用して多項式を評価します。

于 2012-04-16T12:38:27.253 に答える
2

この行DIMENSION A(N)は、A 仮引数 ( PARAMETERsFortran では非常に異なるもの) の詳細を宣言しているだけです。つまり、1 から N までの配列であると述べています。関数は暗黙の型付けを使用するため、他のものはこのように宣言されていません。

于 2012-04-16T12:51:16.950 に答える