📄 trfd.h
字号:
// -*-c++-*-// LAPACK++ (V. 1.1)// (C) 1992-1996 All Rights Reserved.#ifndef _LA_TRIDIAG_FACT_DOUBLE_H_#define _LA_TRIDIAG_FACT_DOUBLE_H_/** @file @brief LU factorization of a tridiagonal matrix Class for the LU factorization of a tridiagonal matrix. Note: It is unclear whether the design of this class needs a major overhaul. Do not use this unless you are really sure you understand what this class does.*/#include LA_VECTOR_LONG_INT_H#include LA_TRIDIAG_MAT_DOUBLE_H#include "lapack.h"/** Class for the LU factorization of a tridiagonal matrix. \see \ref LaTridiagMatDouble, LaTridiagMatFactorize() Note: It is unclear whether the design of this class needs some rewriting. Currently this class is only usable for solving an equation system with a tridiagonal matrix. As a code example for solving Ax=b with tridiagonal A, you would program the following lines:\verbatimLaTridiagMatDouble A(N); // define AA.diag(0).inject(...); // fill the matrix with valuesLaGenMatDouble B(N,1); // define right-hand-side BB = ...; // fill B with values from somewhere// To solve Ax=b:LaTridiagFactDouble Afact;LaGenMatDouble X(N,1);LaTridiagMatFactorize(A, Afact); // calculate LU factorizationLaLinearSolve(Afact, X, B); // solve; result is in X\endverbatim*/class LaTridiagFactDouble{ LaTridiagMatDouble T_; LaVectorLongInt pivot_; int size_;public: // constructor LaTridiagFactDouble(); LaTridiagFactDouble(int); LaTridiagFactDouble(LaTridiagFactDouble &); ~LaTridiagFactDouble(); LaTridiagMatDouble& T() { return T_; } LaVectorLongInt& pivot() { return pivot_; } int size() { return size_; } LaVectorDouble& diag(int); const LaVectorDouble& diag(int k) const; // operators LaTridiagFactDouble& ref(LaTridiagMatDouble &); LaTridiagFactDouble& ref(LaTridiagFactDouble &); LaTridiagFactDouble& copy(const LaTridiagMatDouble &); LaTridiagFactDouble& copy(const LaTridiagFactDouble &);}; // constructor/destructor functionsinline LaTridiagFactDouble::LaTridiagFactDouble():T_(),pivot_(),size_(0){}inline LaTridiagFactDouble::LaTridiagFactDouble(int N):T_(N),pivot_(N),size_(N){}inline LaTridiagFactDouble::LaTridiagFactDouble(LaTridiagFactDouble &F){ T_.copy(F.T_); pivot_.copy(F.pivot_); size_ = F.size_;}inline LaTridiagFactDouble::~LaTridiagFactDouble(){} // member functionsinline LaVectorDouble& LaTridiagFactDouble::diag(int k){ return T_.diag(k);}inline const LaVectorDouble& LaTridiagFactDouble::diag(int k) const{ return T_.diag(k);} // operatorsinline LaTridiagFactDouble& LaTridiagFactDouble::ref(LaTridiagFactDouble& F){ T_.ref(F.T_); pivot_.ref(F.pivot_); size_ = F.size_; return *this;}inline LaTridiagFactDouble& LaTridiagFactDouble::ref(LaTridiagMatDouble& A){ T_.ref(A); size_ = A.size(); pivot_.resize(size_, 1); return *this;}inline LaTridiagFactDouble& LaTridiagFactDouble::copy(const LaTridiagFactDouble& F){ T_.copy(F.T_); pivot_.copy(F.pivot_); size_ = F.size_; return *this;}inline LaTridiagFactDouble& LaTridiagFactDouble::copy(const LaTridiagMatDouble& A){ T_.copy(A); size_ = A.size(); pivot_.resize(size_, 1); return *this;}/** Calculate the LU factorization of a tridiagonal * matrix. Factorizes by @c dgttrf. * * \param A The matrix to be factorized. Will be unchanged. * \param AF The class where the factorization of A will be stored. * * \see \ref LaTridiagFactDouble, LaLinearSolve(LaTridiagFactDouble &, LaGenMatDouble &, const LaGenMatDouble &) */void DLLIMPORT LaTridiagMatFactorize(const LaTridiagMatDouble &A, LaTridiagFactDouble &AF);/** Solve Ax=b with tridiagonal A and the calculated LU * factorization of A as returned by * LaTridiagMatFactorize(). Solves by \c dgttrs. * * \param AF The LU factorization of the A matrix * \param X The matrix that will contain the result afterwards. Size must be correct. * \param B The right-hand-side of the equation system Ax=b. */void DLLIMPORT LaLinearSolve(LaTridiagFactDouble &AF, LaGenMatDouble &X, const LaGenMatDouble &B);#endif // _LA_TRIDIAG_FACT_DOUBLE_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -