C# 通过平均化减少数组大小

C# 通过平均化减少数组大小,c#,arrays,linq,compression,ienumerable,C#,Arrays,Linq,Compression,Ienumerable,我有一个大的采样波形,我想记录它的压缩版本,通过重新采样(平均)到一个较低的速率进行诊断。较低的利率将始终是原始利率的偶数除数。 例如:通过平均8个样本块,将32K波形压缩为4K波形 使用Linq/IEnumerable有没有一种简单的方法可以做到这一点?不是很纯的Linq,但这可以做到: int divisor = 2; int index = 0; var cutSamples = samples .GroupBy(s => index++ / divisor) .Se

我有一个大的采样波形,我想记录它的压缩版本,通过重新采样(平均)到一个较低的速率进行诊断。较低的利率将始终是原始利率的偶数除数。 例如:通过平均8个样本块,将32K波形压缩为4K波形


使用Linq/IEnumerable有没有一种简单的方法可以做到这一点?不是很纯的Linq,但这可以做到:

int divisor = 2;
int index = 0;
var cutSamples = samples
    .GroupBy(s => index++ / divisor)
    .Select(g => g.Average());
在性能方面,Linq不是您的朋友,因此这将快得多:

public static double[] CutSamples(double[] samples, int divisor)
{
    var reducedSamples = new double[samples.Length / divisor];
    int reducedIndex = 0;
    for (int i = 0; i < samples.Length; i += divisor)
    {
        double sum = 0;
        int count = 0;
        for (int j = 0; j < divisor && (i + j) < samples.Length; j++)
        {
            sum += samples[i + j];
            count++;
        }

        reducedSamples[reducedIndex++] = sum / count;
    }

    return reducedSamples;
}
公共静态双[]样本(双[]样本,整数除数)
{
var reducedSamples=新的双精度[samples.Length/除数];
int-reducedIndex=0;
for(int i=0;i
为什么说循环比Linq快?有没有关于这方面的研究/报告?Linq在性能上充其量与手写代码相当。大多数情况下,它会变慢——有时会急剧变慢,就像在这种情况下一样。GroupBy是一种通用的东西,它根据一个键对元素进行分组。但为了让它遍历任何组,它必须通过遍历每个项目并分配内存来构建每个组。这意味着它速度较慢,占用的内存也更多。我建议你两种都试试,看看你更喜欢哪一种。对于较小的阵列尺寸,Linq版本将非常好。@Aybe您的意思是什么?可能您的方法可能无法保留信号的特征,您将发现有价值的峰间振幅。考虑一下(虽然我不能说那里有什么话题)。我请求的东西会达到我的目的。情况是,我正在记录波形数字化仪(类似于示波器)的结果,我需要捕获另一个需要更快采样率的信号;但是,我希望当前记录的频道保持不变。我以前用Linq做过类似的事情;但是,我不经常使用它,我想看看其他人会如何实现结果。CPU时间可能不是一个因素。