C#中用Lambda计算分组数据均值时索引越界问题求助
修正分组数据均值计算代码
原代码的核心错误是把数据点的值当成了频率数组的索引——比如你的测试数据里有值3,转成索引就是3,但frequency数组长度是3,最大索引是2,直接导致索引越界。分组数据的均值计算逻辑应该是:每个数据点乘以对应位置的频率,求和得到加权总和,再除以频率的总和。
下面是两种修正后的可行方案:
方案1:使用Zip方法配对数据与频率
public double stat_getMeanGrouped(double[] dataset, double[] frequency) { // 先校验两个数组长度是否一致,避免后续逻辑出错 if (dataset.Length != frequency.Length) throw new ArgumentException("数据集和频率数组的长度必须一致"); // 计算每个数据点的加权值并求和 double weightedSum = dataset.Zip(frequency, (value, freq) => value * freq).Sum(); // 计算总频率 double totalFreq = frequency.Sum(); return weightedSum / totalFreq; }
方案2:使用索引遍历(更直观的基础实现)
public double stat_getMeanGrouped(double[] dataset, double[] frequency) { if (dataset.Length != frequency.Length) throw new ArgumentException("数据集和频率数组的长度必须一致"); double weightedSum = 0; double totalFreq = 0; for (int i = 0; i < dataset.Length; i++) { weightedSum += dataset[i] * frequency[i]; totalFreq += frequency[i]; } return weightedSum / totalFreq; }
测试你给出的调用示例stat_getMeanGrouped(new double[] {1,2,3}, new double[] {1,1,1}),两种方案都会返回预期的2.0。
内容的提问来源于stack exchange,提问作者PrestonJ
相关产品推荐
相关产品推荐

