2

ハートレー変換を数えるための同様の式があります。唯一の違いは、次のコード行の入力関数-sin、cos、expです。

Math.Exp((double)tau)
Math.Sin((double)tau)
Math.Cos((double)tau)

ほぼ同一のコードフラグメントをエスケープして、次のフラグメントでコードを短縮するにはどうすればよいですか?

 private void CountHartley(ref double [] arr, string function)
        {
            int N = arr.Length;
            if (function == "exp")
            {
                for (int nu = 0, tau = 0; ((nu < N) && (tau < N)); nu++, tau++)
                {
                    arr[nu] = 1 / (double)N *
                                 Math.Exp((double)tau) *
                                 (Math.Sin(2 * Math.PI * nu * tau / (double) N) +
                                 Math.Cos(2 * Math.PI * nu * tau / (double) N));
                }
            }
            else if (function == "sin")
            {
                for (int nu = 0, tau = 0; ((nu < N) && (tau < N)); nu++, tau++)
                {
                    arr[nu] = 1 / (double)N *
                                 Math.Sin((double)tau) *
                                 (Math.Sin(2 * Math.PI * nu * tau / (double)N) +
                                 Math.Cos(2 * Math.PI * nu * tau / (double)N));
                }
            }
            else
            {
                for (int nu = 0, tau = 0; ((nu < N) && (tau < N)); nu++, tau++)
                {
                    arr[nu] = 1 / (double)N *
                                 Math.Cos((double)tau) *
                                 (Math.Sin(2 * Math.PI * nu * tau / (double)N) +
                                 Math.Cos(2 * Math.PI * nu * tau / (double)N));
                }
            }
}
4

2 に答える 2

6

使用する関数でaを渡す代わりにstring、関数を直接渡すことができます。

これには、次のようにFunc <T、TResult>デリゲートを使用できます。

private void CountHartley(ref double [] arr, Func<double, double> function)
{
    int N = arr.Length;
    for (int nu = 0, tau = 0; ((nu < N) && (tau < N)); nu++, tau++)
    {
        arr[nu] = 1 / (double)N *
                     function((double)tau) *
                     (Math.Sin(2 * Math.PI * nu * tau / (double) N) +
                     Math.Cos(2 * Math.PI * nu * tau / (double) N));
    }
}

使用法:

var result = CountHartley(arr, Math.Cos);
于 2012-04-28T14:52:40.887 に答える
0

Math。*をFunc<double, double> functionパラメータの引数として渡すのはどうですか?

于 2012-04-28T14:54:17.407 に答える