获取 Eigen::vector 的标准偏差

问题描述

我需要 Eigen 库中向量的标准偏差。我还没有找到。所以我试了一下:

                    <script type="text/javascript">
    let max = 9000;
    let progress = {{ $user->points }};
    document.querySelector(".fill").setAttribute(
    "style","stroke-dashoffset: " + ((100 - progress) / 100) * max);
</script>

但出现错误

错误

Eigen::VectorXd ys(5);
 ys << 1,2,3,4,5;            

double std_dev = sqrt((ys - ys.mean()).square().sum() / (ys.size() - 1)); // Error with minus sign (ys-ys.mean())

解决方法

一个 Eigen::VectorXd is defined as typedef Matrix<double,Dynamic,1> VectorXd; 所以它是一个 Eigen::Matrix 的特殊形式。您正在尝试从向量 ys.mean() 中减去标量 ys,这是一个系数操作。 Eigen::Matrix 类不打算用于系数运算,而是用于线性代数。为了执行系数运算,Eigen 具有 Eigen::Array class

因此,将您的 Eigen::Matrix ys 转换为 Eigen::Array 就足以让您的公式起作用:

double const std_dev = sqrt((ys.array() - ys.mean()).square().sum() / (ys.size() - 1));