14 #include <framework/logging/Logger.h>
38 template<
size_t Ndims>
39 const Eigen::Matrix<double, Ndims, Ndims, Eigen::RowMajor>
calculateCovMatrix(std::array<std::vector<double>, Ndims> inputData)
42 using RVector = Eigen::Matrix<double, 1, Ndims, Eigen::RowMajor>;
43 using DMatrix = Eigen::Matrix<double, Eigen::Dynamic, Ndims, Eigen::ColMajor>;
44 using DVector = Eigen::Matrix<double, Eigen::Dynamic, 1>;
47 size_t nSamples = inputData[0].size();
48 for (
size_t i = 1; i < Ndims; ++i) {
49 if (inputData[i].size() != nSamples) {
50 B2ERROR(
"The input data is no MxN matrix, cannot calculate covariance matrix! Returning identity");
51 return Eigen::Matrix<double, Ndims, Ndims, Eigen::RowMajor>::Identity();
57 for (
size_t i = 0; i < Ndims; ++i) {
58 meanVector(i) = std::accumulate(inputData[i].begin(), inputData[i].end(), 0.0) / inputData[i].size();
62 DMatrix dataMatrix(nSamples, Ndims);
63 for (
size_t i = 0; i < Ndims; ++i) {
64 dataMatrix.col(i) = Eigen::Map<const DVector>(inputData[i].data(), inputData[i].size());
68 DMatrix meanMatrix(nSamples, Ndims);
69 for (
size_t i = 0; i < Ndims; ++i) {
70 meanMatrix.col(i) = DVector::Ones(nSamples) * meanVector(i);
75 return (dataMatrix - meanMatrix).transpose() * (dataMatrix - meanMatrix) / (nSamples);