46#include <Eigen/SparseCore>
91 static Eigen::VectorXd
combine_xyz(
const Eigen::VectorXd& vec);
130 Eigen::VectorXd& eig,
131 Eigen::MatrixXd& eigvec);
145 const std::string& ch_type,
146 Eigen::VectorXd& eig,
147 Eigen::MatrixXd& eigvec);
159 static Eigen::VectorXi
intersect(
const Eigen::VectorXi& v1,
160 const Eigen::VectorXi& v2,
161 Eigen::VectorXi& idx_sel);
176 static Eigen::SparseMatrix<double>
make_block_diag(
const Eigen::MatrixXd& A,
188 static Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
pinv(
const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& a);
199 static qint32
rank(
const Eigen::MatrixXd& A,
212 static Eigen::VectorXi
sort(Eigen::Matrix<T, Eigen::Dynamic, 1>& v,
227 static Eigen::VectorXi
sort(Eigen::Matrix<T, Eigen::Dynamic, 1>& v_prime,
228 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& mat,
241 static std::vector<Eigen::Triplet<T>>
sortrows(
const std::vector<Eigen::Triplet<T>>& A,
254 const std::pair<int, T>& rhs);
266 const std::pair<int, T>& rhs);
278 const Eigen::Triplet<T>& rhs);
290 const Eigen::Triplet<T>& rhs);
301 std::vector<std::pair<int, T>> t_vecIdxValue;
302 Eigen::VectorXi idx(v.size());
305 for (qint32 i = 0; i < v.size(); ++i)
306 t_vecIdxValue.push_back(std::pair<int, T>(i, v[i]));
313 for (qint32 i = 0; i < v.size(); ++i) {
314 idx[i] = t_vecIdxValue[i].first;
315 v[i] = t_vecIdxValue[i].second;
325Eigen::VectorXi
Linalg::sort(Eigen::Matrix<T, Eigen::Dynamic, 1>& v_prime,
326 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& mat,
331 if (v_prime.size() > 0) {
332 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> newMat(mat.rows(), mat.cols());
333 for (qint32 i = 0; i < idx.size(); ++i)
334 newMat.col(i) = mat.col(idx[i]);
347 std::vector<Eigen::Triplet<T>> p_ASorted;
349 for (quint32 i = 0; i < A.size(); ++i)
350 p_ASorted.push_back(A[i]);
364 const std::pair<int, T>& rhs)
366 return lhs.second > rhs.second;
373 const std::pair<int, T>& rhs)
375 return lhs.second < rhs.second;
382 const Eigen::Triplet<T>& rhs)
384 return lhs.row() < rhs.row();
391 const Eigen::Triplet<T>& rhs)
393 return lhs.col() < rhs.col();
399Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
Linalg::pinv(
const Eigen::Matrix<T,
403 double epsilon = std::numeric_limits<double>::epsilon();
404 Eigen::JacobiSVD<Eigen::MatrixXd>
svd(a, Eigen::ComputeThinU | Eigen::ComputeThinV);
405 double tolerance = epsilon * std::max(a.cols(), a.rows()) *
svd.singularValues().array().abs()(0);
406 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.
std::pair< int, int > IdxIntValue
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)
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)