从数组中采样

时间:2017-12-26 15:11:31

标签: c#

我有一个包含1M浮点数的浮点数组

我想做抽样:对于每4个花车,我只想采取1.所以我这样做:

for(int i = 0; i< floatArray.Length; i++) {
    if(i % 4 == 0) {
         resultFloat.Add(floatArray[i])
    }
}

这样可以正常工作,但是需要花费很多时间来运行所有元素,是否有其他方法可以使其具有更好的结果(如果有的话)

5 个答案:

答案 0 :(得分:6)

每次迭代只需将循环增加4而不是1:

for(int i = 0; i< floatArray.Length; i+=4)
{
    resultFloat.Add(floatArray[i]);
}

答案 1 :(得分:6)

我可以看到两个可能会降低性能的因素。

  1. 正如您已经提供的那样,您应该将步骤设置为4:

    for (int i = 0; i < floatArray.Length; i += 4)
    {
        resultFloat.Add(floatArray[i]);
    }
    
  2. 看起来resultFloatfloat的列表。我建议使用数组而不是列表,如下所示:

    int m = (floatArray.Length + 3) / 4;
    
    float[] resultFloat = new float[m];
    
    for (int i = 0, k = 0; i < floatArray.Length; i += 4, k++)
    {
        resultFloat[k] = floatArray[i];
    }
    

答案 2 :(得分:1)

如果你真的遇到性能问题,那么你最好不要使用动态容器来获得结果,而是使用静态大小的数组。

float[] resultFloat = new float[(floatArray.Length + 3) >> 2];
for(int i = 0; i < resultFloat.Length; i++)
    resultFloat[i] = floatArray[i << 2];

通常,性能不是一个问题,你不应该优化,直到一个分析器给你证明你应该这样做。在所有其他情况下,可读的代码更易读。

答案 3 :(得分:0)

只是要添加另一个选项,如果您希望这个选项最快,请使用Parallel.For而不是正常的for循环。

int resultLength = (floatArray.Length + 3) / 4;
var resultFloat = new float[resultLength];

Parallel.For(0, resultLength, i =>
{
    resultFloat[i] = floatArray[i * 4];
});

答案 4 :(得分:-2)

List<decimal> list = new List<decimal>();
list.Add(1);
list.Add(2);
list.Add(3);
list.Add(4);
list.Add(5);
list.Add(6);
list.Add(7);
list.Add(8);
list.Add(9);
list.Add(10);
list.Add(11);
list.Add(12);
list.Add(13);
list.Add(14);
list.Add(15);
list.Add(16);

var sampleData = list.Where((x, i) => (i + 1) % (4) == 0).ToList();