我有多个浮点数组。它们的长度不能相互匹配。 现在我必须将它们全部合并到一个浮点数组中。为了合并它们,我想计算每个指数的平均值。这意味着:
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循环。我猜,这段代码到目前为止还不够快。那么有什么方法可以让它更快?
答案 0 :(得分:1)
要想让它更快,我会想到两件事:
重新排列代码,以便if
语句位于外部循环而不是内部循环中。想想&#34;提前退出&#34;而不是&#34;验证每个索引是否在范围内&#34;。
答案 1 :(得分:0)
您可以尝试使用专门的库添加矢量,请参阅例如Recommendation for C# Matrix Library获取候选人名单。正如斯科特已经提出的那样,这不会改变你的问题的基本运行时复杂性,但它可能运行得稍微快一点,为这些操作进行了优化。