c# - 从多个数字数组创建平均数组的最快方法

标签 c# arrays

我有多个 Float 输入数组,它们的大小都相同,只有一个维度。我想创建一个包含所有输入数组的平均值的输出数组。

例如

//input arrays
float[] array1 = new float[] { 1, 1, 1, 1 };
float[] array2 = new float[] { 2, 2, 2, 2 };
float[] array3 = new float[] { 3, 3, 3, 3 };
float[] array4 = new float[] { 4, 4, 4, 4 };

//the output should be
float[2.5, 2.5, 2.5, 2.5]

我还想计算输入数组的标准差。

完成这项任务最快的方法是什么?

提前致谢。 皮特

最佳答案

LINQ 来拯救

这个答案详细说明了如何使用 LINQ 来实现目标,最大的可重用性和通用性是主要目标。

取1(为了方便把LINQ封装成方法)

采用这种方法:

float[] ArrayAverage(params float[][] arrays)
{
    // If you want to check that all arrays are the same size, something
    // like this is convenient:
    // var arrayLength = arrays.Select(a => a.Length).Distinct().Single();

    return Enumerable.Range(0, arrays[0].Length)
               .Select(i => arrays.Select(a => a.Skip(i).First()).Average())
               .ToArray();
}

它的工作原理是取范围 [0..arrays.Length-1] 并为范围内的每个数字 i 计算 的平均值 每个数组的第 i 个元素。使用起来非常方便:

float[] array1 = new float[] { 1, 1, 1, 1 };
float[] array2 = new float[] { 2, 2, 2, 2 };
float[] array3 = new float[] { 3, 3, 3, 3 };
float[] array4 = new float[] { 4, 4, 4, 4 };

var averages = ArrayAverage(array1, array2, array3, array4);

这已经可以用于任意数量的数组而无需修改。但是您可以再走一步,做一些更通用的事情。

Take 2(泛化任何聚合函数)

float[] ArrayAggregate(Func<IEnumerable<float>, float> aggregate, params float[][] arrays)
{
    return Enumerable.Range(0, arrays[0].Length)
               .Select(i => aggregate(arrays.Select(a => a.Skip(i).First())))
               .ToArray();
}

这可用于计算任何聚合函数:

var output = ArrayAggregate(Enumerable.Average, array1, array2, array3, array4);

您可以用任何方法、扩展方法或匿名函数代替 Enumerable.Average —— 这很有用,因为没有内置的标准差聚合函数,而且这样 ArrayAggregate 函数非常通用。但我们仍然可以做得更好。

Take 3(泛化任何聚合函数和任何类型的数组)

我们还可以制作一个适用于任何内置类型的通用版本:

T[] ArrayAggregate<T>(Func<IEnumerable<T>, T> aggregate, params T[][] arrays)
{
    return Enumerable.Range(0, arrays[0].Length)
               .Select(i => aggregate(arrays.Select(a => a.Skip(i).First())))
               .ToArray();
}

您可能会说,这不是完成这项工作最快的代码。如果您的程序整天都在计算平均值,请使用更接近金属的东西。但是,如果您想要可重用性和多功能性,我认为没有比上述更好的了。

关于c# - 从多个数字数组创建平均数组的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6392653/

相关文章:

java - 理解合并排序的栅栏处理问题

c# - DateTime.DayOfWeek 微优化

python - 使用 ctypes 将路径从 python 2 和 3 传递到 c++

c# - 如何去除 C# 代码中除 <br> 之外的所有 html 标签?

java - 2 种方式与谷歌日历/Outlook 同步

c - 如何在 C 中检查数组重复项

arrays - Azure ARM 模板 : How to use Copy to generate both property name and property value

c++ - 具有多个参数的对象数组

c# - 如何在aspx页面中通过jquery ajax调用httphandler?

c# - 找不到类型或命名空间 'DocumentFormat' - 仅在生成时 - 但智能感知显示类型可用