#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));