System.ArgumentException : 给定的数组太小

System.ArgumentException : The given array is too small

我正在尝试对点列表(每个点都有 x 和 y 坐标)使用 FFT 滤波器,我应该得到 return a list<Complex>.

在测试下面的代码时(在包含 12 个点的列表中)我得到这个错误

System.ArgumentException : The given array is too small. It must be at least 14 long. at MathNet.Numerics.IntegralTransforms.Fourier.ForwardReal(Double[] data, Int32 n, FourierOptions options)

我实际上在使用 Math.net MathNet.Numerics.IntegralTransforms.Fourier.ForwardReal(buffer, buffer.Length, FourierOptions.Matlab);

这是我的 class 的代码

        // inputs is a List of Point(List<Point> inputs)
        var buffer=inputs.Select(p => (p.Y)).ToArray();
        try
        {
            MathNet.Numerics.IntegralTransforms.Fourier.ForwardReal(buffer, buffer.Length, FourierOptions.Matlab);
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }

知道如何解决吗?谢谢 :)

根据详细手册,缓冲区需要比您拥有的数据长 2 项。

https://numerics.mathdotnet.com/api/MathNet.Numerics.IntegralTransforms/Fourier.htm#ForwardReal

void ForwardReal(Double[] data, int n, FourierOptions options)

... The data array needs to be N+2 (if N is even) or N+1 (if N is odd) long in order to support such a packed spectrum.

当我阅读 code 在 github 上,思路现在清晰多了。 所以这是我的代码的整改,

        var inputsCount = inputs.Count;
        var buffer =new double[inputsCount % 2 == 0 ? inputsCount + 2 : inputsCount + 1];
        int j = 0;

        foreach (var point in inputs)
        {
            buffer[j] = point.Y;
            j++;
        }

        try
        {
            MathNet.Numerics.IntegralTransforms.Fourier.ForwardReal(buffer, inputsCount, FourierOptions.Matlab);
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }