📄 lapack.h
字号:
// Template Numerical Toolkit (TNT) for Linear Algebra//// BETA VERSION INCOMPLETE AND SUBJECT TO CHANGE// Please see http://math.nist.gov/tnt for updates//// R. Pozo// Mathematical and Computational Sciences Division// National Institute of Standards and Technology// Header file for Fortran Lapack#ifndef LAPACK_H#define LAPACK_H// This file incomplete and included here to only demonstrate the// basic framework for linking with the Fortran Lapack routines.#include "fortran.h"#include "vec.h"#include "fmat.h"typedef Fortran_double* fda_; // (in/out) double precision arraytypedef const Fortran_double* cfda_; // (in) double precsion arraytypedef Fortran_double* fd_; // (in/out) single double precisiontypedef const Fortran_double* cfd_; // (in) single double precisiontypedef Fortran_float* ffa_; // (in/out) float precision arraytypedef const Fortran_float* cffa_; // (in) float precsion arraytypedef Fortran_float* ff_; // (in/out) single float precisiontypedef const Fortran_float* cff_; // (in) single float precisiontypedef Fortran_integer* fia_; // (in/out) single integer arraytypedef const Fortran_integer* cfia_; // (in) single integer arraytypedef Fortran_integer* fi_; // (in/out) single integertypedef const Fortran_integer* cfi_; // (in) single integertypedef char * fch_; // (in/out) single charactertypedef char * cfch_; // (in) single character#define F77_DGESV dgesv_#define F77_DGELS dgels_#define F77_DSYEV dsyev_#define F77_DGEEV dgeev_extern "C"{ // linear equations (general) using LU factorizaiton // void F77_DGESV(cfi_ N, cfi_ nrhs, fda_ A, cfi_ lda, fia_ ipiv, fda_ b, cfi_ ldb, fi_ info); // solve linear least squares using QR or LU factorization // void F77_DGELS(cfch_ trans, cfi_ M, cfi_ N, cfi_ nrhs, fda_ A, cfi_ lda, fda_ B, cfi_ ldb, fda_ work, cfi_ lwork, fi_ info); // solve symmetric eigenvalues // void F77_DSYEV( cfch_ jobz, cfch_ uplo, cfi_ N, fda_ A, cfi_ lda, fda_ W, fda_ work, cfi_ lwork, fi_ info); // solve unsymmetric eigenvalues // void F77_DGEEV(cfch_ jobvl, cfch_ jobvr, cfi_ N, fda_ A, cfi_ lda, fda_ wr, fda_ wi, fda_ vl, cfi_ ldvl, fda_ vr, cfi_ ldvr, fda_ work, cfi_ lwork, fi_ info);}// solve linear equations using LU factorizationVector<double> Lapack_LU_linear_solve(const Fortran_matrix<double> &A, const Vector<double> &b){ const Fortran_integer one=1; Subscript M=A.num_rows(); Subscript N=A.num_cols(); Fortran_matrix<double> Tmp(A); Vector<double> x(b); Vector<Fortran_integer> index(M); Fortran_integer info = 0; F77_DGESV(&N, &one, &Tmp(1,1), &M, &index(1), &x(1), &M, &info); if (info != 0) return Vector<double>(0); else return x;}// solve linear least squares problem using QR factorization//Vector<double> Lapack_LLS_QR_linear_solve(const Fortran_matrix<double> &A, const Vector<double> &b){ const Fortran_integer one=1; Subscript M=A.num_rows(); Subscript N=A.num_cols(); Fortran_matrix<double> Tmp(A); Vector<double> x(b); Fortran_integer info = 0; char transp = 'N'; Fortran_integer lwork = 5 * (M+N); // temporary work space Vector<double> work(lwork); F77_DGELS(&transp, &M, &N, &one, &Tmp(1,1), &M, &x(1), &M, &work(1), &lwork, &info); if (info != 0) return Vector<double>(0); else return x;}// *********************** Eigenvalue problems *******************// solve symmetric eigenvalue problem (eigenvalues only)//Vector<double> Upper_symmetric_eigenvalue_solve(const Fortran_matrix<double> &A){ char jobz = 'N'; char uplo = 'U'; Subscript N = A.num_rows(); assert(N == A.num_cols()); Vector<double> eigvals(N); Fortran_integer worksize = 3*N; Fortran_integer info = 0; Vector<double> work(worksize); Fortran_matrix<double> Tmp = A; F77_DSYEV(&jobz, &uplo, &N, &Tmp(1,1), &N, eigvals.begin(), work.begin(), &worksize, &info); if (info != 0) return Vector<double>(); else return eigvals;}// solve unsymmetric eigenvalue problems //int eigenvalue_solve(const Fortran_matrix<double> &A, Vector<double> &wr, Vector<double> &wi){ char jobvl = 'N'; char jobvr = 'N'; Fortran_integer N = A.num_rows(); assert(N == A.num_cols()); if (N<1) return 1; Fortran_matrix<double> vl(1,N); /* should be NxN ? **** */ Fortran_matrix<double> vr(1,N); Fortran_integer one = 1; Fortran_integer worksize = 5*N; Fortran_integer info = 0; Vector<double> work(worksize, 0.0); Fortran_matrix<double> Tmp = A; wr.newsize(N); wi.newsize(N);// void F77_DGEEV(cfch_ jobvl, cfch_ jobvr, cfi_ N, fda_ A, cfi_ lda,// fda_ wr, fda_ wi, fda_ vl, cfi_ ldvl, fda_ vr, // cfi_ ldvr, fda_ work, cfi_ lwork, fi_ info); F77_DGEEV(&jobvl, &jobvr, &N, &Tmp(1,1), &N, &(wr(1)), &(wi(1)), &(vl(1,1)), &one, &(vr(1,1)), &one, &(work(1)), &worksize, &info); return (info==0 ? 0: 1);}#endif// LAPACK_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -