CPPLapack
 All Classes Files Functions Variables Friends Pages
zgematrix_small-functions.hpp
Go to the documentation of this file.
1 //=============================================================================
2 /*! convert zgematrix_small to zgematrix */
3 template<CPPL_INT m, CPPL_INT n>
5 {CPPL_VERBOSE_REPORT;
6  zgematrix mat(m,n);
7  for(CPPL_INT i=0; i<m; i++){
8  for(CPPL_INT j=0; j<n; j++){
9  mat(i,j) =(*this)(i,j);
10  }
11  }
12  return _(mat);
13 }
14 
15 ///////////////////////////////////////////////////////////////////////////////
16 ///////////////////////////////////////////////////////////////////////////////
17 ///////////////////////////////////////////////////////////////////////////////
18 
19 //=============================================================================
20 /*! operator() */
21 template<CPPL_INT m, CPPL_INT n>
22 inline comple& zgematrix_small<m,n>::operator()(const CPPL_INT& i, const CPPL_INT& j)
23 {CPPL_VERBOSE_REPORT;
24 #ifdef CPPL_DEBUG
25  if( i<0 || j<0 || m<=i || n<=j ){
26  ERROR_REPORT;
27  std::cerr << "The required component is out of the matrix size." << std::endl
28  << "Your input is (" << i << "," << j << "), whereas the matrix size is " << m << "x" << n << "." << std::endl;
29  exit(1);
30  }
31 #endif//CPPL_DEBUG
32 
33  return array[i+m*j];
34 }
35 
36 //=============================================================================
37 /*! operator() for const */
38 template<CPPL_INT m, CPPL_INT n>
39 inline comple zgematrix_small<m,n>::operator()(const CPPL_INT& i, const CPPL_INT& j) const
40 {CPPL_VERBOSE_REPORT;
41 #ifdef CPPL_DEBUG
42  if( i<0 || j<0 || m<=i || n<=j ){
43  ERROR_REPORT;
44  std::cerr << "The required component is out of the matrix size." << std::endl
45  << "Your input is (" << i << "," << j << "), whereas the matrix size is " << m << "x" << n << "." << std::endl;
46  exit(1);
47  }
48 #endif//CPPL_DEBUG
49 
50  return array[i+m*j];
51 }
52 
53 //=============================================================================
54 /*! set */
55 template<CPPL_INT m, CPPL_INT n>
56 inline zgematrix_small<m,n>& zgematrix_small<m,n>::set(const CPPL_INT& i, const CPPL_INT& j, const comple& v)
57 {CPPL_VERBOSE_REPORT;
58  (*this)(i,j) =v;
59  return *this;
60 }
61 
62 //=============================================================================
63 /*! operator<< */
64 template<CPPL_INT m, CPPL_INT n>
65 inline std::ostream& operator<<(std::ostream& s, const zgematrix_small<m,n>& A)
66 {CPPL_VERBOSE_REPORT;
67  s << std::setiosflags(std::ios::showpos);
68  for(CPPL_INT i=0; i<m; i++){
69  for(CPPL_INT j=0; j<n; j++){
70  s << " " << A(i,j);
71  }
72  s << std::endl;
73  }
74  return s;
75 }
76 
77 //=============================================================================
78 /*! write to file */
79 template<CPPL_INT m, CPPL_INT n>
80 inline void zgematrix_small<m,n>::write(const char* filename) const
81 {CPPL_VERBOSE_REPORT;
82  std::ofstream ofs(filename, std::ios::trunc);
83  ofs.setf(std::cout.flags());
84  ofs.precision(std::cout.precision());
85  ofs.width(std::cout.width());
86  ofs.fill(std::cout.fill());
87  ofs << "#zgematrix" << " " << m << " " << n << std::endl;
88  for(CPPL_INT i=0; i<m; i++){
89  for(CPPL_INT j=0; j<n; j++){
90  ofs << (*this)(i,j) << " ";
91  }
92  ofs << std::endl;
93  }
94  ofs.close();
95 }
96 
97 //=============================================================================
98 /*! read from file */
99 template<CPPL_INT m, CPPL_INT n>
100 inline void zgematrix_small<m,n>::read(const char* filename)
101 {CPPL_VERBOSE_REPORT;
102  std::ifstream s( filename );
103  if(!s){
104  ERROR_REPORT;
105  std::cerr << "The file \"" << filename << "\" can not be opened." << std::endl;
106  exit(1);
107  }
108 
109  std::string id;
110  s >> id;
111  if( id != "zgematrix" && id != "#zgematrix" ){
112  ERROR_REPORT;
113  std::cerr << "The type name of the file \"" << filename << "\" is not zgematrix." << std::endl
114  << "Its type name was " << id << " ." << std::endl;
115  exit(1);
116  }
117 
118  CPPL_INT _m, _n;
119  s >> _m >> _n;
120  if(m!=_m || n!=_n){
121  ERROR_REPORT;
122  std::cerr << "Matrix size is invalid." << std::endl;
123  exit(1);
124  }
125  for(CPPL_INT i=0; i<m; i++){
126  for(CPPL_INT j=0; j<n; j++ ){
127  s >> operator()(i,j);
128  }
129  }
130  if(s.eof()){
131  ERROR_REPORT;
132  std::cerr << "There is something is wrong with the file \"" << filename << "\"." << std::endl
133  << "Most likely, there is not enough data components, or a linefeed code or space code is missing at the end of the last line." << std::endl;
134  exit(1);
135  }
136 
137  s >> id;
138  if(!s.eof()){
139  ERROR_REPORT;
140  std::cerr << "There is something is wrong with the file \"" << filename << "\"." << std::endl
141  << "Most likely, there are extra data components." << std::endl;
142  exit(1);
143  }
144 
145  s.close();
146 }
147 
148 ///////////////////////////////////////////////////////////////////////////////
149 ///////////////////////////////////////////////////////////////////////////////
150 ///////////////////////////////////////////////////////////////////////////////
151 ///////////////////////////////////////////////////////////////////////////////
152 ///////////////////////////////////////////////////////////////////////////////
153 ///////////////////////////////////////////////////////////////////////////////
154 
155 //=============================================================================
156 /*! return transposed zgematrix_small */
157 template<CPPL_INT m, CPPL_INT n>
159 {CPPL_VERBOSE_REPORT;
161  for(CPPL_INT i=0; i<m; i++){
162  for(CPPL_INT j=0; j<n; j++){
163  X(j,i) =A(i,j);
164  }
165  }
166  return X;
167 }
168 
169 //=============================================================================
170 /*! return its trace */
171 template<CPPL_INT m, CPPL_INT n>
172 inline comple trace(const zgematrix_small<m,n>& A)
173 {CPPL_VERBOSE_REPORT;
174  comple trace =comple(0.,0);
175 
176  const CPPL_INT imax =std::min(m,n);
177  for(CPPL_INT i=0; i<imax; i++){
178  trace +=A(i,i);
179  }
180 
181  return trace;
182 }
183 
184 ///////////////////////////////////////////////////////////////////////////////
185 ///////////////////////////////////////////////////////////////////////////////
186 ///////////////////////////////////////////////////////////////////////////////
187 
188 //=============================================================================
189 /*! zero */
190 template<CPPL_INT m, CPPL_INT n>
192 {CPPL_VERBOSE_REPORT;
193  for(CPPL_INT k=0; k<m*n; k++){
194  array[k] =comple(0.,0.);
195  }
196 
197  return *this;
198 }
199 
200 //=============================================================================
201 /*! identity */
202 template<CPPL_INT m, CPPL_INT n>
204 {CPPL_VERBOSE_REPORT;
205  zero();
206 
207  const CPPL_INT kmax =std::min(m,n);
208  for(CPPL_INT k=0; k<kmax; k++){
209  (*this)(k,k) =1.;
210  }
211 
212  return *this;
213 }
214 
215 //=============================================================================
216 /*! return the j-th column vector */
217 template<CPPL_INT m, CPPL_INT n>
218 inline zcovector_small<m> zgematrix_small<m,n>::col(const CPPL_INT& j) const
219 {CPPL_VERBOSE_REPORT;
220  zcovector_small<m> vec;
221  for(CPPL_INT i=0; i<m; i++){
222  vec(i) =(*this)(i,j);
223  }
224  return vec;
225 }
226 
227 //=============================================================================
228 /*! return the i-th row vector */
229 template<CPPL_INT m, CPPL_INT n>
230 inline zrovector_small<n> zgematrix_small<m,n>::row(const CPPL_INT& i) const
231 {CPPL_VERBOSE_REPORT;
232  zrovector_small<n> vec;
233  for(CPPL_INT j=0; j<n; j++){
234  vec(j)=(*this)(i,j);
235  }
236  return vec;
237 }
238 
239 ///////////////////////////////////////////////////////////////////////////////
240 ///////////////////////////////////////////////////////////////////////////////
241 ///////////////////////////////////////////////////////////////////////////////
242 
243 //=============================================================================
244 /*! zgematrix_small+=zgematrix_small operator */
245 template<CPPL_INT m, CPPL_INT n>
247 {CPPL_VERBOSE_REPORT;
248  for(CPPL_INT k=0; k<m*n; k++){
249  A.array[k] +=B.array[k];
250  }
251  return A;
252 }
253 
254 //=============================================================================
255 /*! zgematrix_small-=zgematrix_small operator */
256 template<CPPL_INT m, CPPL_INT n>
258 {CPPL_VERBOSE_REPORT;
259  for(CPPL_INT k=0; k<m*n; k++){
260  A.array[k] -=B.array[k];
261  }
262  return A;
263 }
264 
265 //=============================================================================
266 /*! zgematrix_small*=zgematrix_small operator */
267 template<CPPL_INT m, CPPL_INT l, CPPL_INT n>
269 {CPPL_VERBOSE_REPORT;
271  X.zero();
272  for(CPPL_INT i=0; i<m; i++){
273  for(CPPL_INT j=0; j<n; j++){
274  for(CPPL_INT k=0; k<l; k++){
275  X(i,j) += A(i,k)*B(k,j);
276  }
277  }
278  }
279  A =X;
280  return A;
281 }
282 
283 //=============================================================================
284 /*! zgematrix_small*=double operator */
285 template<CPPL_INT m, CPPL_INT n>
287 {CPPL_VERBOSE_REPORT;
288  for(CPPL_INT k=0; k<m*n; k++){
289  A.array[k] *=v;
290  }
291  return A;
292 }
293 
294 //=============================================================================
295 /*! zgematrix_small*=comple operator */
296 template<CPPL_INT m, CPPL_INT n>
298 {CPPL_VERBOSE_REPORT;
299  for(CPPL_INT k=0; k<m*n; k++){
300  A.array[k] *=v;
301  }
302  return A;
303 }
304 
305 //=============================================================================
306 /*! zgematrix_small/=double operator */
307 template<CPPL_INT m, CPPL_INT n>
309 {CPPL_VERBOSE_REPORT;
310  for(CPPL_INT k=0; k<m*n; k++){
311  A.array[k] /=v;
312  }
313  return A;
314 }
315 //=============================================================================
316 /*! zgematrix_small/=comple operator */
317 template<CPPL_INT m, CPPL_INT n>
319 {CPPL_VERBOSE_REPORT;
320  for(CPPL_INT k=0; k<m*n; k++){
321  A.array[k] /=v;
322  }
323  return A;
324 }
325 
326 ///////////////////////////////////////////////////////////////////////////////
327 ///////////////////////////////////////////////////////////////////////////////
328 ///////////////////////////////////////////////////////////////////////////////
329 
330 //=============================================================================
331 /*! unary + operator */
332 template<CPPL_INT m, CPPL_INT n>
334 {CPPL_VERBOSE_REPORT;
335  return A;
336 }
337 
338 //=============================================================================
339 /*! unary - operator */
340 template<CPPL_INT m, CPPL_INT n>
342 {CPPL_VERBOSE_REPORT;
344  for(CPPL_INT i=0; i<m; i++){
345  for(CPPL_INT j=0; j<n; j++){
346  X(i,j) =-A(i,j);
347  }
348  }
349  return X;
350 }
351 
352 ///////////////////////////////////////////////////////////////////////////////
353 ///////////////////////////////////////////////////////////////////////////////
354 ///////////////////////////////////////////////////////////////////////////////
355 
356 //=============================================================================
357 /*! zgematrix_small+zgematrix_small operator */
358 template<CPPL_INT m, CPPL_INT n>
360 {CPPL_VERBOSE_REPORT;
362  for(int i=0; i<m; i++){
363  for(int j=0; j<n; j++){
364  C(i,j) =A(i,j)+B(i,j);
365  }
366  }
367  return C;
368 }
369 
370 //=============================================================================
371 /*! zgematrix_small+zhematrix_small operator */
372 template<CPPL_INT n>
374 {CPPL_VERBOSE_REPORT;
376  for(CPPL_INT i=0; i<n; i++){
377  for(CPPL_INT j=0; j<i; j++){
378  X(i,j) =A(i,j)+B(i,j);
379  }
380  for(CPPL_INT j=i; j<n; j++){
381  X(i,j) =A(i,j)+B(j,i);
382  }
383  }
384  return X;
385 }
386 
387 //=============================================================================
388 /*! zgematrix_small-zgematrix_small operator */
389 template<CPPL_INT m, CPPL_INT n>
391 {CPPL_VERBOSE_REPORT;
393  for(int i=0; i<m; i++){
394  for(int j=0; j<n; j++){
395  C(i,j)=A(i,j)-B(i,j);
396  }
397  }
398  return C;
399 }
400 
401 //=============================================================================
402 /*! zgematrix_small-zhematrix_small operator */
403 template<CPPL_INT n>
405 {CPPL_VERBOSE_REPORT;
407  for(CPPL_INT i=0; i<n; i++){
408  for(CPPL_INT j=0; j<=i; j++){
409  X(i,j)=A(i,j)-B(i,j);
410  }
411  for(CPPL_INT j=i+1; j<n; j++){
412  X(i,j)=A(i,j)-B(j,i);
413  }
414  }
415  return X;
416 }
417 
418 ///////////////////////////////////////////////////////////////////////////////
419 ///////////////////////////////////////////////////////////////////////////////
420 ///////////////////////////////////////////////////////////////////////////////
421 
422 //=============================================================================
423 /*! zgematrix_small*zcovector_small operator */
424 template<CPPL_INT m, CPPL_INT n>
426 {CPPL_VERBOSE_REPORT;
428  C.zero();
429  for(CPPL_INT i=0; i<m; i++){
430  for(CPPL_INT j=0; j<n; j++){
431  C(i) +=A(i,j)*B(j);
432  }
433  }
434  return C;
435 }
436 
437 //=============================================================================
438 /*! zgematrix_small*zgematrix_small operator */
439 template<CPPL_INT m, CPPL_INT l, CPPL_INT n>
441 {CPPL_VERBOSE_REPORT;
443  C.zero();
444  for(int i=0; i<m; i++){
445  for(int j=0; j<n; j++){
446  for(int k=0; k<l; k++){
447  C(i,j) +=A(i,k)*B(k,j);
448  }
449  }
450  }
451  return C;
452 }
453 
454 //=============================================================================
455 /*! zgematrix_small+zhematrix_small operator */
456 template<CPPL_INT m, CPPL_INT n>
458 {CPPL_VERBOSE_REPORT;
460  X.zero();
461  for(CPPL_INT i=0; i<m; i++){
462  for(CPPL_INT j=0; j<n; j++){
463  for(CPPL_INT k=0; k<j; k++){
464  X(i,j) +=A(i,k)*B(j,k);
465  }
466  for(CPPL_INT k=j; k<n; k++){
467  X(i,j) +=A(i,k)*B(k,j);
468  }
469  }
470  }
471  return X;
472 }
473 
474 //=============================================================================
475 /*! zgematrix_small*double operator */
476 template<CPPL_INT m, CPPL_INT n>
477 inline zgematrix_small<m,n> operator*(const zgematrix_small<m,n>& A, const double& v)
478 {CPPL_VERBOSE_REPORT;
480  for(CPPL_INT i=0; i<m; i++){
481  for(CPPL_INT j=0; j<n; j++){
482  C(i,j) =A(i,j)*v;
483  }
484  }
485  return C;
486 }
487 
488 //=============================================================================
489 /*! zgematrix_small*comple operator */
490 template<CPPL_INT m, CPPL_INT n>
491 inline zgematrix_small<m,n> operator*(const zgematrix_small<m,n>& A, const comple& v)
492 {CPPL_VERBOSE_REPORT;
494  for(CPPL_INT i=0; i<m; i++){
495  for(CPPL_INT j=0; j<n; j++){
496  C(i,j) =A(i,j)*v;
497  }
498  }
499  return C;
500 }
501 
502 ///////////////////////////////////////////////////////////////////////////////
503 ///////////////////////////////////////////////////////////////////////////////
504 ///////////////////////////////////////////////////////////////////////////////
505 
506 //=============================================================================
507 /*! zgematrix_small/double operator */
508 template<CPPL_INT m, CPPL_INT n>
509 inline zgematrix_small<m,n> operator/(const zgematrix_small<m,n>& A, const double& v)
510 {CPPL_VERBOSE_REPORT;
512  for(CPPL_INT i=0; i<m; i++){
513  for(CPPL_INT j=0; j<n; j++){
514  C(i,j) =A(i,j)/v;
515  }
516  }
517  return C;
518 }
519 
520 //=============================================================================
521 /*! zgematrix_small/comple operator */
522 template<CPPL_INT m, CPPL_INT n>
523 inline zgematrix_small<m,n> operator/(const zgematrix_small<m,n>& A, const comple& v)
524 {CPPL_VERBOSE_REPORT;
526  for(CPPL_INT i=0; i<m; i++){
527  for(CPPL_INT j=0; j<n; j++){
528  C(i,j) =A(i,j)/v;
529  }
530  }
531  return C;
532 }
533 
534 ///////////////////////////////////////////////////////////////////////////////
535 ///////////////////////////////////////////////////////////////////////////////
536 ///////////////////////////////////////////////////////////////////////////////
537 
538 //=============================================================================
539 /*! Hadamerd product */
540 template<CPPL_INT m, CPPL_INT n>
542 {CPPL_VERBOSE_REPORT;
544  for(CPPL_INT i=0; i<m; i++){
545  for(CPPL_INT j=0; j<n; j++){
546  C(i,j) =A(i,j)*B(i,j);
547  }
548  }
549  return C;
550 }
551 
552 //=============================================================================
553 /*! Hadamerd product */
554 template<CPPL_INT n>
556 {CPPL_VERBOSE_REPORT;
558  for(CPPL_INT i=0; i<n; i++){
559  for(CPPL_INT j=0; j<=i; j++){
560  C(i,j) =A(i,j)*B(i,j);
561  }
562  for(CPPL_INT j=i+1; j<n; j++){
563  C(i,j) =A(i,j)*conj(B(j,i));
564  }
565  }
566  return C;
567 }
const zgematrix_small< m, n > & operator+(const zgematrix_small< m, n > &A)
void write(const char *filename) const
zgematrix_small< m, n > & operator*=(zgematrix_small< m, l > &A, const zgematrix_small< l, n > &B)
comple array[m *n]
_dgematrix i(const _dgbmatrix &mat)
Samll Complex Double-precision Column Vector Class.
zgematrix_small< m, n > & operator-=(zgematrix_small< m, n > &A, const zgematrix_small< m, n > &B)
zgematrix_small< m, n > & operator+=(zgematrix_small< m, n > &A, const zgematrix_small< m, n > &B)
_zcovector conj(const _zcovector &vec)
Samll Complex Double-precision Row Vector Class.
zcovector_small< l > & zero()
_zgematrix to_zgematrix() const
Complex Double-precision General Dence Matrix Class.
Definition: zgematrix.hpp:3
(DO NOT USE) Smart-temporary Complex Double-precision General Dence Matrix Class
Definition: _zgematrix.hpp:3
zgematrix_small< m, n > & zero()
zgematrix_small< m, n > & identity()
zgematrix_small< m, n > & operator/=(zgematrix_small< m, n > &A, const double &v)
zgematrix_small< m, n > hadamerd(const zgematrix_small< m, n > &A, const zgematrix_small< m, n > &B)
zrovector_small< n > row(const CPPL_INT &i) const
zcovector_small< m > col(const CPPL_INT &j) const
zgematrix_small< n, m > t(const zgematrix_small< m, n > &A)
void read(const char *filename)
zgematrix_small< m, n > & set(const CPPL_INT &i, const CPPL_INT &j, const comple &v)
comple trace(const zgematrix_small< m, n > &A)
zgematrix_small< m, n > operator/(const zgematrix_small< m, n > &A, const double &v)
zgematrix_small< m, n > operator-(const zgematrix_small< m, n > &A)
comple & operator()(const CPPL_INT &i, const CPPL_INT &j)
_dcovector _(dcovector &vec)
zcovector_small< m > operator*(const zgematrix_small< m, n > &A, const zcovector_small< n > &B)
Samll Complex Double-precision General Dence Matrix Class.
Samll Complex Double-precision Symmetric Matrix Class.