00001 #ifndef TOOLS_H
00002 #define TOOLS_H
00003
00004
00005
00006 #include <iostream>
00007 #include <fstream>
00008 #include <math.h>
00009 #include <complex>
00010 #include <sstream>
00011 #include <string>
00012 #include <vector>
00013 #include <limits>
00014 #include<ctime>
00015
00016
00017 #include <tbci/matrix.h>
00018 #include <tbci/vector.h>
00019
00020
00021 using std::cout;
00022 using std::complex;
00023 using std::string;
00024
00025 const complex<double> I=complex<double>(0,1.);
00026
00027 template < typename T >
00028 inline std::string to_str(T t)
00029 {
00030 std::ostringstream ss;
00031 ss<<t;
00032 return ss.str();
00033 }
00034
00035
00036
00037 template < typename T >
00038 inline string to_str(T *V, int dim1)
00039 {
00040 string s="";
00041 for (int i=0;i<dim1;i++)
00042 {
00043 s+=to_str(V[i])+" ";
00044 }
00045 return s;
00046 }
00047
00048 template < typename T >
00049 inline string to_str(T **M, int dim1, int dim2=-1)
00050 {
00051 string s="";
00052 if (dim2==-1) dim2=dim1;
00053 for (int i=0;i<dim1;i++)
00054 {
00055 for (int j=0;j<dim2;j++) s+=to_str(real(M[i][j]))+" ";
00056 s+="\n";
00057 }
00058 return s;
00059 }
00060
00061
00062 template < typename T >
00063 T str2number(std::string s)
00064 {
00065 std::stringstream ss(s.c_str());
00066 T result;
00067 if (!(ss >> result))
00068 throw std::exception();
00069 return result;
00070 }
00071
00072 inline std::vector<string> strsplit(string str, string delim=" ")
00073 {
00074 std::vector<string> results;
00075 int cutAt;
00076 while( (cutAt = str.find_first_of(delim)) != signed(str.npos) )
00077 {
00078 if(cutAt > 0)
00079 {
00080 results.push_back(str.substr(0,cutAt));
00081 }
00082 str = str.substr(cutAt+1);
00083 }
00084 if((str.length() > 0))
00085 {
00086 results.push_back(str);
00087 }
00088 return results;
00089 }
00090
00091 inline std::vector<string> readFile(string filename)
00092 {
00093 std::vector<string> data(0);
00094 std::ifstream file;
00095 string line;
00096
00097
00098 file.open(filename.c_str());
00099 if (file.is_open())
00100 {
00101 while (! file.eof() )
00102 {
00103 getline(file,line);
00104 if (line.length()>1)
00105 {
00106 if (line.at(0)!='#')
00107 {
00108 data.push_back(line);
00109 }
00110 }
00111 }
00112 file.close();
00113 return data;
00114 }
00115 else
00116 {
00117 cout << "Unable to open file";
00118 return data;
00119 }
00120 }
00121
00122
00123 inline int delta(int i,int j)
00124 {
00125 return (i==j?1:0);
00126 }
00127
00128
00129 inline string timestamp(void){
00130 string timestamp;
00131 time_t ltime;
00132 tm *t;
00133 time(<ime);
00134 t = gmtime(<ime);
00135 std::stringstream h,min,s,d,mon,y;
00136
00137 h<<std::setw(2)<<std::setfill('0') << t->tm_hour;
00138 min<<std::setw(2)<<std::setfill('0')<<t->tm_min;
00139 s<<std::setw(2)<<std::setfill('0')<<t->tm_sec;
00140 d<<std::setw(2)<<std::setfill('0')<<t->tm_mday;
00141 mon<<std::setw(2)<<std::setfill('0')<<t->tm_mon;
00142 y<<(t->tm_year+1900);
00143 timestamp = y.str()+""+mon.str()+""+d.str()+"-"+h.str()+""+min.str()+""+s.str();
00144 return timestamp;
00145 }
00146
00147
00149
00151
00152
00153 template <typename T>
00154 inline TBCI::Matrix< T > readMatrix(string filename)
00155 {
00156 TBCI::Matrix< T > M;
00157 std::vector<string> stringData(readFile(filename)), line;
00158 std::vector< std::vector<string> > data(0);
00159 bool validMatrix=true;
00160
00161 for (int i=0;i<signed(stringData.size());i++)
00162 {
00163 data.push_back(strsplit(stringData[i]));
00164 if (i>0) if (data[i].size()!=data[i-1].size()) validMatrix=false;
00165 }
00166 if (validMatrix)
00167 {
00168 M.resize(data.size(), data[0].size());
00169 for (int i=0;i<signed(data.size());i++)
00170 {
00171 for (int j=0;j<signed(data[i].size());j++)
00172 {
00173 M(i,j)=str2number< T >(data[i][j]);
00174 }
00175 }
00176 return M;
00177 }
00178 else
00179 {
00180 cout<<"File does not contain a valid matrix\n";
00181 return M;
00182 }
00183 }
00184
00185 template < typename T >
00186 TBCI::Vector< T > readVector(string filename)
00187 {
00188 std::vector<string> v(strsplit(readFile(filename)[0]));
00189 TBCI::Vector< T > result(0.,v.size());
00190
00191 for (int i=0;i<signed(v.size());i++)
00192 {
00193 result[i]=str2number<T>(v[i]);
00194 }
00195 return result;
00196 }
00197
00198
00200 template < typename T >
00201 T min(TBCI::Matrix< T > M)
00202 {
00203 T min=std::numeric_limits< T >::max();
00204 for (int i=0;i<M.rows();i++)
00205 {
00206 for (int j=0;j<M.columns();j++)
00207 {
00208 if (M(i,j)<min) min=M(i,j);
00209 }
00210 }
00211 return min;
00212 }
00213 template < typename T >
00214
00215
00217 T max(TBCI::Matrix< T > M)
00218 {
00219 T max=std::numeric_limits< T >::min();
00220 for (int i=0;i<M.rows();i++)
00221 {
00222 for (int j=0;j<M.columns();j++)
00223 {
00224 if (M(i,j)<max) max=M(i,j);
00225 }
00226 }
00227 return max;
00228 }
00229
00231
00234 template < typename T >
00235 inline TBCI::Matrix< T > invert(TBCI::Matrix< T > M)
00236 {
00237
00238
00239
00240 return TBCI::Matrix<T>(inv(TBCI::F_Matrix<T>(M)));
00241 }
00242
00243
00245
00250 template < typename T >
00251 inline TBCI::Matrix< T > multFrontBack(TBCI::Matrix< T > M, TBCI::Vector< T > v)
00252 {
00253 for (unsigned int row=0;row<M.rows();row++)
00254 {
00255 for (unsigned int column=0;column<M.columns();column++)
00256 {
00257 M(row,column)*=v(row)*v(column);
00258 }
00259 }
00260 return M;
00261 }
00262
00264 template < typename T >
00265 inline TBCI::Matrix< T > multFront(TBCI::Matrix< T > M, TBCI::Vector< T > v)
00266 {
00267 for (unsigned int row=0;row<M.rows();row++)
00268 {
00269 for (unsigned int column=0;column<M.columns();column++)
00270 {
00271 M(row,column)*=v(column);
00272 }
00273 }
00274 return M;
00275 }
00276
00277
00281 template < typename T >
00282 TBCI::Matrix<T> real(TBCI::Matrix< complex<T> > M)
00283 {
00284 TBCI::Matrix< T > N(0.,M.rows(),M.columns());
00285
00286 for (int i=0;i<signed(N.rows());i++)
00287 {
00288 for (int j=0;j<signed(N.columns());j++)
00289 {
00290 N(i,j)=real(M(i,j));
00291 }
00292 }
00293 return N;
00294 }
00295 template < typename T >
00296 TBCI::Matrix<T> imag(TBCI::Matrix< complex<T> > M)
00297 {
00298 TBCI::Matrix< T > N(0.,M.rows(),M.columns());
00299
00300 for (int i=0;i<signed(N.rows());i++)
00301 {
00302 for (int j=0;j<signed(N.columns());j++)
00303 {
00304 N(i,j)=imag(M(i,j));
00305 }
00306 }
00307 return N;
00308 }
00309 template < typename T >
00310 TBCI::Matrix<T> arg(TBCI::Matrix< complex<T> > M)
00311 {
00312 TBCI::Matrix< T > N(0.,M.rows(),M.columns());
00313
00314 for (int i=0;i<signed(N.rows());i++)
00315 {
00316 for (int j=0;j<signed(N.columns());j++)
00317 {
00318 N(i,j)=arg(M(i,j));
00319 }
00320 }
00321 return N;
00322 }
00323 template < typename T >
00324 TBCI::Matrix<T> abs(TBCI::Matrix< complex<T> > M)
00325 {
00326 TBCI::Matrix< T > N(0.,M.rows(),M.columns());
00327
00328 for (int i=0;i<signed(N.rows());i++)
00329 {
00330 for (int j=0;j<signed(N.columns());j++)
00331 {
00332 N(i,j)=abs(M(i,j));
00333 }
00334 }
00335 return N;
00336 }
00337 template < typename T >
00338 TBCI::Matrix<T> norm(TBCI::Matrix< complex<T> > M)
00339 {
00340 TBCI::Matrix< T > N(0.,M.rows(),M.columns());
00341
00342 for (int i=0;i<signed(N.rows());i++)
00343 {
00344 for (int j=0;j<signed(N.columns());j++)
00345 {
00346 N(i,j)=norm(M(i,j));
00347 }
00348 }
00349 return N;
00350 }
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360 template < typename T >
00361 T **Allocate2DArray(int nRows, int nCols)
00362 {
00363 T **ptr2d;
00364 ptr2d = new T*[nRows];
00365 for (int i=0;i<nRows;i++)
00366 {
00367 ptr2d[i]=new T[nCols];
00368 }
00369 return ptr2d;
00370 }
00371
00372
00373 template < typename T >
00374 void Free2DArray(T** Array, int nRows)
00375 {
00376 for (int i=0;i<nRows;i++)
00377 {
00378 delete [] Array[i];
00379 }
00380 delete [] Array;
00381 }
00382
00383
00384
00385
00386
00387 template < typename T >
00388 T ***Allocate3DArray(int n1, int n2, int n3)
00389 {
00390 T ***ptr = new T**[n1];
00391 for (int i=0;i<n1;i++)
00392 {
00393 *(ptr+i) = new T*[n2];
00394 for (int j=0;j<n2;j++)
00395 {
00396 *(*(ptr+i)+j)=new T[n3];
00397 }
00398 }
00399 return ptr;
00400 }
00401
00402 template < typename T >
00403 void Free3DArray(T*** Array)
00404 {
00405 delete [] **Array;
00406 delete [] *Array;
00407 delete [] Array;
00408 }
00409
00410
00411
00412
00413 #ifndef CMPLX
00414 #define CMPLX
00415 struct cmplx{double re; double im;};
00416 #endif
00417
00418 extern "C" void zgetri_(int *, cmplx *, int *, int *, cmplx *, int *, int *);
00419 extern "C" void zgetrf_(int *, int*, cmplx *, int *, int *, int *);
00420
00421 template < typename T >
00422 void inv_c(T **lhsMat, T **inv, int dim)
00423 {
00424 int *IPIV;
00425 cmplx *lhsMat_cplx, *WORK;
00426 int INFO;
00427
00428 lhsMat_cplx = new cmplx[dim*dim];
00429 WORK = new cmplx[dim];
00430 IPIV = new int[dim];
00431
00432 for (int i=0;i<dim;i++){
00433 for (int j=0;j<dim;j++){
00434 lhsMat_cplx[i+j*dim].re=real(lhsMat[i][j]);
00435 lhsMat_cplx[i+j*dim].im=imag(lhsMat[i][j]);
00436 }
00437 }
00438
00439 zgetrf_(&dim, &dim,lhsMat_cplx,&dim,IPIV,&INFO);
00440 zgetri_(&dim, lhsMat_cplx, &dim, IPIV, WORK, &dim, &INFO);
00441 for (int i=0;i<dim;i++)
00442 {
00443 for (int j=0;j<dim;j++) inv[i][j]= T(lhsMat_cplx[i+j*dim].re,lhsMat_cplx[i+j*dim].im);
00444 }
00445 delete [] lhsMat_cplx;
00446 delete [] WORK;
00447 delete [] IPIV;
00448
00449 }
00450 #endif
00451