Получение стандартного отклонения собственного::вектора

#c #eigenvector

Вопрос:

Мне нужно иметь стандартное отклонение вектора в собственной библиотеке. Я его так и не нашел. Поэтому я попробовал это сделать:

 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())
 

Но получаю ошибку.

ошибка:

 Severity    Code    Description Project File    Line    Suppression State
Error (active)  E0349   no operator "-" matches these operands  
 

Ответ №1:

An Eigen::VectorXd определяется так typedef Matrix<double, Dynamic, 1> VectorXd; , что это особая форма an Eigen::Matrix . Вы пытаетесь вычесть скаляр ys.mean() из вектора ys , что является операцией с учетом коэффициентов. Класс Eigen::Matrix предназначен не для использования с операциями с коэффициентами, а для линейной алгебры. Для выполнения операций с коэффициентами у Eigen есть Eigen::Array класс.

Поэтому достаточно преобразовать ваш Eigen::Matrix ys в an Eigen::Array , чтобы ваша формула работала:

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