00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef EIGEN_REAL_SCHUR_MKL_H
00034 #define EIGEN_REAL_SCHUR_MKL_H
00035
00036 #include "Eigen/src/Core/util/MKL_support.h"
00037
00038 namespace Eigen {
00039
00042 #define EIGEN_MKL_SCHUR_REAL(EIGTYPE, MKLTYPE, MKLPREFIX, MKLPREFIX_U, EIGCOLROW, MKLCOLROW) \
00043 template<> inline \
00044 RealSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >& \
00045 RealSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >::compute(const Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW>& matrix, bool computeU) \
00046 { \
00047 typedef Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> MatrixType; \
00048 typedef MatrixType::Scalar Scalar; \
00049 typedef MatrixType::RealScalar RealScalar; \
00050 \
00051 assert(matrix.cols() == matrix.rows()); \
00052 \
00053 lapack_int n = matrix.cols(), sdim, info; \
00054 lapack_int lda = matrix.outerStride(); \
00055 lapack_int matrix_order = MKLCOLROW; \
00056 char jobvs, sort='N'; \
00057 LAPACK_##MKLPREFIX_U##_SELECT2 select = 0; \
00058 jobvs = (computeU) ? 'V' : 'N'; \
00059 m_matU.resize(n, n); \
00060 lapack_int ldvs = m_matU.outerStride(); \
00061 m_matT = matrix; \
00062 Matrix<EIGTYPE, Dynamic, Dynamic> wr, wi; \
00063 wr.resize(n, 1); wi.resize(n, 1); \
00064 info = LAPACKE_##MKLPREFIX##gees( matrix_order, jobvs, sort, select, n, (MKLTYPE*)m_matT.data(), lda, &sdim, (MKLTYPE*)wr.data(), (MKLTYPE*)wi.data(), (MKLTYPE*)m_matU.data(), ldvs ); \
00065 if(info == 0) \
00066 m_info = Success; \
00067 else \
00068 m_info = NoConvergence; \
00069 \
00070 m_isInitialized = true; \
00071 m_matUisUptodate = computeU; \
00072 return *this; \
00073 \
00074 }
00075
00076 EIGEN_MKL_SCHUR_REAL(double, double, d, D, ColMajor, LAPACK_COL_MAJOR)
00077 EIGEN_MKL_SCHUR_REAL(float, float, s, S, ColMajor, LAPACK_COL_MAJOR)
00078 EIGEN_MKL_SCHUR_REAL(double, double, d, D, RowMajor, LAPACK_ROW_MAJOR)
00079 EIGEN_MKL_SCHUR_REAL(float, float, s, S, RowMajor, LAPACK_ROW_MAJOR)
00080
00081 }
00082
00083 #endif // EIGEN_REAL_SCHUR_MKL_H