13 #include <tracking/trackFindingVXD/filterTools/DecorrelationMatrixHelper.h>
16 #include <Eigen/Eigenvalues>
37 template<
size_t Ndims>
38 class DecorrelationMatrix {
41 using MatrixT = Eigen::Matrix<double, Ndims, Ndims, Eigen::RowMajor>;
67 std::vector<double>
decorrelate(
const std::vector<double>& inputVec)
const;
70 std::vector<double>
decorrelate(
const std::array<double, Ndims>& inputs)
const;
75 std::array<std::vector<double>, Ndims>
decorrelate(
const std::array<std::vector<double>, Ndims>& inputMat)
const;
80 std::string
print()
const;
99 template<
size_t Ndims>
105 template<
size_t Ndims>
109 Eigen::SelfAdjointEigenSolver<MatrixT> eigenSolver(covMatrix);
110 const MatrixT U = eigenSolver.eigenvectors();
115 const MatrixT D = eigenSolver.eigenvalues().cwiseSqrt().cwiseInverse().asDiagonal();
122 template<
size_t Ndims>
125 using RVector = Eigen::Matrix<double, 1, Ndims, Eigen::RowMajor>;
126 Eigen::Map<const RVector> input(inputVec.data(), Ndims);
128 const RVector transform = input * m_matrix;
130 return std::vector<double>(transform.data(), transform.data() + transform.size());
133 template<
size_t Ndims>
136 return decorrelate(std::vector<double>(input.begin(), input.end()));
139 template<
size_t Ndims>
140 std::array<std::vector<double>, Ndims>
143 using DVector = Eigen::Matrix<double, Eigen::Dynamic, 1, Eigen::ColMajor>;
144 using DMatrix = Eigen::Matrix<double, Eigen::Dynamic, Ndims, Eigen::ColMajor>;
146 size_t nSamples = inputMat[0].size();
147 DMatrix dataMatrix(nSamples, Ndims);
148 for (
size_t i = 0; i < Ndims; ++i) {
149 dataMatrix.col(i) = Eigen::Map<const DVector>(inputMat[i].data(), inputMat[i].size());
152 DMatrix transform = dataMatrix * m_matrix;
154 std::array<std::vector<double>, Ndims> output;
155 for (
size_t i = 0; i < Ndims; ++i) {
156 output[i] = std::vector<double>(transform.col(i).data(), transform.col(i).data() + transform.col(i).size());
162 template<
size_t Ndims>
165 std::stringstream sstr{};
166 sstr << std::setprecision(std::numeric_limits<double>::digits10 + 1) << m_matrix;
170 template<
size_t Ndims>
174 using RVector = Eigen::Matrix<double, 1, Ndims, Eigen::RowMajor>;
177 while (iRow < Ndims) {
179 if (is.eof())
return false;
180 std::getline(is, line);
181 if (line.empty())
continue;
182 std::stringstream lstr(line);
183 std::array<double, Ndims> linevalues;
184 for (
double& value : linevalues) {
185 if (lstr.eof())
return false;
188 inMat.row(iRow) = Eigen::Map<const RVector>(linevalues.data(), linevalues.size());