CPPLapack
 All Classes Files Functions Variables Friends Pages
dgbmatrix-_dgbmatrix.hpp
Go to the documentation of this file.
1 //=============================================================================
2 /*! dgbmatrix=_dgbmatrix operator */
4 {CPPL_VERBOSE_REPORT;
5  shallow_copy(mat);
6  return *this;
7 }
8 
9 ///////////////////////////////////////////////////////////////////////////////
10 ///////////////////////////////////////////////////////////////////////////////
11 ///////////////////////////////////////////////////////////////////////////////
12 
13 //=============================================================================
14 /*! dgbmatrix+=_dgbmatrix operator\n
15  If the band width of the left side matrix is narrower than the right side matrix, the band width of the left side matrix become thicker as same as the right side matrix. */
17 {CPPL_VERBOSE_REPORT;
18 #ifdef CPPL_DEBUG
19  if(n!=mat.n || m!=mat.m){
20  ERROR_REPORT;
21  std::cerr << "These two matrises can not make a summation." << std::endl
22  << "Your input was" << "(" << m <<"x"<< n <<","<< kl <<":"<< ku << ") "<< "+=" << "("<< mat.m <<"x"<< mat.n <<","<< mat.kl <<":"<< mat.ku <<") " << std::endl;
23  exit(1);
24  }
25 #endif//CPPL_DEBUG
26 
27  if(kl>=mat.kl && ku>=mat.ku){
28  for(CPPL_INT i=0; i<m; i++){
29  const CPPL_INT jmax =std::min(n,i+mat.ku+1);
30  for(CPPL_INT j=std::max(CPPL_INT(0),i-mat.kl); j<jmax; j++){
31  operator()(i,j) += mat(i,j);
32  }
33  }
34 
35  mat.destroy();
36  return *this;
37  }
38  else{
39  dgbmatrix newmat(m,n,std::max(kl,mat.kl),std::max(ku,mat.ku));
40  newmat.zero();
41  for(CPPL_INT i=0; i<m; i++){
42  const CPPL_INT jmax1 =std::min(n,i+ku+1);
43  for(CPPL_INT j=std::max(CPPL_INT(0),i-kl); j<jmax1; j++){
44  newmat(i,j)+=operator()(i,j);
45  }
46  const CPPL_INT jmax2 =std::min(mat.n,i+mat.ku+1);
47  for(CPPL_INT j=std::max(CPPL_INT(0),i-mat.kl); j<jmax2; j++){
48  newmat(i,j)+=mat(i,j);
49  }
50  }
51 
52  swap(*this,newmat);
53  mat.destroy();
54  return *this;
55  }
56 }
57 
58 //=============================================================================
59 /*! dgbmatrix-=_dgbmatrix operator\n
60  If the band width of the left side matrix is narrower than the right side matrix, the band width of the left side matrix become thicker as same as the right side matrix. */
62 {CPPL_VERBOSE_REPORT;
63 #ifdef CPPL_DEBUG
64  if(n!=mat.n || m!=mat.m){
65  ERROR_REPORT;
66  std::cerr << "These two matrises can not make a subtraction." << std::endl
67  << "Your input was" << "(" << m <<"x"<< n <<","<< kl <<":"<< ku << ") "<< "-=" << "("<< mat.m <<"x"<< mat.n <<","<< mat.kl <<":"<< mat.ku <<") " << std::endl;
68  exit(1);
69  }
70 #endif//CPPL_DEBUG
71 
72  if(kl>=mat.kl && ku>=mat.ku){
73  for(CPPL_INT i=0; i<m; i++){
74  const CPPL_INT jmax =std::min(n,i+mat.ku+1);
75  for(CPPL_INT j=std::max(CPPL_INT(0),i-mat.kl); j<jmax; j++){
76  operator()(i,j) -= mat(i,j);
77  }
78  }
79 
80  mat.destroy();
81  return *this;
82  }
83  else{
84  dgbmatrix newmat(m,n,std::max(kl,mat.kl),std::max(ku,mat.ku));
85  newmat.zero();
86  for(CPPL_INT i=0; i<m; i++){
87  const CPPL_INT jmax1 =std::min(n,i+ku+1);
88  for(CPPL_INT j=std::max(CPPL_INT(0),i-kl); j<jmax1; j++){
89  newmat(i,j)+=operator()(i,j);
90  }
91  const CPPL_INT jmax2 =std::min(mat.n,i+mat.ku+1);
92  for(CPPL_INT j=std::max(CPPL_INT(0),i-mat.kl); j<jmax2; j++){
93  newmat(i,j)-=mat(i,j);
94  }
95  }
96 
97  swap(*this,newmat);
98  mat.destroy();
99  return *this;
100  }
101 }
102 
103 //=============================================================================
104 /*! dgbmatrix*=_dgbmatrix operator */
106 {CPPL_VERBOSE_REPORT;
107 #ifdef CPPL_DEBUG
108  if(n!=mat.m){
109  ERROR_REPORT;
110  std::cerr << "These two matrises can not make a product." << std::endl
111  << "Your input was (" << m << "x" << n << ") * (" << mat.m << "x" << mat.n << ")." << std::endl;
112  exit(1);
113  }
114 #endif//CPPL_DEBUG
115 
116  dgbmatrix newmat( m, mat.n, std::min(kl+mat.kl, m-1), std::min(ku+mat.ku, mat.n-1) );
117  newmat.zero();
118 
119  for(CPPL_INT i=0; i<newmat.m; i++){
120  const CPPL_INT jmax =std::min(newmat.n,i+newmat.ku+1);
121  for(CPPL_INT j=std::max(CPPL_INT(0),i-newmat.kl); j<jmax; j++){
122  const CPPL_INT kmax =std::min( std::min(n,i+ku+1), std::min(mat.m,j+mat.kl+1) );
123  for(CPPL_INT k=std::max( std::max(CPPL_INT(0),i-kl), std::max(CPPL_INT(0),j-mat.ku) ); k<kmax; k++){
124  newmat(i,j)+= operator()(i,k)*mat(k,j);
125  }
126  }
127  }
128 
129  swap(*this,newmat);
130  mat.destroy();
131  return *this;
132 }
133 
134 ///////////////////////////////////////////////////////////////////////////////
135 ///////////////////////////////////////////////////////////////////////////////
136 ///////////////////////////////////////////////////////////////////////////////
137 
138 //=============================================================================
139 /*! dgbmatrix+_dgbmatrix operator */
140 inline _dgbmatrix operator+(const dgbmatrix& matA, const _dgbmatrix& matB)
141 {CPPL_VERBOSE_REPORT;
142 #ifdef CPPL_DEBUG
143  if(matA.n!=matB.n || matA.m!=matB.m){
144  ERROR_REPORT;
145  std::cerr << "These two matrises can not make a summation." << std::endl
146  << "Your input was (" << matA.m << "x" << matA.n << ") + (" << matB.m << "x" << matB.n << ")." << std::endl;
147  exit(1);
148  }
149 #endif//CPPL_DEBUG
150 
151  if(matB.kl>matA.kl && matB.ku>matA.ku){
152  for(CPPL_INT i=0; i<matA.m; i++){
153  const CPPL_INT jmax =std::min(matA.n,i+matA.ku+1);
154  for(CPPL_INT j=std::max(CPPL_INT(0),i-matA.kl); j<jmax; j++){
155  matB(i,j)+=matA(i,j);
156  }
157  }
158 
159  return matB;
160  }
161  else{
162  dgbmatrix newmat(matA.m,matA.n,std::max(matA.kl,matB.kl),std::max(matA.ku,matB.ku));
163  newmat.zero();
164 
165  for(CPPL_INT i=0; i<matA.m; i++){
166  const CPPL_INT jmax1 =std::min(matA.n,i+matA.ku+1);
167  for(CPPL_INT j=std::max(CPPL_INT(0),i-matA.kl); j<jmax1; j++){
168  newmat(i,j)+=matA(i,j);
169  }
170  const CPPL_INT jmax2 =std::min(matB.n,i+matB.ku+1);
171  for(CPPL_INT j=std::max(CPPL_INT(0),i-matB.kl); j<jmax2; j++){
172  newmat(i,j)+=matB(i,j);
173  }
174  }
175 
176  matB.destroy();
177  return _(newmat);
178  }
179 }
180 
181 //=============================================================================
182 /*! dgbmatrix-_dgbmatrix operator */
183 inline _dgbmatrix operator-(const dgbmatrix& matA, const _dgbmatrix& matB)
184 {CPPL_VERBOSE_REPORT;
185 #ifdef CPPL_DEBUG
186  if(matA.n!=matB.n || matA.m!=matB.m){
187  ERROR_REPORT;
188  std::cerr << "These two matrises can not make a subtraction." << std::endl
189  << "Your input was (" << matA.m << "x" << matA.n << ") - (" << matB.m << "x" << matB.n << ")." << std::endl;
190  exit(1);
191  }
192 #endif//CPPL_DEBUG
193 
194  dgbmatrix newmat(matA.m,matA.n,std::max(matA.kl,matB.kl),std::max(matA.ku,matB.ku));
195  newmat.zero();
196 
197  for(CPPL_INT i=0; i<matA.m; i++){
198  const CPPL_INT jmax1 =std::min(matA.n,i+matA.ku+1);
199  for(CPPL_INT j=std::max(CPPL_INT(0),i-matA.kl); j<jmax1; j++){
200  newmat(i,j)+=matA(i,j);
201  }
202  const CPPL_INT jmax2 =std::min(matB.n,i+matB.ku+1);
203  for(CPPL_INT j=std::max(CPPL_INT(0),i-matB.kl); j<jmax2; j++){
204  newmat(i,j)-=matB(i,j);
205  }
206  }
207 
208  matB.destroy();
209  return _(newmat);
210 }
211 
212 //=============================================================================
213 /*! dgbmatrix*_dgbmatrix operator */
214 inline _dgbmatrix operator*(const dgbmatrix& matA, const _dgbmatrix& matB)
215 {CPPL_VERBOSE_REPORT;
216 #ifdef CPPL_DEBUG
217  if(matA.n!=matB.m){
218  ERROR_REPORT;
219  std::cerr << "These two matrises can not make a product." << std::endl
220  << "Your input was (" << matA.m << "x" << matA.n << ") * (" << matB.m << "x" << matB.n << ")." << std::endl;
221  exit(1);
222  }
223 #endif//CPPL_DEBUG
224 
225  dgbmatrix newmat( matA.m, matB.n, std::min(matA.kl+matB.kl,matA.m-1), std::min(matA.ku+matB.ku,matB.n-1) );
226  newmat.zero();
227 
228  for(CPPL_INT i=0; i<newmat.m; i++){
229  const CPPL_INT jmax =std::min(newmat.n,i+newmat.ku+1);
230  for(CPPL_INT j=std::max(CPPL_INT(0),i-newmat.kl); j<jmax; j++){
231  const CPPL_INT kmax =std::min( std::min(matA.n,i+matA.ku+1), std::min(matB.m,j+matB.kl+1) );
232  for(CPPL_INT k=std::max( std::max(CPPL_INT(0),i-matA.kl), std::max(CPPL_INT(0),j-matB.ku) ); k<kmax; k++){
233  newmat(i,j)+= matA(i,k)*matB(k,j);
234  }
235  }
236  }
237 
238  matB.destroy();
239  return _(newmat);
240 }
dgbmatrix & operator=(const dgbmatrix &)
friend _dgematrix i(const dgbmatrix &)
CPPL_INT m
matrix row size
Definition: dgbmatrix.hpp:9
CPPL_INT ku
upper band width
Definition: _dgbmatrix.hpp:12
void shallow_copy(const _dgbmatrix &)
void destroy() const
_dgematrix i(const _dgbmatrix &mat)
_dgbmatrix operator*(const dgbmatrix &matA, const _dgbmatrix &matB)
CPPL_INT kl
lower band width
Definition: dgbmatrix.hpp:11
CPPL_INT kl
lower band width
Definition: _dgbmatrix.hpp:11
_dgbmatrix operator-(const dgbmatrix &matA, const _dgbmatrix &matB)
CPPL_INT ku
upper band width
Definition: dgbmatrix.hpp:12
dgbmatrix & operator+=(const dgbmatrix &)
CPPL_INT n
matrix column size
Definition: _dgbmatrix.hpp:10
Real Double-precision General Band Matrix Class.
Definition: dgbmatrix.hpp:3
dgbmatrix & operator*=(const dgbmatrix &)
_dgbmatrix operator+(const dgbmatrix &matA, const _dgbmatrix &matB)
(DO NOT USE) Smart-temporary Real Double-precision General Band Matrix Class
Definition: _dgbmatrix.hpp:3
dgbmatrix & zero()
double & operator()(const CPPL_INT &, const CPPL_INT &)
Definition: dgbmatrix-io.hpp:3
CPPL_INT n
matrix column size
Definition: dgbmatrix.hpp:10
dgbmatrix & operator-=(const dgbmatrix &)
_dcovector _(dcovector &vec)
friend void swap(dgbmatrix &, dgbmatrix &)
CPPL_INT m
matrix row size
Definition: _dgbmatrix.hpp:9