56 #include <Eigen/SparseCore>
108 static int gcd(
int iA,
int iB);
124 static Eigen::VectorXd* combine_xyz(
const Eigen::VectorXd& vec);
140 static double getConditionNumber(
const Eigen::MatrixXd& A,
151 static double getConditionSlope(
const Eigen::MatrixXd& A,
163 static void get_whitener(Eigen::MatrixXd& A,
166 Eigen::VectorXd& eig,
167 Eigen::MatrixXd& eigvec);
178 static void get_whitener(Eigen::MatrixXd& A,
180 const std::string& ch_type,
181 Eigen::VectorXd& eig,
182 Eigen::MatrixXd& eigvec);
194 static Eigen::VectorXi intersect(
const Eigen::VectorXi &v1,
195 const Eigen::VectorXi &v2,
196 Eigen::VectorXi &idx_sel);
207 static bool issparse(Eigen::VectorXd &v);
220 static Eigen::MatrixXd legendre(qint32 n,
221 const Eigen::VectorXd &X,
222 QString normalize = QString(
"unnorm"));
235 static Eigen::MatrixXd legendre(qint32 n,
236 const Eigen::VectorXd &X,
237 std::string normalize =
"unnorm");
256 static Eigen::SparseMatrix<double>* make_block_diag(
const Eigen::MatrixXd &A,
266 static int nchoose2(
int n);
279 static qint32 rank(
const Eigen::MatrixXd& A,
298 static Eigen::MatrixXd rescale(
const Eigen::MatrixXd &data,
299 const Eigen::RowVectorXf ×,
300 const QPair<float, float> &baseline,
319 static Eigen::MatrixXd rescale(
const Eigen::MatrixXd& data,
320 const Eigen::RowVectorXf& times,
321 const std::pair<float, float>& baseline,
322 const std::string& mode);
334 static Eigen::VectorXi sort(Eigen::Matrix<T, Eigen::Dynamic, 1> &v,
349 static Eigen::VectorXi sort(Eigen::Matrix<T, Eigen::Dynamic, 1> &v_prime,
350 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &mat,
363 static std::vector<Eigen::Triplet<T> > sortrows(
const std::vector<Eigen::Triplet<T> > &A,
376 static inline bool compareIdxValuePairBiggerThan(
const std::pair<int,T>& lhs,
377 const std::pair<int,T>& rhs);
389 static inline bool compareIdxValuePairSmallerThan(
const std::pair<int,T>& lhs,
390 const std::pair<int,T>& rhs);
402 static inline bool compareTripletFirstEntry(
const Eigen::Triplet<T>& lhs,
403 const Eigen::Triplet<T> & rhs);
415 static inline bool compareTripletSecondEntry(
const Eigen::Triplet<T>& lhs,
416 const Eigen::Triplet<T> & rhs);
427 static inline double log2(
const T d);
442 static void histcounts(
const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matRawData,
443 bool bMakeSymmetrical,
445 Eigen::VectorXd& vecResultClassLimits,
446 Eigen::VectorXi& vecResultFrequency,
447 double dGlobalMin = 0.0,
448 double dGlobalMax= 0.0);
450 static void histcounts(
const Eigen::Matrix<T, Eigen::Dynamic, 1>& matRawData,
451 bool bMakeSymmetrical,
453 Eigen::VectorXd& vecResultClassLimits,
454 Eigen::VectorXi& vecResultFrequency,
455 double dGlobalMin = 0.0,
456 double dGlobalMax= 0.0);
458 static void histcounts(
const Eigen::Matrix<T, 1, Eigen::Dynamic>& matRawData,
459 bool bMakeSymmetrical,
461 Eigen::VectorXd& vecResultClassLimits,
462 Eigen::VectorXi& vecResultFrequency,
463 double dGlobalMin = 0.0,
464 double dGlobalMax= 0.0);
473 static Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> pinv(
const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& a);
487 static bool compareTransformation(
const Eigen::MatrixX4f& mDevHeadT,
488 const Eigen::MatrixX4f& mDevHeadTNew,
489 const float& fThreshRot,
490 const float& fThreshTrans);
498 template<
typename T>
502 std::vector< std::pair<int,T> > t_vecIdxValue;
503 Eigen::VectorXi idx(v.size());
508 for(qint32 i = 0; i < v.size(); ++i)
509 t_vecIdxValue.push_back(std::pair<int,T>(i, v[i]));
513 std::sort(t_vecIdxValue.begin(), t_vecIdxValue.end(), MNEMath::compareIdxValuePairBiggerThan<T>);
515 std::sort(t_vecIdxValue.begin(), t_vecIdxValue.end(), MNEMath::compareIdxValuePairSmallerThan<T>);
518 for(qint32 i = 0; i < v.size(); ++i)
520 idx[i] = t_vecIdxValue[i].first;
521 v[i] = t_vecIdxValue[i].second;
532 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &mat,
535 Eigen::VectorXi idx = MNEMath::sort<T>(v_prime, desc);
537 if(v_prime.size() > 0)
540 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> newMat(mat.rows(), mat.cols());
541 for(qint32 i = 0; i < idx.size(); ++i)
542 newMat.col(i) = mat.col(idx[i]);
555 std::vector<Eigen::Triplet<T> > p_ASorted;
557 for(quint32 i = 0; i < A.size(); ++i)
558 p_ASorted.push_back(A[i]);
561 std::sort(p_ASorted.begin(), p_ASorted.end(), MNEMath::compareTripletFirstEntry<T>);
563 std::sort(p_ASorted.begin(), p_ASorted.end(), MNEMath::compareTripletSecondEntry<T>);
572 const std::pair<int,T>& rhs)
574 return lhs.second > rhs.second;
581 const std::pair<int,T>& rhs)
583 return lhs.second < rhs.second;
590 const Eigen::Triplet<T> & rhs)
592 return lhs.row() < rhs.row();
599 const Eigen::Triplet<T> & rhs)
601 return lhs.col() < rhs.col();
609 return log(d)/log(2);
616 bool bMakeSymmetrical,
618 Eigen::VectorXd& vecResultClassLimits,
619 Eigen::VectorXi& vecResultFrequency,
623 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(matRawData.rows(),1);
624 matrixName.col(0)= matRawData;
625 MNEMath::histcounts(matrixName, bMakeSymmetrical, iClassAmount, vecResultClassLimits, vecResultFrequency, dGlobalMin, dGlobalMax);
632 bool bMakeSymmetrical,
634 Eigen::VectorXd& vecResultClassLimits,
635 Eigen::VectorXi& vecResultFrequency,
639 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(1,matRawData.cols());
640 matrixName.row(0)= matRawData;
641 MNEMath::histcounts(matrixName, bMakeSymmetrical, iClassAmount, vecResultClassLimits, vecResultFrequency, dGlobalMin, dGlobalMax);
648 bool bMakeSymmetrical,
650 Eigen::VectorXd& vecResultClassLimits,
651 Eigen::VectorXi& vecResultFrequency,
655 if(matRawData.rows() == 0 || matRawData.cols() == 0) {
659 vecResultClassLimits.resize(iClassAmount + 1);
660 vecResultFrequency.resize(iClassAmount);
662 for (
int count = 0; count < iClassAmount; ++count)
664 vecResultFrequency(count) = 0;
674 rawMin = matRawData.minCoeff();
675 rawMax = matRawData.maxCoeff();
677 if (bMakeSymmetrical ==
true)
679 if (std::fabs(rawMin) > rawMax)
681 localMax = std::fabs(rawMin);
684 else if (rawMax > std::fabs(rawMin))
686 localMin = -(rawMax);
701 if (dGlobalMin == 0.0 && dGlobalMax == 0.0)
703 desiredMin = localMin;
704 desiredMax = localMax;
705 vecResultClassLimits[0] = desiredMin;
706 vecResultClassLimits[iClassAmount] = desiredMax;
710 desiredMin = dGlobalMin;
711 desiredMax = dGlobalMax;
712 vecResultClassLimits(0)= desiredMin;
713 vecResultClassLimits(iClassAmount)= desiredMax;
716 double range = (vecResultClassLimits(iClassAmount) - vecResultClassLimits(0)),
717 dynamicUpperClassLimit;
719 for (
int kr = 0; kr < iClassAmount; ++kr)
721 dynamicUpperClassLimit = (vecResultClassLimits(0) + (kr*(range/iClassAmount)));
722 vecResultClassLimits(kr) = dynamicUpperClassLimit;
725 for (
int ir = 0; ir < matRawData.rows(); ++ir)
727 for (
int jr = 0; jr<matRawData.cols(); ++jr)
729 if(matRawData(ir,jr) != 0.0) {
730 for (
int kr = 0; kr < iClassAmount; ++kr)
732 if (kr == iClassAmount-1)
734 if (matRawData(ir,jr) >= vecResultClassLimits(kr) && matRawData(ir,jr) <= vecResultClassLimits(kr + 1))
736 vecResultFrequency(kr) = vecResultFrequency(kr) + 1 ;
741 if (matRawData(ir,jr) >= vecResultClassLimits(kr) && matRawData(ir,jr) < vecResultClassLimits(kr + 1))
743 vecResultFrequency(kr) = vecResultFrequency(kr) + 1 ;
755 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
MNEMath::pinv(
const Eigen::Matrix<T,
759 double epsilon = std::numeric_limits<double>::epsilon();
760 Eigen::JacobiSVD< Eigen::MatrixXd > svd(a ,Eigen::ComputeThinU | Eigen::ComputeThinV);
761 double tolerance = epsilon * std::max(a.cols(), a.rows()) * svd.singularValues().array().abs()(0);
762 return svd.matrixV() * (svd.singularValues().array().abs() > tolerance).select(svd.singularValues().array().inverse(),0).matrix().asDiagonal() * svd.matrixU().adjoint();