最近项目中要获取数组数据的标准差值,在matlab中一个std()函数就实现了,在C#源代码中参照matlab说明
/// <summary>
/// 计算标准偏差
/// </summary>
/// <param name="numberList"></param>
/// <returns></returns>
public static double CalcStandardDeviation(this List<double> numberList)
{
float x2 = 0; //X平方
float sumx = 0;
double ret = 0.0;
if (!numberList.Any()) //序列中包含数据
return ret;
int n = numberList.Count;
foreach (float d in numberList)
{
x2 += d * d;
sumx += d;
}
if (n > 1)
ret = Math.Sqrt((x2 * n - sumx * sumx) / (n * (n - 1)));
return ret;
}
计算结果与std()是不通的,经过测试发现matlab中的标准差有std()和std2()两个,经研究发现两种结果是一个是样本标准差,一个是总体标准差
与matlab中std()函数对应的算法应该为:
/// <summary>
/// 获取标准差,求传入数组的标准差 总体标准偏差
/// </summary>
/// <param name="numberList">数组</param>
/// <returns></returns>
public static double CalcStandardDeviationP(this List<double> numberList)
{
double ret = 0.0;
if (!numberList.Any()) //序列中包含数据
return ret;
int n = numberList.Count;
// 计算平均数
double avg = numberList.Average();
// 计算各数值与平均数的差值的平方,然后求和
double sumx = numberList.Sum(d => Math.Pow(d - avg, 2));
// 除以数量,然后开方
if (n > 0)
ret = Math.Sqrt(sumx / n);
return ret;
}
与matlab中std2()函数对应的算法应该为:
/// <summary>
/// 样本标准偏差,求传入数组的标准偏差
/// </summary>
/// <param name="numberList">数组</param>
/// <returns></returns>
public static double CalcStandardDeviationS(this List<double> numberList)
{
double ret = 0.0;
if (!numberList.Any()) //序列中包含数据
return ret;
int n = numberList.Count;
// 计算平均数
double avg = numberList.Average();
// 计算各数值与平均数的差值的平方,然后求和
double sumx = numberList.Sum(d => Math.Pow(d - avg, 2));
// 除以数量-1,然后开方
if (n > 1)
ret = Math.Sqrt(sumx / (n - 1));
return ret;
}