/*! return its inverse matrix */ inline _zgematrix i(const zgbmatrix& mat) { #ifdef CPPL_VERBOSE std::cerr << "# [MARK] i(const zgbmatrix&)" << std::endl; #endif//CPPL_VERBOSE #ifdef CPPL_DEBUG if(mat.M!=mat.N){ std::cerr << "[ERROR] i(zgbmatrix&) " << std::endl << "This matrix is not square and has no inverse matrix." << std::endl << "Your input was (" << mat.M << "x" << mat.N << ")." << std::endl; exit(1); } #endif//CPPL_DEBUG zgbmatrix mat_cp(mat); zgematrix mat_inv(mat.M,mat.N); mat_inv.identity(); mat_cp.zgbsv(mat_inv); return _(mat_inv); }
/*! return its inverse matrix */ inline _zgematrix i(const zhematrix& mat) {VERBOSE_REPORT; zhematrix mat_cp(mat); zgematrix mat_inv(mat.n,mat.n); mat_inv.identity(); mat_cp.zhesv(mat_inv); return _(mat_inv); }
/*! return its inverse matrix */ inline _zgematrix i(const _zgematrix& mat) {VERBOSE_REPORT; #ifdef CPPL_DEBUG if(mat.m!=mat.n){ ERROR_REPORT; std::cerr << "This matrix is not square and has no inverse matrix." << std::endl << "Your input was (" << mat.m << "x" << mat.n << ")." << std::endl; exit(1); } #endif//CPPL_DEBUG zgematrix mat_cp(mat); zgematrix mat_inv(mat_cp.m,mat_cp.n); mat_inv.identity(); mat_cp.zgesv(mat_inv); return _(mat_inv); }
/*! return its inverse matrix */ inline _dsymatrix i(const _dsymatrix& mat) {VERBOSE_REPORT; dsymatrix mat_cp(mat); dsymatrix mat_inv(mat_cp.n); mat_inv.identity(); char UPLO('l'); long NRHS(mat.n), LDA(mat.n), *IPIV(new long[mat.n]), LDB(mat.n), LWORK(-1), INFO(1); double *WORK( new double[1] ); dsysv_(UPLO, mat_cp.n, NRHS, mat_cp.array, LDA, IPIV, mat_inv.array, LDB, WORK, LWORK, INFO); LWORK = long(WORK[0]); delete [] WORK; WORK = new double[LWORK]; dsysv_(UPLO, mat_cp.n, NRHS, mat_cp.array, LDA, IPIV, mat_inv.array, LDB, WORK, LWORK, INFO); delete [] WORK; delete [] IPIV; if(INFO!=0){ WARNING_REPORT; std::cerr << "Serious trouble happend. INFO = " << INFO << "." << std::endl; } return _(mat_inv); }