合并多个浮点数组并计算每个项的平均值

时间:2014-04-21 14:06:41

标签: c# arrays average

我有多个浮点数组。它们的长度不能相互匹配。 现在我必须将它们全部合并到一个浮点数组中。为了合并它们,我想计算每个指数的平均值。这意味着:

output[n] = (input0[n] + input1[n] + input2[n] ... + inputx[n]) / x

所有必须非常快速地计算。我不在乎代码是否易于阅读或可扩展。它必须尽可能快:

我创建了以下代码:

private void Mix()
{
    List<float[]> input = new List<float[]>();
    //...

    //input has [n] float arrays.
    //eg:
    //0: [0.5, 0.3, 0.6, 0.1, -0.3, 0.1, -0.9]
    //1: [0.1, 0.7, -0.2, 0.8, -0.2]
    //2: [-0.3, 0.9, 0.5, 0.4, 0.8, -0.6]
    //3: [0.5, -0.2, 0.4]
    //-----------------------------------------------
    //the average value for the first value would have to be this:
    //(0.5 + 0.1 - 0.3 + 0.5) / 4

    //mix all together:
    //===================


    //create an output buffer
    int length = input.Max(x => x.Length);
    float[] output = new float[length];

    for (int n = 0; n < length; n++)
    {
        float value = 0;
        int count = 0;
        for (int x = 0; x < input.Count; x++)
        {
            float[] inputBuffer = input[x]; //select the input array

            if (inputBuffer.Length >= n) //check whether there is a value to get
            {
                value += inputBuffer[n]; //get the value of the input array
                count++;
            }
        }

        output[n] = value / count; //calculate the average
    }
}

如您所见,它包含嵌套的for循环。我猜,这段代码到目前为止还不够快。那么有什么方法可以让它更快?

2 个答案:

答案 0 :(得分:1)

要想让它更快,我会想到两件事:

  1. 重新排列代码,以便if语句位于外部循环而不是内部循环中。想想&#34;提前退出&#34;而不是&#34;验证每个索引是否在范围内&#34;。

  2. 在此处利用SIMD库:http://blogs.msdn.com/b/dotnet/archive/2014/04/07/the-jit-finally-proposed-jit-and-simd-are-getting-married.aspx

答案 1 :(得分:0)

您可以尝试使用专门的库添加矢量,请参阅例如Recommendation for C# Matrix Library获取候选人名单。正如斯科特已经提出的那样,这不会改变你的问题的基本运行时复杂性,但它可能运行得稍微快一点,为这些操作进行了优化。