void NurbsTools::pca (const vector_vec2d &data, Eigen::Vector2d &mean, Eigen::Matrix2d &eigenvectors, Eigen::Vector2d &eigenvalues) { if (data.empty ()) { printf ("[NurbsTools::pca] Error, data is empty\n"); abort (); } mean = computeMean (data); unsigned s = unsigned (data.size ()); Eigen::MatrixXd Q (2, s); for (unsigned i = 0; i < s; i++) Q.col (i) << (data[i] - mean); Eigen::Matrix2d C = Q * Q.transpose (); Eigen::SelfAdjointEigenSolver<Eigen::Matrix2d> eigensolver (C); if (eigensolver.info () != Success) { printf ("[NurbsTools::pca] Can not find eigenvalues.\n"); abort (); } for (int i = 0; i < 2; ++i) { eigenvalues (i) = eigensolver.eigenvalues () (1 - i); eigenvectors.col (i) = eigensolver.eigenvectors ().col (1 - i); } }
void Triangle::setJac(){ Eigen::Matrix2d J; J.col(0) = (M_points[1]-M_points[0]).toEig(); J.col(1) = (M_points[2]-M_points[0]).toEig(); M_jac = J; }