【发布时间】:2014-04-25 19:30:22
【问题描述】:
我正在尝试在 C++ 中计算向量的协方差(矩阵)...
我进行了以下操作:
std::vector<std::vector<double> > data = { {2.5, 2.4}, {0.5, 0.7} };
然后我计算并减去平均值,得到以下结果:
data = { {0.05, -0.05}, {-0.1, 0.1} }
据我所知,下一步是转置矩阵,将原点相乘,求和,最后除以维度 X - 1..
我写了以下内容:
void cover(std::vector<std::vector<double> > &d)
{
double cov = 0.0;
for(unsigned i=0; (i < d.size()); i++)
{
for(unsigned j=0; (j < d[i].size()); j++)
{
cov += d[i][j] * d[j][i] / (d[i].size() - 1);
std::cout << cov << " ";
}
std::cout << std::endl;
}
}
其中d 是从每个点中减去平均值后的向量
这给了我结果:
0.0025, 0.0075
0.0125, 0.0225
与matlab相比:
2.0000 1.7000
1.7000 1.4450
有人知道我哪里出错了吗?
谢谢
【问题讨论】:
-
如果你用铅笔和纸完成算法中的步骤,你会得到 Matlab 的结果吗?如果不是,请修复算法。如果是,请逐步调试,看看程序的结果何时与铅笔和纸上的结果不同。
-
为什么不使用矩阵代数库,例如 Eigen?代码会更短更容易。无论如何,您可能需要一个库来计算特征向量。
标签: c++ matrix linear-algebra covariance