C# matlab中标准差计算方法

        最近项目中要获取数组数据的标准差值,在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;
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顺7自然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值