Fortranfunction说明

我在Fortran中有这个function,我试图用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)的用途是什么。 顺便说一句,任何人都可以解释这个function是做什么的,所以我可以在C#中重新实现它

  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#中,你可能会传递一个具有自己的length属性的类似矢量的结构。

在C#中,使用列表:

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

它评估forms为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的forms中评估一个多项式:

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

略微猜测我认为这是指定参数A本身是N元素的数组。

因此,对于C#等价物,您不需要单独的N参数; 你只需要将A作为double[]传递,因为.NET数组可以告诉你他们的.Length

该函数使用Horner方法评估多项式。

DIMENSION A(N)只是声明了一个伪参数的细节( PARAMETERs在Fortran中是非常不同的),即它表示它是一个从1到N的数组。其他的不是这样声明的,因为函数使用隐式打字。