v2.0.0
Loading...
Searching...
No Matches
linalg.h
Go to the documentation of this file.
1//=============================================================================================================
28
29#ifndef LINALG_H
30#define LINALG_H
31
32//=============================================================================================================
33// INCLUDES
34//=============================================================================================================
35
36#include "math_global.h"
37
38#include <utility>
39#include <vector>
40
41//=============================================================================================================
42// EIGEN INCLUDES
43//=============================================================================================================
44
45#include <Eigen/Core>
46#include <Eigen/SparseCore>
47#include <Eigen/SVD>
48
49//=============================================================================================================
50// QT INCLUDES
51//=============================================================================================================
52
53#include <QString>
54
55//=============================================================================================================
56// DEFINE NAMESPACE UTILSLIB
57//=============================================================================================================
58
59namespace UTILSLIB
60{
61
62//=============================================================================================================
73{
74public:
75 typedef std::pair<int, int> IdxIntValue;
76
77 //=========================================================================================================
81 ~Linalg() = default;
82
83 //=========================================================================================================
91 static Eigen::VectorXd combine_xyz(const Eigen::VectorXd& vec);
92
93 //=========================================================================================================
102 static double getConditionNumber(const Eigen::MatrixXd& A,
103 Eigen::VectorXd& s);
104
105 //=========================================================================================================
114 static double getConditionSlope(const Eigen::MatrixXd& A,
115 Eigen::VectorXd& s);
116
117 //=========================================================================================================
127 static void get_whitener(Eigen::MatrixXd& A,
128 bool pca,
129 QString ch_type,
130 Eigen::VectorXd& eig,
131 Eigen::MatrixXd& eigvec);
132
133 //=========================================================================================================
143 static void get_whitener(Eigen::MatrixXd& A,
144 bool pca,
145 const std::string& ch_type,
146 Eigen::VectorXd& eig,
147 Eigen::MatrixXd& eigvec);
148
149 //=========================================================================================================
159 static Eigen::VectorXi intersect(const Eigen::VectorXi& v1,
160 const Eigen::VectorXi& v2,
161 Eigen::VectorXi& idx_sel);
162
163 //=========================================================================================================
176 static Eigen::SparseMatrix<double> make_block_diag(const Eigen::MatrixXd& A,
177 qint32 n);
178
179 //=========================================================================================================
187 template<typename T>
188 static Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> pinv(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& a);
189
190 //=========================================================================================================
199 static qint32 rank(const Eigen::MatrixXd& A,
200 double tol = 1e-8);
201
202 //=========================================================================================================
211 template<typename T>
212 static Eigen::VectorXi sort(Eigen::Matrix<T, Eigen::Dynamic, 1>& v,
213 bool desc = true);
214
215 //=========================================================================================================
226 template<typename T>
227 static Eigen::VectorXi sort(Eigen::Matrix<T, Eigen::Dynamic, 1>& v_prime,
228 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& mat,
229 bool desc = true);
230
231 //=========================================================================================================
240 template<typename T>
241 static std::vector<Eigen::Triplet<T>> sortrows(const std::vector<Eigen::Triplet<T>>& A,
242 qint32 column = 0);
243
244 //=========================================================================================================
252 template<typename T>
253 static inline bool compareIdxValuePairBiggerThan(const std::pair<int, T>& lhs,
254 const std::pair<int, T>& rhs);
255
256 //=========================================================================================================
264 template<typename T>
265 static inline bool compareIdxValuePairSmallerThan(const std::pair<int, T>& lhs,
266 const std::pair<int, T>& rhs);
267
268 //=========================================================================================================
276 template<typename T>
277 static inline bool compareTripletFirstEntry(const Eigen::Triplet<T>& lhs,
278 const Eigen::Triplet<T>& rhs);
279
280 //=========================================================================================================
288 template<typename T>
289 static inline bool compareTripletSecondEntry(const Eigen::Triplet<T>& lhs,
290 const Eigen::Triplet<T>& rhs);
291};
292
293//=============================================================================================================
294// INLINE & TEMPLATE DEFINITIONS
295//=============================================================================================================
296
297template<typename T>
298Eigen::VectorXi Linalg::sort(Eigen::Matrix<T, Eigen::Dynamic, 1>& v,
299 bool desc)
300{
301 std::vector<std::pair<int, T>> t_vecIdxValue;
302 Eigen::VectorXi idx(v.size());
303
304 if (v.size() > 0) {
305 for (qint32 i = 0; i < v.size(); ++i)
306 t_vecIdxValue.push_back(std::pair<int, T>(i, v[i]));
307
308 if (desc)
309 std::sort(t_vecIdxValue.begin(), t_vecIdxValue.end(), Linalg::compareIdxValuePairBiggerThan<T>);
310 else
311 std::sort(t_vecIdxValue.begin(), t_vecIdxValue.end(), Linalg::compareIdxValuePairSmallerThan<T>);
312
313 for (qint32 i = 0; i < v.size(); ++i) {
314 idx[i] = t_vecIdxValue[i].first;
315 v[i] = t_vecIdxValue[i].second;
316 }
317 }
318
319 return idx;
320}
321
322//=============================================================================================================
323
324template<typename T>
325Eigen::VectorXi Linalg::sort(Eigen::Matrix<T, Eigen::Dynamic, 1>& v_prime,
326 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& mat,
327 bool desc)
328{
329 Eigen::VectorXi idx = Linalg::sort<T>(v_prime, desc);
330
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]);
335 mat = newMat;
336 }
337
338 return idx;
339}
340
341//=============================================================================================================
342
343template<typename T>
344std::vector<Eigen::Triplet<T>> Linalg::sortrows(const std::vector<Eigen::Triplet<T>>& A,
345 qint32 column)
346{
347 std::vector<Eigen::Triplet<T>> p_ASorted;
348
349 for (quint32 i = 0; i < A.size(); ++i)
350 p_ASorted.push_back(A[i]);
351
352 if (column == 0)
353 std::sort(p_ASorted.begin(), p_ASorted.end(), Linalg::compareTripletFirstEntry<T>);
354 if (column == 1)
355 std::sort(p_ASorted.begin(), p_ASorted.end(), Linalg::compareTripletSecondEntry<T>);
356
357 return p_ASorted;
358}
359
360//=============================================================================================================
361
362template<typename T>
363inline bool Linalg::compareIdxValuePairBiggerThan(const std::pair<int, T>& lhs,
364 const std::pair<int, T>& rhs)
365{
366 return lhs.second > rhs.second;
367}
368
369//=============================================================================================================
370
371template<typename T>
372inline bool Linalg::compareIdxValuePairSmallerThan(const std::pair<int, T>& lhs,
373 const std::pair<int, T>& rhs)
374{
375 return lhs.second < rhs.second;
376}
377
378//=============================================================================================================
379
380template<typename T>
381inline bool Linalg::compareTripletFirstEntry(const Eigen::Triplet<T>& lhs,
382 const Eigen::Triplet<T>& rhs)
383{
384 return lhs.row() < rhs.row();
385}
386
387//=============================================================================================================
388
389template<typename T>
390inline bool Linalg::compareTripletSecondEntry(const Eigen::Triplet<T>& lhs,
391 const Eigen::Triplet<T>& rhs)
392{
393 return lhs.col() < rhs.col();
394}
395
396//=============================================================================================================
397
398template<typename T>
399Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> Linalg::pinv(const Eigen::Matrix<T,
400 Eigen::Dynamic,
401 Eigen::Dynamic>& a)
402{
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();
407}
408
409//=============================================================================================================
410} // NAMESPACE
411
412#endif // LINALG_H
Eigen::JacobiSVD< Eigen::Matrix3f > svd(S, Eigen::ComputeFullU|Eigen::ComputeFullV)
Export/import macros and build-stamp accessors for MATHLIB.
#define MATHSHARED_EXPORT
Definition math_global.h:51
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
Static Eigen-based linear-algebra helpers used across MATHLIB and the inverse solvers.
Definition linalg.h:73
std::pair< int, int > IdxIntValue
Definition linalg.h:75
static bool compareIdxValuePairSmallerThan(const std::pair< int, T > &lhs, const std::pair< int, T > &rhs)
Definition linalg.h:372
static Eigen::VectorXd combine_xyz(const Eigen::VectorXd &vec)
Definition linalg.cpp:57
static bool compareTripletFirstEntry(const Eigen::Triplet< T > &lhs, const Eigen::Triplet< T > &rhs)
Definition linalg.h:381
static Eigen::VectorXi sort(Eigen::Matrix< T, Eigen::Dynamic, 1 > &v, bool desc=true)
Definition linalg.h:298
static qint32 rank(const Eigen::MatrixXd &A, double tol=1e-8)
Definition linalg.cpp:226
static void get_whitener(Eigen::MatrixXd &A, bool pca, const std::string &ch_type, Eigen::VectorXd &eig, Eigen::MatrixXd &eigvec)
~Linalg()=default
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)
Definition linalg.cpp:160
static bool compareIdxValuePairBiggerThan(const std::pair< int, T > &lhs, const std::pair< int, T > &rhs)
Definition linalg.h:363
static double getConditionNumber(const Eigen::MatrixXd &A, Eigen::VectorXd &s)
Definition linalg.cpp:78
static std::vector< Eigen::Triplet< T > > sortrows(const std::vector< Eigen::Triplet< T > > &A, qint32 column=0)
Definition linalg.h:344
static double getConditionSlope(const Eigen::MatrixXd &A, Eigen::VectorXd &s)
Definition linalg.cpp:91
static bool compareTripletSecondEntry(const Eigen::Triplet< T > &lhs, const Eigen::Triplet< T > &rhs)
Definition linalg.h:390
static Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > pinv(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &a)
Definition linalg.h:399
static Eigen::SparseMatrix< double > make_block_diag(const Eigen::MatrixXd &A, qint32 n)
Definition linalg.cpp:193