52#include <Eigen/SparseCore>
93 static Eigen::VectorXd
combine_xyz(
const Eigen::VectorXd& vec);
132 Eigen::VectorXd& eig,
133 Eigen::MatrixXd& eigvec);
147 const std::string& ch_type,
148 Eigen::VectorXd& eig,
149 Eigen::MatrixXd& eigvec);
161 static Eigen::VectorXi
intersect(
const Eigen::VectorXi &v1,
162 const Eigen::VectorXi &v2,
163 Eigen::VectorXi &idx_sel);
178 static Eigen::SparseMatrix<double>
make_block_diag(
const Eigen::MatrixXd &A,
190 static Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
pinv(
const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& a);
201 static qint32
rank(
const Eigen::MatrixXd& A,
214 static Eigen::VectorXi
sort(Eigen::Matrix<T, Eigen::Dynamic, 1> &v,
229 static Eigen::VectorXi
sort(Eigen::Matrix<T, Eigen::Dynamic, 1> &v_prime,
230 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &mat,
243 static std::vector<Eigen::Triplet<T> >
sortrows(
const std::vector<Eigen::Triplet<T> > &A,
252 const std::pair<int,T>& rhs);
260 const std::pair<int,T>& rhs);
268 const Eigen::Triplet<T> & rhs);
276 const Eigen::Triplet<T> & rhs);
287 std::vector< std::pair<int,T> > t_vecIdxValue;
288 Eigen::VectorXi idx(v.size());
292 for(qint32 i = 0; i < v.size(); ++i)
293 t_vecIdxValue.push_back(std::pair<int,T>(i, v[i]));
300 for(qint32 i = 0; i < v.size(); ++i)
302 idx[i] = t_vecIdxValue[i].first;
303 v[i] = t_vecIdxValue[i].second;
313Eigen::VectorXi
Linalg::sort(Eigen::Matrix<T, Eigen::Dynamic, 1> &v_prime,
314 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &mat,
319 if(v_prime.size() > 0)
321 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> newMat(mat.rows(), mat.cols());
322 for(qint32 i = 0; i < idx.size(); ++i)
323 newMat.col(i) = mat.col(idx[i]);
336 std::vector<Eigen::Triplet<T> > p_ASorted;
338 for(quint32 i = 0; i < A.size(); ++i)
339 p_ASorted.push_back(A[i]);
353 const std::pair<int,T>& rhs)
355 return lhs.second > rhs.second;
362 const std::pair<int,T>& rhs)
364 return lhs.second < rhs.second;
371 const Eigen::Triplet<T> & rhs)
373 return lhs.row() < rhs.row();
380 const Eigen::Triplet<T> & rhs)
382 return lhs.col() < rhs.col();
388Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
Linalg::pinv(
const Eigen::Matrix<T,
392 double epsilon = std::numeric_limits<double>::epsilon();
393 Eigen::JacobiSVD< Eigen::MatrixXd > svd(a, Eigen::ComputeThinU | Eigen::ComputeThinV);
394 double tolerance = epsilon * std::max(a.cols(), a.rows()) * svd.singularValues().array().abs()(0);
395 return svd.matrixV() * (svd.singularValues().array().abs() > tolerance).select(svd.singularValues().array().inverse(), 0).matrix().asDiagonal() * svd.matrixU().adjoint();
math library export/import macros.
#define MATHSHARED_EXPORT
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
Static linear algebra utility functions.
static bool compareIdxValuePairSmallerThan(const std::pair< int, T > &lhs, const std::pair< int, T > &rhs)
static Eigen::VectorXd combine_xyz(const Eigen::VectorXd &vec)
static bool compareTripletFirstEntry(const Eigen::Triplet< T > &lhs, const Eigen::Triplet< T > &rhs)
static Eigen::VectorXi sort(Eigen::Matrix< T, Eigen::Dynamic, 1 > &v, bool desc=true)
static qint32 rank(const Eigen::MatrixXd &A, double tol=1e-8)
static void get_whitener(Eigen::MatrixXd &A, bool pca, const std::string &ch_type, Eigen::VectorXd &eig, Eigen::MatrixXd &eigvec)
std::pair< int, int > IdxIntValue
static void get_whitener(Eigen::MatrixXd &A, bool pca, QString ch_type, Eigen::VectorXd &eig, Eigen::MatrixXd &eigvec)
static Eigen::VectorXi intersect(const Eigen::VectorXi &v1, const Eigen::VectorXi &v2, Eigen::VectorXi &idx_sel)
static bool compareIdxValuePairBiggerThan(const std::pair< int, T > &lhs, const std::pair< int, T > &rhs)
static double getConditionNumber(const Eigen::MatrixXd &A, Eigen::VectorXd &s)
static std::vector< Eigen::Triplet< T > > sortrows(const std::vector< Eigen::Triplet< T > > &A, qint32 column=0)
static double getConditionSlope(const Eigen::MatrixXd &A, Eigen::VectorXd &s)
static bool compareTripletSecondEntry(const Eigen::Triplet< T > &lhs, const Eigen::Triplet< T > &rhs)
static Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > pinv(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &a)
static Eigen::SparseMatrix< double > make_block_diag(const Eigen::MatrixXd &A, qint32 n)