46#include <Eigen/SparseCore>
89 static Eigen::VectorXd
combine_xyz(
const Eigen::VectorXd& vec);
128 Eigen::VectorXd& eig,
129 Eigen::MatrixXd& eigvec);
143 const std::string& ch_type,
144 Eigen::VectorXd& eig,
145 Eigen::MatrixXd& eigvec);
157 static Eigen::VectorXi
intersect(
const Eigen::VectorXi &v1,
158 const Eigen::VectorXi &v2,
159 Eigen::VectorXi &idx_sel);
174 static Eigen::SparseMatrix<double>
make_block_diag(
const Eigen::MatrixXd &A,
186 static Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
pinv(
const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& a);
197 static qint32
rank(
const Eigen::MatrixXd& A,
210 static Eigen::VectorXi
sort(Eigen::Matrix<T, Eigen::Dynamic, 1> &v,
225 static Eigen::VectorXi
sort(Eigen::Matrix<T, Eigen::Dynamic, 1> &v_prime,
226 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &mat,
239 static std::vector<Eigen::Triplet<T> >
sortrows(
const std::vector<Eigen::Triplet<T> > &A,
248 const std::pair<int,T>& rhs);
256 const std::pair<int,T>& rhs);
264 const Eigen::Triplet<T> & rhs);
272 const Eigen::Triplet<T> & rhs);
283 std::vector< std::pair<int,T> > t_vecIdxValue;
284 Eigen::VectorXi idx(v.size());
288 for(qint32 i = 0; i < v.size(); ++i)
289 t_vecIdxValue.push_back(std::pair<int,T>(i, v[i]));
296 for(qint32 i = 0; i < v.size(); ++i)
298 idx[i] = t_vecIdxValue[i].first;
299 v[i] = t_vecIdxValue[i].second;
309Eigen::VectorXi
Linalg::sort(Eigen::Matrix<T, Eigen::Dynamic, 1> &v_prime,
310 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &mat,
315 if(v_prime.size() > 0)
317 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> newMat(mat.rows(), mat.cols());
318 for(qint32 i = 0; i < idx.size(); ++i)
319 newMat.col(i) = mat.col(idx[i]);
332 std::vector<Eigen::Triplet<T> > p_ASorted;
334 for(quint32 i = 0; i < A.size(); ++i)
335 p_ASorted.push_back(A[i]);
349 const std::pair<int,T>& rhs)
351 return lhs.second > rhs.second;
358 const std::pair<int,T>& rhs)
360 return lhs.second < rhs.second;
367 const Eigen::Triplet<T> & rhs)
369 return lhs.row() < rhs.row();
376 const Eigen::Triplet<T> & rhs)
378 return lhs.col() < rhs.col();
384Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
Linalg::pinv(
const Eigen::Matrix<T,
388 double epsilon = std::numeric_limits<double>::epsilon();
389 Eigen::JacobiSVD< Eigen::MatrixXd >
svd(a, Eigen::ComputeThinU | Eigen::ComputeThinV);
390 double tolerance = epsilon * std::max(a.cols(), a.rows()) *
svd.singularValues().array().abs()(0);
391 return svd.matrixV() * (
svd.singularValues().array().abs() > tolerance).select(
svd.singularValues().array().inverse(), 0).matrix().asDiagonal() *
svd.matrixU().adjoint();
Eigen::JacobiSVD< Eigen::Matrix3f > svd(S, Eigen::ComputeFullU|Eigen::ComputeFullV)
Export/import macros and build-stamp accessors for MATHLIB.
#define MATHSHARED_EXPORT
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
Static Eigen-based linear-algebra helpers used across MATHLIB and the inverse solvers.
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)