33 #ifndef EIGEN_LLT_MKL_H 34 #define EIGEN_LLT_MKL_H 45 #define EIGEN_MKL_LLT(EIGTYPE, MKLTYPE, MKLPREFIX) \ 46 template<> struct mkl_llt<EIGTYPE> \ 48 template<typename MatrixType> \ 49 static inline typename MatrixType::Index potrf(MatrixType& m, char uplo) \ 51 lapack_int matrix_order; \ 52 lapack_int size, lda, info, StorageOrder; \ 54 eigen_assert(m.rows()==m.cols()); \ 57 StorageOrder = MatrixType::Flags&RowMajorBit?RowMajor:ColMajor; \ 58 matrix_order = StorageOrder==RowMajor ? LAPACK_ROW_MAJOR : LAPACK_COL_MAJOR; \ 59 a = &(m.coeffRef(0,0)); \ 60 lda = m.outerStride(); \ 62 info = LAPACKE_##MKLPREFIX##potrf( matrix_order, uplo, size, (MKLTYPE*)a, lda ); \ 63 info = (info==0) ? Success : NumericalIssue; \ 67 template<> struct llt_inplace<EIGTYPE, Lower> \ 69 template<typename MatrixType> \ 70 static typename MatrixType::Index blocked(MatrixType& m) \ 72 return mkl_llt<EIGTYPE>::potrf(m, 'L'); \ 74 template<typename MatrixType, typename VectorType> \ 75 static typename MatrixType::Index rankUpdate(MatrixType& mat, const VectorType& vec, const typename MatrixType::RealScalar& sigma) \ 76 { return Eigen::internal::llt_rank_update_lower(mat, vec, sigma); } \ 78 template<> struct llt_inplace<EIGTYPE, Upper> \ 80 template<typename MatrixType> \ 81 static typename MatrixType::Index blocked(MatrixType& m) \ 83 return mkl_llt<EIGTYPE>::potrf(m, 'U'); \ 85 template<typename MatrixType, typename VectorType> \ 86 static typename MatrixType::Index rankUpdate(MatrixType& mat, const VectorType& vec, const typename MatrixType::RealScalar& sigma) \ 88 Transpose<MatrixType> matt(mat); \ 89 return llt_inplace<EIGTYPE, Lower>::rankUpdate(matt, vec.conjugate(), sigma); \ 102 #endif // EIGEN_LLT_MKL_H #define EIGEN_MKL_LLT(EIGTYPE, MKLTYPE, MKLPREFIX)
iterative scaling algorithm to equilibrate rows and column norms in matrices