我在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
中,其中每行是一个观察点,每列都是一个要素?
由于
答案 0 :(得分:50)
使用Eigen表达式将利用SIMD和缓存优化算法,所以是的,它肯定会更快,无论如何,编写起来要简单得多:
MatrixXd centered = mat.rowwise() - mat.colwise().mean();
MatrixXd cov = (centered.adjoint() * centered) / double(mat.rows() - 1);
此外,假设“data”是double [21]的typedef,那么你可以使用Map&lt;&gt;将std :: vector视为特征对象的功能:
Map<Matrix<double,Dynamic,21,RowMajor> > mat(&(all_data[0][0], all_data.size(), 21);
答案 1 :(得分:7)
当每一行都是观察时,您可以使用维基百科(http://en.wikipedia.org/wiki/Sample_mean_and_sample_covariance#Sample_covariance)
上显示的样本协方差矩阵的矩阵公式。
这对于特征矩阵乘法等来说相当容易写。对我而言,它是否会更加高效并不明显,我怀疑优化器必须做得非常好(确保至少使用 - O2)。可能值得尝试和分析它。