讲师中心 微信公众号
AI工具推荐 视频效率加速

c++中如何计算标准差与方差_c++数学计算统计函数

阿丽姑娘_7092

阿丽姑娘_7092

发布时间:2026-01-04 17:55:50

|

683人浏览过

|

来源于php中文网

原创

最稳妥方式是用std::accumulate两遍遍历:先求均值,再算平方偏差均值;样本方差除以n-1,总体方差除以n;需预检查NaN/inf、空容器及分母为零。

c++中如何计算标准差与方差_c++数学计算统计函数

std::accumulate 手动计算方差和标准差最稳妥

标准库没有内置的方差或标准差函数,std::valarray 虽有 sum() 但不支持直接求均值平方差;依赖第三方库(如 Boost.Math)会增加构建复杂度。实际项目中,用 std::accumulate 两遍遍历是最可控的方式:第一遍算均值,第二遍算平方偏差均值。

  • 必须先求平均值 mean,再遍历计算 (x - mean) * (x - mean),不能合并成单次 accumulate —— 否则会因浮点精度丢失导致方差为负(尤其数据量大、数值集中时)
  • 样本方差用 n-1 作分母(贝塞尔校正),总体方差用 n;C++ 里需显式判断并传入 ddof = 01
  • 输入容器应为 std::vector<double></double> 或类似可迭代浮点序列,避免整数除法截断
#include <vector>
#include <numeric>
#include <cmath>
<p>double variance(const std::vector<double>& data, int ddof = 0) {
if (data.empty()) return 0.0;
double mean = std::accumulate(data.begin(), data.end(), 0.0) / data.size();
double sum_sq_diff = std::accumulate(data.begin(), data.end(), 0.0,
[mean](double acc, double x) { return acc + (x - mean) * (x - mean); });
return sum_sq_diff / (data.size() - ddof);
}</p><p>double stddev(const std::vector<double>& data, int ddof = 0) {
return std::sqrt(variance(data, ddof));
}</p>

std::valarray 快速原型但慎用于生产

std::valarray 支持向量化运算,写起来简洁,但存在隐式拷贝开销、不支持迭代器、且部分老编译器(如 MSVC 2015 前)实现不全。仅建议在小规模数据、快速验证公式时使用。

  • valarraysum() 返回 double,但中间运算可能触发 promotion 规则,若原始类型是 float,结果仍可能是 float,导致精度不足
  • 无法直接对 valarray<T> 做“减去标量均值”操作而不生成临时对象,内存效率不如手写循环
  • 以下写法看似短,但每次 - mean 都构造新 valarray,不适用于大数据集
#include <valarray>
#include <cmath>
<p>double variance_valarray(const std::valarray<double>& v) {
if (v.size() == 0) return 0.0;
double mean = v.sum() / v.size();
std::valarray<double> diff = v - mean;
return (diff * diff).sum() / v.size();
}</p>

遇到 nan 或负方差?检查输入和溢出路径

调用后得到 nanvariance 返回负值,几乎一定是以下原因:

  • 输入含 NaNinf:用 std::isnan(x)std::isinf(x) 预过滤,否则 (x - mean) 可能传播 nan
  • 数据范围过大导致 (x - mean) * (x - mean) 溢出 double(如 x ≈ 1e155),此时应改用 Welford 在线算法避免大数相减
  • 容器大小为 1 且 ddof = 1 → 分母为 0 → 返回 inf;需在函数开头加 if (data.size() <= ddof) return 0.0;

性能敏感场景用 Welford 算法单趟完成

当数据来自流式输入(如传感器、文件逐行读取)、不能存全量或内存受限时,Welford 方法可在一次遍历中累积计算方差,且数值稳定性优于两遍法。

C++ 算法竞赛自动化测试数据生成与校验框架
C++ 算法竞赛自动化测试数据生成与校验框架

根据原题生成新题面、验证器及完整测试数据,自动套用 testlib 模板,用于用户要求生成测试数据时。

下载

立即学习C++免费学习笔记(深入)”;

  • 核心是维护 Mk(当前均值)和 Sk(平方和修正项),递推更新,无须存储全部数据
  • 最终方差为 S / (n - ddof),其中 S 是递推得到的 Sk
  • 注意:初始 M = 0.0, S = 0.0, n = 0,每来一个 x 更新一次,n 从 1 开始计数
struct Welford {
    double M = 0.0, S = 0.0;
    size_t n = 0;
<pre class='brush:php;toolbar:false;'>void add(double x) {
    n++;
    double delta = x - M;
    M += delta / n;
    S += delta * (x - M);
}

double variance(int ddof = 0) const {
    return n <= static_cast<size_t>(ddof) ? 0.0 : S / (n - ddof);
}

double stddev(int ddof = 0) const {
    return std::sqrt(variance(ddof));
}

};

Welford 算法的数值稳定性常被低估——它真正难处理的是极端情况:比如所有数都接近 1e308,此时 delta 计算仍可能失真。这种时候,要么换更高精度类型(long double),要么做预平移(减去估计均值再算)。

热门AI工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

5347

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

584

2025.10.23

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

3208

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

584

2025.10.23

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

4716

2023.08.14

传感器故障解决方法
传感器故障解决方法

传感器故障排除指南:识别故障症状(如误读或错误代码)。检查电源和连接(确保连接牢固,无损坏)。校准传感器(遵循制造商说明)。诊断内部故障(目视检查、信号测试、环境影响评估)。更换传感器(选择相同规格,遵循安装说明)。验证修复(检查信号准确性,监测异常行为)。

3324

2024.06.04

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

20

2026.09.23

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

0

2026.09.23

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

0

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn