CPPLapack
 All Classes Files Functions Variables Friends Pages
dsymatrix_small-functions.hpp
Go to the documentation of this file.
1 //=============================================================================
2 /*! convert dsymatrix_small to dgematrix_small */
3 template<CPPL_INT n>
5 {CPPL_VERBOSE_REPORT;
7  for(CPPL_INT i=0; i<n; i++){
8  for(CPPL_INT j=0; j<=i; j++){ newmat(i,j) =(*this)(i,j); }
9  for(CPPL_INT j=i+1; j<n; j++){ newmat(i,j) =(*this)(j,i); }
10  }
11  return newmat;
12 }
13 
14 //=============================================================================
15 /*! convert dsymatrix_small to dsymatrix */
16 template<CPPL_INT n>
18 {CPPL_VERBOSE_REPORT;
19  dsymatrix newmat(n);
20  for(CPPL_INT i=0; i<n; i++){
21  for(CPPL_INT j=0; j<=i; j++){
22  newmat(i,j) =(*this)(i,j);
23  }
24  }
25  return newmat;
26 }
27 
28 ///////////////////////////////////////////////////////////////////////////////
29 ///////////////////////////////////////////////////////////////////////////////
30 ///////////////////////////////////////////////////////////////////////////////
31 ///////////////////////////////////////////////////////////////////////////////
32 ///////////////////////////////////////////////////////////////////////////////
33 ///////////////////////////////////////////////////////////////////////////////
34 
35 //=============================================================================
36 /*! operator() */
37 template<CPPL_INT n>
38 inline double& dsymatrix_small<n>::operator()(const CPPL_INT& i, const CPPL_INT& j)
39 {CPPL_VERBOSE_REPORT;
40 #ifdef CPPL_DEBUG
41  if(i<j){
42  ERROR_REPORT;
43  std::cerr << "i must be greater than or equal to j since dsymatrix_small is L strage. " << std::endl;
44  std::cerr << "Your input was (" << i << ", " << j << ")." << std::endl;
45  exit(1);
46  }
47 #endif//CPPL_DEBUG
48 
49  //const CPPL_INT I(max(i,j)), J(min(i,j)); return array[(I*(I+1))/2 +J];
50  return array[(i*(i+1))/2 +j]; //L storage
51 }
52 
53 //=============================================================================
54 /*! operator() for const */
55 template<CPPL_INT n>
56 inline double dsymatrix_small<n>::operator()(const CPPL_INT& i, const CPPL_INT& j) const
57 {CPPL_VERBOSE_REPORT;
58 #ifdef CPPL_DEBUG
59  if(i<j){
60  ERROR_REPORT;
61  std::cerr << "i must be greater than or equal to j since dsymatrix_small is L strage. " << std::endl;
62  std::cerr << "Your input was (" << i << ", " << j << ")." << std::endl;
63  exit(1);
64  }
65 #endif//CPPL_DEBUG
66 
67  //const CPPL_INT I(max(i,j)), J(min(i,j)); return array[(I*(I+1))/2 +J];
68  return array[(i*(i+1))/2 +j];
69 }
70 
71 //=============================================================================
72 /*! set function */
73 template<CPPL_INT n>
74 inline dsymatrix_small<n>& dsymatrix_small<n>::set(const CPPL_INT& i, const CPPL_INT& j, const double& v)
75 {CPPL_VERBOSE_REPORT;
76  (*this)(i,j)=v;
77  return *this;
78 }
79 
80 //=============================================================================
81 /*! operator<< */
82 template<CPPL_INT n>
83 inline std::ostream& operator<<(std::ostream& s, const dsymatrix_small<n>& A)
84 {CPPL_VERBOSE_REPORT;
85  s << std::setiosflags(std::ios::showpos);
86  for(CPPL_INT i=0; i<n; i++){
87  for(CPPL_INT j=0; j<=i; j++){ s << " " << A(i,j) << " "<< std::flush; }
88  for(CPPL_INT j=i+1; j<n; j++){ s << "{" << A(j,i) << "}" << std::flush; }
89  s << std::endl;
90  }
91  return s;
92 }
93 
94 //=============================================================================
95 /*! write to file */
96 template<CPPL_INT n>
97 inline void dsymatrix_small<n>::write(const char* filename) const
98 {CPPL_VERBOSE_REPORT;
99  std::ofstream ofs(filename, std::ios::trunc);
100  ofs.setf(std::cout.flags());
101  ofs.precision(std::cout.precision());
102  ofs.width(std::cout.width());
103  ofs.fill(std::cout.fill());
104  ofs << "#dsymatrix" << " " << n << std::endl;
105  for(CPPL_INT i=0; i<n; i++){
106  for(CPPL_INT j=0; j<=i; j++){
107  ofs << (*this)(i,j) << " ";
108  }
109  ofs << std::endl;
110  }
111  ofs.close();
112 }
113 
114 //=============================================================================
115 /*! read from file */
116 template<CPPL_INT n>
117 inline void dsymatrix_small<n>::read(const char* filename)
118 {CPPL_VERBOSE_REPORT;
119  std::ifstream s(filename);
120  if(!s){
121  ERROR_REPORT;
122  std::cerr << "The file \"" << filename << "\" can not be opened." << std::endl;
123  exit(1);
124  }
125 
126  std::string id;
127  s >> id;
128  if( id != "dsymatrix" && id != "#dsymatrix" ){
129  ERROR_REPORT;
130  std::cerr << "The type name of the file \"" << filename << "\" is not dsymatrix." << std::endl
131  << "Its type name was " << id << " ." << std::endl;
132  exit(1);
133  }
134 
135  CPPL_INT _n;
136  s >> _n;
137  if(n!=_n){
138  ERROR_REPORT;
139  std::cerr << "Matrix size is invalid." << std::endl;
140  exit(1);
141  }
142 
143  for(CPPL_INT i=0; i<n; i++){
144  for(CPPL_INT j=0; j<=i; j++ ){
145  s >> operator()(i,j);
146  }
147  }
148  if(s.eof()){
149  ERROR_REPORT;
150  std::cerr << "There is something is wrong with the file \"" << filename << "\"." << std::endl
151  << "Most likely, there is a lack of data components, or a linefeed code or space code is missing at the end of the last line." << std::endl;
152  exit(1);
153  }
154 
155  s.close();
156 }
157 
158 ///////////////////////////////////////////////////////////////////////////////
159 ///////////////////////////////////////////////////////////////////////////////
160 ///////////////////////////////////////////////////////////////////////////////
161 ///////////////////////////////////////////////////////////////////////////////
162 ///////////////////////////////////////////////////////////////////////////////
163 ///////////////////////////////////////////////////////////////////////////////
164 
165 //=============================================================================
166 /*! zero */
167 template<CPPL_INT n>
169 {CPPL_VERBOSE_REPORT;
170  for(CPPL_INT i=0; i<n; i++){
171  for(CPPL_INT j=0; j<=i; j++){
172  (*this)(i,j) =0.;
173  }
174  }
175  return *this;
176 }
177 
178 //=============================================================================
179 /*! identity */
180 template<CPPL_INT n>
182 {CPPL_VERBOSE_REPORT;
183  zero();
184  for(CPPL_INT k=0; k<n; k++){
185  (*this)(k,k) =1.;
186  }
187  return *this;
188 }
189 
190 //=============================================================================
191 /*! return its trace */
192 template<CPPL_INT n>
193 inline double trace(const dsymatrix_small<n>& A)
194 {CPPL_VERBOSE_REPORT;
195  double trace =0.;
196  for(CPPL_INT i=0; i<n; i++){
197  trace +=A(i,i);
198  }
199  return trace;
200 }
201 
202 //=============================================================================
203 /*! return index of maximum component */
204 template<CPPL_INT n>
205 inline void idamax(CPPL_INT& I, CPPL_INT& J, const dsymatrix_small<n>& A)
206 {CPPL_VERBOSE_REPORT;
207  double max(-1.);
208  for(int i=0; i<n; i++){
209  for(int j=0; j<=i; j++){
210  if( max<fabs(A(i,j)) ){
211  I=i;
212  J=j;
213  max =fabs(A(i,j));
214  }
215  }
216  }
217  return;
218 }
219 
220 //=============================================================================
221 /*! return maximum component */
222 template<CPPL_INT n>
223 inline double damax(const dsymatrix_small<n>& A)
224 {CPPL_VERBOSE_REPORT;
225  CPPL_INT i(0),j(0);
226  idamax(i,j,A);
227  return A(i,j);
228 }
229 
230 ///////////////////////////////////////////////////////////////////////////////
231 ///////////////////////////////////////////////////////////////////////////////
232 ///////////////////////////////////////////////////////////////////////////////
233 ///////////////////////////////////////////////////////////////////////////////
234 ///////////////////////////////////////////////////////////////////////////////
235 ///////////////////////////////////////////////////////////////////////////////
236 
237 
238 //=============================================================================
239 /*! dsymatrix_small+=dsymatrix_small operator */
240 template<CPPL_INT n>
242 {CPPL_VERBOSE_REPORT;
243  for(CPPL_INT k=0; k<(n*(n+1))/2; k++){ A.array[k]+=B.array[k]; }
244  return A;
245 }
246 
247 //=============================================================================
248 /*! dsymatrix_small-=dsymatrix_small operator */
249 template<CPPL_INT n>
251 {CPPL_VERBOSE_REPORT;
252  for(CPPL_INT k=0; k<(n*(n+1))/2; k++){ A.array[k]-=B.array[k]; }
253  return A;
254 }
255 
256 //=============================================================================
257 /*! dsymatrix_small*=double operator */
258 template<CPPL_INT n>
260 {CPPL_VERBOSE_REPORT;
261  for(CPPL_INT i=0; i<n; i++){
262  for(CPPL_INT j=0; j<=i; j++){
263  A(i,j)*=v;
264  }
265  }
266  return A;
267 }
268 
269 //=============================================================================
270 /*! dsymatrix_small/=double operator */
271 template<CPPL_INT n>
273 {CPPL_VERBOSE_REPORT;
274  for(CPPL_INT i=0; i<n; i++){
275  for(CPPL_INT j=0; j<=i; j++){
276  A(i,j)/=v;
277  }
278  }
279  return A;
280 }
281 
282 ///////////////////////////////////////////////////////////////////////////////
283 ///////////////////////////////////////////////////////////////////////////////
284 ///////////////////////////////////////////////////////////////////////////////
285 
286 //=============================================================================
287 /*! unary + operator */
288 template<CPPL_INT n>
290 {CPPL_VERBOSE_REPORT;
291  return A;
292 }
293 
294 //=============================================================================
295 /*! unary - operator */
296 template<CPPL_INT n>
298 {CPPL_VERBOSE_REPORT;
300  for(CPPL_INT i=0; i<n; i++){
301  for(CPPL_INT j=0; j<=i; j++){
302  X(i,j)=-A(i,j);
303  }
304  }
305  return X;
306 }
307 
308 ///////////////////////////////////////////////////////////////////////////////
309 ///////////////////////////////////////////////////////////////////////////////
310 ///////////////////////////////////////////////////////////////////////////////
311 
312 //=============================================================================
313 /*! dsymatrix_small+dgematrix_small operator */
314 template<CPPL_INT n>
316 {CPPL_VERBOSE_REPORT;
318  for(CPPL_INT i=0; i<n; i++){
319  for(CPPL_INT j=0; j<i; j++){
320  X(i,j) =A(i,j)+B(i,j);
321  }
322  for(CPPL_INT j=i; j<n; j++){
323  X(i,j) =A(j,i)+B(i,j);
324  }
325  }
326  return X;
327 }
328 
329 //=============================================================================
330 /*! dsymatrix_small+dsymatrix_small operator */
331 template<CPPL_INT n>
333 {CPPL_VERBOSE_REPORT;
335  for(CPPL_INT i=0; i<n; i++){
336  for(CPPL_INT j=0; j<=i; j++){
337  X(i,j) =A(i,j)+B(i,j);
338  }
339  }
340  return X;
341 }
342 
343 
344 //=============================================================================
345 /*! dsymatrix_small-dgematrix_small operator */
346 template<CPPL_INT n>
348 {CPPL_VERBOSE_REPORT;
350  for(CPPL_INT i=0; i<n; i++){
351  for(CPPL_INT j=0; j<i; j++){
352  X(i,j) =A(i,j)-B(i,j);
353  }
354  for(CPPL_INT j=i; j<n; j++){
355  X(i,j) =A(j,i)-B(i,j);
356  }
357  }
358  return X;
359 }
360 
361 //=============================================================================
362 /*! dsymatrix_small-dsymatrix_small operator */
363 template<CPPL_INT n>
365 {CPPL_VERBOSE_REPORT;
367  for(CPPL_INT i=0; i<n; i++){
368  for(CPPL_INT j=0; j<=i; j++){
369  X(i,j) =A(i,j)-B(i,j);
370  }
371  }
372  return X;
373 }
374 
375 //=============================================================================
376 /*! dsymatrix_small*dcovector_small operator */
377 template<CPPL_INT n>
379 {CPPL_VERBOSE_REPORT;
381  C.zero();
382  for(CPPL_INT i=0; i<n; i++){
383  for(CPPL_INT j=0; j<i; j++){
384  C(i) +=A(i,j)*B(j);
385  }
386  for(CPPL_INT j=i; j<n; j++){
387  C(i) +=A(j,i)*B(j);
388  }
389  }
390  return C;
391 }
392 
393 //=============================================================================
394 /*! dsymatrix_small*dgematrix_small operator */
395 template<CPPL_INT m, CPPL_INT n>
397 {CPPL_VERBOSE_REPORT;
399  X.zero();
400  for(CPPL_INT i=0; i<m; i++){
401  for(CPPL_INT j=0; j<n; j++){
402  for(CPPL_INT k=0; k<i; k++){
403  X(i,j) +=A(i,k)*B(k,j);
404  }
405  for(CPPL_INT k=i; k<m; k++){
406  X(i,j) +=A(k,i)*B(k,j);
407  }
408  }
409  }
410  return X;
411 }
412 
413 //=============================================================================
414 /*! dsymatrix_small*dsymatrix_small operator */
415 template<CPPL_INT n>
417 {CPPL_VERBOSE_REPORT;
419  X.zero();
420  for(CPPL_INT i=0; i<n; i++){
421  for(CPPL_INT j=0; j<i; j++){
422  for(CPPL_INT k=0; k<j; k++){
423  X(i,j) +=A(i,k)*B(j,k);
424  }
425  for(CPPL_INT k=j; k<i; k++){
426  X(i,j) +=A(i,k)*B(k,j);
427  }
428  for(CPPL_INT k=i; k<n; k++){
429  X(i,j) +=A(k,i)*B(k,j);
430  }
431  }
432  for(CPPL_INT j=i; j<n; j++){
433  for(CPPL_INT k=0; k<i; k++){
434  X(i,j) +=A(i,k)*B(j,k);
435  }
436  for(CPPL_INT k=i; k<j; k++){
437  X(i,j) +=A(k,i)*B(j,k);
438  }
439  for(CPPL_INT k=j; k<n; k++){
440  X(i,j) +=A(k,i)*B(k,j);
441  }
442  }
443  }
444  return X;
445 }
446 
447 //=============================================================================
448 /*! dsymatrix_small*double operator */
449 template<CPPL_INT n>
450 inline dsymatrix_small<n> operator*(const dsymatrix_small<n>& A, const double& v)
451 {CPPL_VERBOSE_REPORT;
453  for(CPPL_INT i=0; i<n; i++){
454  for(CPPL_INT j=0; j<=i; j++){
455  C(i,j) =A(i,j)*v;
456  }
457  }
458  return C;
459 }
460 
461 //=============================================================================
462 /*! dsymatrix_small/double operator */
463 template<CPPL_INT n>
464 inline dsymatrix_small<n> operator/(const dsymatrix_small<n>& A, const double& v)
465 {CPPL_VERBOSE_REPORT;
467  for(CPPL_INT i=0; i<n; i++){
468  for(CPPL_INT j=0; j<=i; j++){
469  C(i,j) =A(i,j)/v;
470  }
471  }
472  return C;
473 }
474 
475 ///////////////////////////////////////////////////////////////////////////////
476 ///////////////////////////////////////////////////////////////////////////////
477 ///////////////////////////////////////////////////////////////////////////////
478 
479 //=============================================================================
480 /*! Hadamerd operator */
481 template<CPPL_INT n>
483 {CPPL_VERBOSE_REPORT;
485  for(CPPL_INT i=0; i<n; i++){
486  for(CPPL_INT j=0; j<=i; j++){
487  C(i,j) =A(i,j)*B(i,j);
488  }
489  for(CPPL_INT j=i+1; j<n; j++){
490  C(i,j) =A(j,i)*B(i,j);
491  }
492  }
493  return C;
494 }
495 
496 //=============================================================================
497 /*! Hadamerd operator */
498 template<CPPL_INT n>
500 {CPPL_VERBOSE_REPORT;
502  for(CPPL_INT i=0; i<n; i++){
503  for(CPPL_INT j=0; j<=i; j++){
504  C(i,j) =A(i,j)*B(i,j);
505  }
506  }
507  return C;
508 }
dsymatrix_small< n > & operator/=(dsymatrix_small< n > &A, const double &v)
const dsymatrix_small< n > & operator+(const dsymatrix_small< n > &A)
void write(const char *filename) const
dcovector_small< l > & zero()
Samll Real Double-precision Symmetric Matrix Class.
dsymatrix_small< n > & identity()
dsymatrix_small< n > & operator*=(dsymatrix_small< n > &A, const double &v)
dsymatrix_small< n > & operator+=(dsymatrix_small< n > &A, const dsymatrix_small< n > &B)
Samll Real Double-precision General Dence Matrix Class.
dgematrix_small< n, n > to_dgematrix_small() const
_dgematrix i(const _dgbmatrix &mat)
double damax(const dsymatrix_small< n > &A)
dgematrix_small< m, n > & zero()
dsymatrix to_dsymatrix() const
Real Double-precision Symmetric Matrix Class [l-type (UPLO=l) Strage].
Definition: dsymatrix.hpp:3
dsymatrix_small< n > operator-(const dsymatrix_small< n > &A)
void idamax(CPPL_INT &I, CPPL_INT &J, const dsymatrix_small< n > &A)
dsymatrix_small< n > & set(const CPPL_INT &, const CPPL_INT &, const double &)
dsymatrix_small< n > operator/(const dsymatrix_small< n > &A, const double &v)
void read(const char *filename)
dsymatrix_small< n > & operator-=(dsymatrix_small< n > &A, const dsymatrix_small< n > &B)
dgematrix_small< n, n > hadamerd(const dsymatrix_small< n > &A, const dgematrix_small< n, n > &B)
dcovector_small< n > operator*(const dsymatrix_small< n > &A, const dcovector_small< n > &B)
Samll Real Double-precision Column Vector Class.
double trace(const dsymatrix_small< n > &A)
double & operator()(const CPPL_INT &i, const CPPL_INT &j)
dsymatrix_small< n > & zero()
double array[(n *(n+1))/2]
1D array to store vector data