C#数字食谱

时间:2017-06-08 17:27:13

标签: c# numerical-recipes

我是C#的初学者和一般的编程,我想问一下。我正在尝试使用datagridview创建一个项目并进行一些计算。基本上我想做的是从经验数据表中使用chebyshev aproximation对数据进行近似。使用数字配方中的代码我想使用这个功能,chebft,它看起来像这样:

void chebft(NRREAL a, NRREAL b, NRREAL c[], int n, NRREAL (*func)(NRREAL))
{ 
    int k,j;
    NRREAL fac,bpa,bma,*f;

    f=vector(0,n-1);
    bma=NR_1_2*(b-a);
    bpa=NR_1_2*(b+a);
    for (k=0;k<n;k++) {
    NRREAL y=cos(NR_PI*(k+NR_1_2)/n);
    f[k]=(*func)(y*bma+bpa);
    }
    fac=NR_2/n;
    for (j=0;j<n;j++) {
    NRZEAL sum=NR_0;
    for (k=0;k<n;k++)
        sum += f[k]*cos(NZ_PI*j*(k+NZ_1_2)/n);
    c[j]=fac*(NRREAL)sum;
    }
    free_vector(f,0,n-1);
}

我希望它在C#中使用,所以我到目前为止:

public void chebft(double a, double b, double[] c, int n, double func)  
    {
        int k,j;
        double fac, bpa, bma;

        double PI = 3.14159265358979323846;
        Vector f = new Vector(0, n - 1);
        bma = 0.5 * (b - a);
        bpa = 0.5 * (b - a);

        for (k = 0; k < n; k++)
        { 
            double y = Math.Cos(PI*(k+0.5)/n);
            f[k] = (func)(y*bma+bpa);
        }

        fac = 2.0 / n;
        for (j = 0; j < n; j++)
        {
            double sum = 0.0;

            for (k = 0; k < n; k++)
            {
                sum += f[k] * Math.Cos(PI * j * (k + 0.5) / n);
                c[j] = fac * (double)sum;
            }
        }

    }

我知道func部分和f [k]部分有错误,但我不知道如何修复它们。

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

翻译似乎相对稳固,但有一个例外(撇​​开可能需要更深入的问题诊断知识的数字问题):

函数指针Func<double, double> func 接受一个双值参数并返回一个double。要在C#中传递这样一个lambda函数,它本质上等同于C ++中的函数指针,请使用以下格式:

f[k] = func(y*bma+bpa);

然后您可以按如下方式调用该函数:

sum

可以找到更多信息here

另请注意,您不需要在最终循环中将Math强制转换为double,因为它已经是double,并且Math.PI类已经定义了常量... myAdapter = new MyAdapter(Deserturi.this, R.layout.design_row, imgList); lv.setAdapter(myAdapter); mDatabaseRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { progressDialog.dismiss(); for (DataSnapshot snapshot : dataSnapshot.getChildren()) { ModelClass img = snapshot.getValue(ModelClass.class); myAdapter.addElement(img); } myAdapter.notifyDataSetChanged(); }