使用LINQ计算float数组列表的对应元素平均值
使用LINQ计算List<float[]>对应位置元素的平均值
假设你所有的向量(float数组)长度一致,下面是用LINQ实现的核心代码:
List<float[]> vectors = new List<float[]> { new float[] {1.0f, 2.0f, 3.0f}, new float[] {4.0f, 5.0f, 6.0f}, new float[] {7.0f, 8.0f, 9.0f} }; // 处理空列表的情况 if (!vectors.Any()) { return Array.Empty<float>(); } int vectorLength = vectors[0].Length; float[] averages = Enumerable.Range(0, vectorLength) // 对每个索引,计算所有向量该位置的平均值 .Select(index => vectors.Average(vector => vector[index])) // 将double类型的平均值转换为float .Select(avg => (float)avg) .ToArray();
关键步骤说明
- 先用
Any()检查列表是否为空,避免后续访问vectors[0]时抛出空引用异常 Enumerable.Range(0, vectorLength)生成每个元素的索引,覆盖向量的所有位置vectors.Average(vector => vector[index])计算所有向量在当前索引位置的平均值(注意Average方法返回double类型,需要显式转换为float)- 最后用
ToArray()将LINQ查询结果转换为目标float数组
处理向量长度不一致的情况
如果你的列表中存在长度不同的向量,有两种常见处理方式:
- 取最短向量的长度计算:只计算所有向量都有的位置的平均值
if (!vectors.Any()) { return Array.Empty<float>(); } int minLength = vectors.Min(v => v.Length); float[] averages = Enumerable.Range(0, minLength) .Select(index => vectors.Average(vector => vector[index])) .Select(avg => (float)avg) .ToArray();
- 强制要求所有向量长度一致:如果存在长度不同的向量,直接抛出异常
if (!vectors.Any()) { return Array.Empty<float>(); } int vectorLength = vectors[0].Length; if (vectors.Any(v => v.Length != vectorLength)) { throw new ArgumentException("所有向量的长度必须相同"); } float[] averages = Enumerable.Range(0, vectorLength) .Select(index => vectors.Average(vector => vector[index])) .Select(avg => (float)avg) .ToArray();
内容的提问来源于stack exchange,提问作者TonySoprano
相关产品推荐
相关产品推荐

