gpt4 book ai didi

c++ - Eigen:是否有计算样本协方差的内置方法

转载 作者:IT老高 更新时间:2023-10-28 22:31:27 27 4
gpt4 key购买 nike

我在 C++ 中使用 Eigen 库:我目前正在自己​​计算协方差矩阵,如下所示:

Eigen::MatrixXd covariance_matrix = Eigen::MatrixXd::Constant(21, 21, 0);
data mean = calc_mean(all_data)
for(int j = 0; j < 21; j++){
for(int k = 0; k < 21; k++){
for(std::vector<data>::iterator it = all_data.begin(); it!= all_data.end(); it++){
covariance_matrix(j,k) += ((*it)[j] - mean[j]) * ((*it)[k] - mean[k]);
}
covariance_matrix(j,k) /= all_data.size() - 1;
}
}

是否有使用 Eigen 库的内置/更优化的方法来执行此操作?例如,如果我将数据存储在 MatrixXd 中,其中每一行是一个观察值,每一列是一个特征?

谢谢

最佳答案

使用 Eigen 表达式将利用 SIMD 和缓存优化算法,所以是的,它肯定会更快,并且无论如何,编写起来更简单:

MatrixXd centered = mat.rowwise() - mat.colwise().mean();
MatrixXd cov = (centered.adjoint() * centered) / double(mat.rows() - 1);

此外,假设“data”是 double[21] 的 typedef,那么您可以使用 Map<> 功能将 std::vector 视为 Eigen 对象:

Map<Matrix<double,Dynamic,21,RowMajor> > mat(&(all_data[0][0], all_data.size(), 21);

关于c++ - Eigen:是否有计算样本协方差的内置方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15138634/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com