00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 namespace Bayesian_filter_matrix
00016 {
00017 namespace LAPACK {
00018
00019 namespace rawLAPACK {
00020
00021 extern "C" {
00022
00023 void dgeqrf_(
00024 const int & m,
00025 const int & n,
00026 double da[],
00027 const int & lda,
00028 double dtau[],
00029 double dwork[],
00030 const int& ldwork,
00031 int& info);
00032 void sgeqrf_(
00033 const int & m,
00034 const int & n,
00035 float da[],
00036 const int & lda,
00037 float dtau[],
00038 float dwork[],
00039 const int& ldwork,
00040 int& info);
00041
00042 void dgetrs_(
00043 const char& transa,
00044 const int& n,
00045 const int& nrhs,
00046 const double da[],
00047 const int& lda,
00048 int ipivot[],
00049 double db[],
00050 const int& ldb,
00051 int& info);
00052 void sgetrs_(
00053 const char& transa,
00054 const int& n,
00055 const int& nrhs,
00056 const float da[],
00057 const int& lda,
00058 int ipivot[],
00059 float db[],
00060 const int& ldb,
00061 int& info);
00062
00063 void dgetrf_(
00064 const int& m,
00065 const int& n,
00066 double da[],
00067 const int& lda,
00068 int ipivot[],
00069 int& info);
00070 void sgetrf_(
00071 const int& m,
00072 const int& n,
00073 float da[],
00074 const int& lda,
00075 int ipivot[],
00076 int& info);
00077
00078 }
00079
00080
00081 inline void geqrf( const int & m, const int & n, double da[], const int & lda, double dtau[], double dwork[], const int& ldwork, int& info)
00082 {
00083 dgeqrf_(m,n,da,lda,dtau,dwork,ldwork,info);
00084 }
00085 inline void geqrf( const int & m, const int & n, float da[], const int & lda, float dtau[], float dwork[], const int& ldwork, int& info)
00086 {
00087 sgeqrf_(m,n,da,lda,dtau,dwork,ldwork,info);
00088 }
00089 inline void getrs( const char& transa, const int& n, const int& nrhs, const double da[], const int& lda, int ipivot[], double db[], const int& ldb, int& info)
00090 {
00091 dgetrs_(transa,n,nrhs,da,lda,ipivot,db,ldb,info);
00092 }
00093 inline void getrs( const char& transa, const int& n, const int& nrhs, const float da[], const int& lda, int ipivot[], float db[], const int& ldb, int& info)
00094 {
00095 sgetrs_(transa,n,nrhs,da,lda,ipivot,db,ldb,info);
00096 }
00097 inline void getrf( const int& m, const int& n, double da[], const int& lda, int ipivot[], int& info)
00098 {
00099 dgetrf_(m,n,da,lda,ipivot,info);
00100 }
00101 inline void getrf( const int& m, const int& n, float da[], const int& lda, int ipivot[], int& info)
00102 {
00103 sgetrf_(m,n,da,lda,ipivot,info);
00104 }
00105 }
00106
00107
00108
00109 typedef boost::numeric::ublas::vector<int> pivot_t;
00110 typedef Bayesian_filter_matrix::DenseVec vector_t;
00111 typedef Bayesian_filter_matrix::DenseColMatrix matrix_t;
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123 int geqrf (matrix_t& a, vector_t& tau)
00124 {
00125 int _m = int(a.size1());
00126 int _n = int(a.size2());
00127 int _lda = int(a.size1());
00128 int _info;
00129
00130
00131 if (int(tau.size()) < (_n<_m ? _n : _m) )
00132 return -104;
00133
00134 int ldwork = _n*_n;
00135 vector_t dwork(ldwork);
00136 rawLAPACK::geqrf (_m, _n, a.data().begin(), _lda, tau.data().begin(), dwork.data().begin(), ldwork, _info);
00137
00138 return _info;
00139 }
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 int getrf (matrix_t& a, pivot_t& ipivot)
00152 {
00153 matrix_t::value_type* _a = a.data().begin();
00154 int _m = int(a.size1());
00155 int _n = int(a.size2());
00156 int _lda = _m;
00157 int _info;
00158
00159 rawLAPACK::getrf (_m, _n, _a, _lda, ipivot.data().begin(), _info);
00160
00161 return _info;
00162 }
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176 int getrs (char transa, matrix_t& a,
00177 pivot_t& ipivot, matrix_t& b)
00178 {
00179 matrix_t::value_type* _a = a.data().begin();
00180 int a_n = int(a.size1());
00181 int _lda = a_n;
00182 int p_n = int(ipivot.size());
00183
00184 matrix_t::value_type* _b = b.data().begin();
00185 int b_n = int(b.size1());
00186 int _ldb = b_n;
00187 int _nrhs = int(b.size2());
00188
00189 if (a_n != b_n)
00190 return -101;
00191 if (p_n < a_n)
00192 return -102;
00193
00194 int _info;
00195 rawLAPACK::getrs (transa, a_n, _nrhs, _a, _lda, ipivot.data().begin(),
00196 _b, _ldb, _info);
00197
00198 return _info;
00199 }
00200
00201 }
00202 }