11 #include <tracking/trackFindingVXD/filterTools/DecorrelationMatrixHelper.h>
14 #include <Eigen/Eigenvalues>
35 template<
size_t Ndims>
39 using MatrixT = Eigen::Matrix<double, Ndims, Ndims, Eigen::RowMajor>;
65 std::vector<double>
decorrelate(
const std::vector<double>& inputVec)
const;
68 std::vector<double>
decorrelate(
const std::array<double, Ndims>& inputs)
const;
73 std::array<std::vector<double>, Ndims>
decorrelate(
const std::array<std::vector<double>, Ndims>& inputMat)
const;
97 template<
size_t Ndims>
103 template<
size_t Ndims>
107 Eigen::SelfAdjointEigenSolver<MatrixT> eigenSolver(covMatrix);
108 const MatrixT U = eigenSolver.eigenvectors();
113 const MatrixT D = eigenSolver.eigenvalues().cwiseSqrt().cwiseInverse().asDiagonal();
120 template<
size_t Ndims>
123 using RVector = Eigen::Matrix<double, 1, Ndims, Eigen::RowMajor>;
124 Eigen::Map<const RVector> input(inputVec.data(), Ndims);
126 const RVector transform = input * m_matrix;
128 return std::vector<double>(transform.data(), transform.data() + transform.size());
131 template<
size_t Ndims>
134 return decorrelate(std::vector<double>(input.begin(), input.end()));
137 template<
size_t Ndims>
138 std::array<std::vector<double>, Ndims>
141 using DVector = Eigen::Matrix<double, Eigen::Dynamic, 1, Eigen::ColMajor>;
142 using DMatrix = Eigen::Matrix<double, Eigen::Dynamic, Ndims, Eigen::ColMajor>;
144 size_t nSamples = inputMat[0].size();
145 DMatrix dataMatrix(nSamples, Ndims);
146 for (
size_t i = 0; i < Ndims; ++i) {
147 dataMatrix.col(i) = Eigen::Map<const DVector>(inputMat[i].data(), inputMat[i].size());
150 DMatrix transform = dataMatrix * m_matrix;
152 std::array<std::vector<double>, Ndims> output;
153 for (
size_t i = 0; i < Ndims; ++i) {
154 output[i] = std::vector<double>(transform.col(i).data(), transform.col(i).data() + transform.col(i).size());
160 template<
size_t Ndims>
163 std::stringstream sstr{};
164 sstr << std::setprecision(std::numeric_limits<double>::digits10 + 1) << m_matrix;
168 template<
size_t Ndims>
172 using RVector = Eigen::Matrix<double, 1, Ndims, Eigen::RowMajor>;
175 while (iRow < Ndims) {
177 if (is.eof())
return false;
178 std::getline(is, line);
179 if (line.empty())
continue;
180 std::stringstream lstr(line);
181 std::array<double, Ndims> linevalues;
182 for (
double& value : linevalues) {
183 if (lstr.eof())
return false;
186 inMat.row(iRow) = Eigen::Map<const RVector>(linevalues.data(), linevalues.size());
Class holding a Matrix that can be used to decorrelate input data to Machine Learning classifiers.
DecorrelationMatrix(const MatrixT &matrix=MatrixT::Identity())
default constructor: initializes to identity matrix or to passed matrix
const MatrixT & getMatrix() const
get the currently stored matrix
MatrixT m_matrix
internal matrix holding the data
void calculateDecorrMatrix(const MatrixT &covMatrix, bool normalise=true)
calculate the matrix that can be used to decorrelate the data that yield the passed covariance matrix...
DecorrelationMatrix & operator=(const DecorrelationMatrix &rhs)=default
assignment operator
DecorrelationMatrix(const DecorrelationMatrix &matrix)=default
copy constructor
Eigen::Matrix< double, Ndims, Ndims, Eigen::RowMajor > MatrixT
typedef for consistent type across class
const Eigen::Matrix< double, Ndims, Ndims, Eigen::RowMajor > calculateCovMatrix(std::array< std::vector< double >, Ndims > inputData)
calculates the empirical covariance matrix from the inputData.
std::vector< double > decorrelate(const std::vector< double > &inputVec) const
"decorrelate" one measurement (i.e.
std::vector< double > decorrelate(const std::array< double, Ndims > &inputs) const
"decorrelate" one measurement (i.e.
void calculateDecorrMatrix(std::array< std::vector< double >, Ndims > inputData, bool normalise=true)
calculate the transformation matrix that when applied to the input data yields linearly uncorrelated ...
bool readFromStream(std::istream &is)
read from stream.
std::string print() const
print the matrix to a string.
std::array< std::vector< double >, Ndims > decorrelate(const std::array< std::vector< double >, Ndims > &inputMat) const
decorrelate M measurements (i.e.
Abstract base class for different kinds of events.