CMS 3D CMS Logo

MatrixMeschach.cc
Go to the documentation of this file.
1 // COCOA class implementation file
2 //Id: MatrixMeschach.C
3 //CAT: Model
4 //
5 // History: v1.0
6 // Pedro Arce
7 #include <iomanip>
8 #include <cmath>
9 
10 
13 
14 
15 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
17 {
18  //- std::cout << "creating matrix0 " << std::endl;
19 }
20 
21 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
23 {
24  //- std::cout << "deleting matrix " << std::endl;
25  M_FREE(_Mat);
26 }
27 
28 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
30 {
31  //- std::cout << "creating matrix " << std::endl;
32  _NoLines = NoLin;
33  _NoColumns = NoCol;
34  _Mat = m_get( NoLin, NoCol );
35  //_data = new ALIdouble[NoCol][NoLin];
36 }
37 
38 
39 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
41 {
42  //- std::cout << "creating matrixc " << std::endl;
43  _NoLines = mat._Mat->m;
44  _NoColumns = mat._Mat->n;
45  _Mat = m_get( mat.NoLines(), mat.NoColumns() );
46  // std::cout << "copy const" << mat._Mat << _Mat << NoLines() << NoColumns() << Mat()->m << Mat()->n <<std::endl;
47  copy( mat );
48 }
49 
50 
51 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
53 {
54  // if( ALIUtils::debug >= 5) std::cout << "copy matrix" << mat._Mat << " " << _Mat << " L " << mat.NoLines() << " C " << mat.NoColumns() << " l " << mat.Mat()->m << " c " << mat.Mat()->n <<std::endl;
55 
56  for( ALIint lin=0; lin < _NoLines; lin++ ) {
57  for( ALIint col=0; col < _NoColumns; col++ ) {
58  _Mat->me[lin][col] = mat.MatNonConst()->me[lin][col];
59  }
60  }
61  // m_copy( mat._Mat, _Mat );
62 }
63 
64 
65 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
67 {
68  if ( mat._Mat != _Mat ) {
69  _NoLines = mat._Mat->m;
70  _NoColumns = mat._Mat->n;
71  M_FREE( _Mat );
72  _Mat = m_get( mat.NoLines(), mat.NoColumns() );
73  copy( mat );
74  }
75  if(ALIUtils::debug >= 9) std::cout << "operator=" << mat._Mat << _Mat << NoLines() << NoColumns() << Mat()->m << Mat()->n <<std::endl;
76  return *this;
77 }
78 
79 
80 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
82 {
83  // std::cout << " multiply matrices " << std::endl;
84 
85  if( _NoColumns != mat.NoLines() ){
86  std::cerr << " !! Trying two multiply two matrices when the number of columns of first one is not equal to number of files of second one " << std::endl;
87  std::cout << " multiplying matrix " << _NoLines << " x " << _NoColumns << " and " << mat.NoLines() << " x " << mat.NoColumns() << " results in " << _NoLines << " x " << mat.NoColumns() << std::endl;
88  }
89  _NoColumns = mat.NoColumns();
90 
91  MAT* tempmat = m_get( _NoColumns, _NoLines );
92  m_transp( _Mat, tempmat);
93  // M_FREE( _Mat );
94  _Mat = m_get( _NoLines, mat.NoColumns() );
95  mtrm_mlt( tempmat, mat._Mat, _Mat);
96 
97  // _NoColumns = mat.NoColumns();
98  // M_FREE(tempmat);
99 }
100 
101 
102 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
104 {
105  if(_NoLines != mat._NoLines || _NoColumns != mat._NoColumns ) {
106  std::cerr << "!!!! cannot sum two matrices with different size" << std::endl
107  << "MATRIX 1:" << _NoLines << " X " << _NoColumns << std::endl
108  << "MATRIX 2:" << mat._NoLines << " X " << mat._NoColumns << std::endl;
109  }
110  MAT* tempmat = m_get( _NoColumns, _NoLines );
111  m_copy( _Mat, tempmat);
112  M_FREE( _Mat );
113  _Mat = m_get( _NoLines, _NoColumns );
114  m_add( tempmat, mat._Mat, _Mat);
115  M_FREE(tempmat);
116 
117 }
118 
119 
120 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
122 {
123  for (ALIuint ii=0; ii<_Mat->m; ii++) {
124  for (ALIuint jj=0; jj<_Mat->n; jj++) {
125  _Mat->me[ii][jj] *= num;
126  }
127  }
128 
129 }
130 
131 
132 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
134 {
135  MatrixMeschach mat1copy = mat1;
136  if( mat1copy.NoColumns() != mat2.NoLines() ){
137  std::cerr << " !! Trying two multiply two matrices when the number of columns of first one is not equal to number of files of second one " << std::endl;
138  std::cout << " multiplying matrix " << mat1copy.NoLines() << " x " << mat1copy.NoColumns() << " and " << mat2.NoLines() << " x " << mat2.NoColumns() << " results in " << mat1copy.NoLines() << " x " << mat2.NoColumns() << std::endl;
139  }
140  mat1copy.setNoColumns( mat2.NoColumns() );
141 
142  MAT* tempmat = m_get( mat1copy.NoColumns(), mat1copy.NoLines() );
143  m_transp( mat1copy.MatNonConst(), tempmat);
144 
145  //M_FREE( _Mat );
146  mat1copy.setMat( m_get( mat1copy.NoLines(), mat2.NoColumns() ) );
147  mtrm_mlt( tempmat, mat2.MatNonConst(), mat1copy.MatNonConst());
148 
149  free(tempmat);
150 
151  return mat1copy;
152 
153 
154  MatrixMeschach* matout = new MatrixMeschach( mat1copy );
155 
156  /* if(ALIUtils::debug >= 9) std::cout << "add" << mat1copy.NoLines() << mat1copy.NoColumns()
157  << mat2.NoLines() << mat2.NoColumns()
158  << matout.NoLines() << matout.NoColumns() << std::endl;
159  if(ALIUtils::debug >= 9) std::cout << "addM" << mat1copy.Mat()->m << mat1copy.Mat()->n
160  << mat2.Mat()->m << mat2.Mat()->n
161  << matout.Mat()->m << matout.Mat()->n << std::endl;
162  */
163  // return MatrixMeschach( matout );
164  return ( *matout );
165 
166 }
167 
168 
169 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
171 {
172  MatrixMeschach matout( mat1 );
173  matout += mat2;
174  if(ALIUtils::debug >= 9) std::cout << "add" << mat1.NoLines() << mat1.NoColumns()
175  << mat2.NoLines() << mat2.NoColumns()
176  << matout.NoLines() << matout.NoColumns() << std::endl;
177  if(ALIUtils::debug >= 9) std::cout << "addM" << mat1.Mat()->m << mat1.Mat()->n
178  << mat2.Mat()->m << mat2.Mat()->n
179  << matout.Mat()->m << matout.Mat()->n << std::endl;
180  return MatrixMeschach( matout );
181 
182 }
183 
184 
185 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
187 {
188  MatrixMeschach matout( mat1 );
189  const MatrixMeschach& matout2( mat2 );
190  matout += (-1 * matout2);
191  return MatrixMeschach( matout );
192 }
193 
194 
195 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
197 {
198  MatrixMeschach matout( mat );
199  matout *= doub;
200  return matout;
201 }
202 
203 
204 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
206 {
207  return doub*mat;
208 }
209 
210 
211 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
213 {
214  // if(ALIUtils::debug >= 9)
215  /* std::cout << "transposed" <<_NoLines<<_NoColumns;
216  MAT* tempmat = m_get(_NoColumns, _NoLines);
217  m_transp( _Mat, tempmat );
218  std::cout << "transposed" <<_NoLines<<_NoColumns;
219  M_FREE( _Mat );
220  _Mat = m_get(_NoColumns, _NoLines);
221  std::cout << "transposed" <<_NoLines<<_NoColumns;
222  m_copy( tempmat, _Mat );
223  std::cout << "transposed" <<_NoLines<<_NoColumns;
224  int ntemp = _NoLines;
225  _NoLines = _NoColumns;
226  _NoColumns = ntemp;
227  M_FREE(tempmat);
228  */
229 
230  //- std::cout << "transposed" <<_NoLines<<_NoColumns;
231  MAT* tempmat = m_get(_NoColumns, _NoLines);
232  m_transp( _Mat, tempmat );
233  //- std::cout << "transposed" <<_NoLines<<_NoColumns;
234  M_FREE( _Mat );
235  _Mat = m_get(_NoColumns, _NoLines);
236  //- std::cout << "transposed" <<_NoLines<<_NoColumns;
237  for( ALIint lin=0; lin < _NoColumns; lin++ ) {
238  for( ALIint col=0; col < _NoLines; col++ ) {
239  //- std::cout << "setting mat " << lin << " " << col << std::endl;
240  _Mat->me[lin][col] = tempmat->me[lin][col];
241  }
242  }
243  // m_copy( tempmat, _Mat );
244  //- std::cout << "transposed" <<_NoLines<<_NoColumns;
245  int ntemp = _NoLines;
247  _NoColumns = ntemp;
248  M_FREE(tempmat);
249 
250 }
251 
252 
253 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
255 {
256  if(ALIUtils::debug >= 9) std::cout << "inverse" << _NoLines << "C" << _NoColumns << std::endl;
257  MAT* tempmat = m_get(_NoLines, _NoColumns);
258  ALIdouble factor = 1000.;
259  (*this) *= 1./factor;
260  m_inverse( _Mat, tempmat );
261  m_copy( tempmat, _Mat );
262  (*this) *= 1./factor;
263  M_FREE(tempmat);
264 }
265 
266 
267 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
269 {
270  if ( lin >= _Mat->m || col >= _Mat->n ) {
271  std::cerr << "EXITING: matrix has only " << _NoLines << " lines and "
272  << _NoColumns << " columns " << std::endl;
273  std::cerr << "EXITING: matrix has only " << _Mat->m << " lines and "
274  << _Mat->n << " columns " << std::endl;
275  std::cerr << " You tried to add data in line " << lin << " and column "
276  << col << std::endl;
277  std::exception();
278  }
279  _Mat->me[lin][col] = data;
280 
281 }
282 
283 
284 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
286 {
287  return _Mat->me[i][j];
288 }
289 
290 
291 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
292 //@@
293 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
294 void MatrixMeschach::EliminateLines( ALIint lin_first, ALIint lin_last )
295 {
296  //- return;
297  if ( lin_last < lin_first ) {
298  std::cerr << "EXITING: cannot Eliminate Lines in matrix if first line is " <<
299  lin_first << " and lastt line is " << lin_last << std::endl;
300  //t std::exception();
301  return;
302  }
303  ALIint dif = (lin_last - lin_first) + 1;
304  ALIint newANolin = NoLines() - dif;
305  ALIint newANocol = NoColumns();
306  MatrixMeschach newmat( newANolin, newANocol );
307  ALIint iin = 0;
308  for ( ALIint ii=0; ii<NoLines(); ii++) {
309  if( ii < lin_first || ii > lin_last ) {
310  for ( ALIint jj=0; jj<NoColumns(); jj++) {
311  newmat.AddData(iin, jj, (*this)(ii,jj) );
312  if(ALIUtils::debug >= 9) std::cout << iin << jj << "nmat" << newmat.Mat()->me[iin][jj] << std::endl;
313  }
314  iin++;
315  }
316  }
317  M_FREE( _Mat );
318  _Mat = m_get( newANolin, newANocol );
319  copy( newmat );
320  _NoLines = _Mat->m;
321  _NoColumns = _Mat->n;
322  Dump( "newnewmat" );
323 
324 }
325 
326 
327 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
328 void MatrixMeschach::EliminateColumns( ALIint lin_first, ALIint lin_last )
329 {
330  //- return;
331  if ( lin_last < lin_first ) {
332  std::cerr << "EXITING: cannot Eliminate Lines in matrix if first line is " <<
333  lin_first << " and lastt line is " << lin_last << std::endl;
334  //t std::exception();
335  return;
336  }
337  ALIint dif = (lin_last - lin_first) + 1;
338  ALIint newANolin = NoLines();
339  ALIint newANocol = NoColumns() - dif;
340  MatrixMeschach newmat( newANolin, newANocol );
341  ALIint jjn = 0;
342  for ( ALIint jj=0; jj<NoColumns(); jj++) {
343  if( jj < lin_first || jj > lin_last ) {
344  for ( ALIint ii=0; ii<NoLines(); ii++) {
345  newmat.AddData( ii, jjn, (*this)(ii,jj) );
346  if(ALIUtils::debug >= 9) std::cout << ii << jjn << "nmat" << newmat.Mat()->me[ii][jjn] << std::endl;
347  }
348  jjn++;
349  }
350  }
351  M_FREE( _Mat );
352  _Mat = m_get( newANolin, newANocol );
353  copy( newmat );
354  _NoLines = _Mat->m;
355  _NoColumns = _Mat->n;
356  Dump( "newnewmat" );
357 }
358 
359 
360 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
361 void MatrixMeschach::Dump( const ALIstring& mtext )
362 {
363  ostrDump( std::cout, mtext);
364 }
365 
366 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
367 void MatrixMeschach::ostrDump( std::ostream& fout, const ALIstring& mtext )
368 {
369  fout << "DUMPM@@@@@ " << mtext << " @@@@@" << std::endl;
370  fout << "Matrix is (_Mat)" << _Mat->m << "x" << _Mat->n << std::endl;
371  fout << "Matrix is " << _NoLines << "x" << _NoColumns << std::endl;
372  for (ALIuint ii=0; ii<_Mat->m; ii++) {
373  for (ALIuint jj=0; jj<_Mat->n; jj++) {
374  fout << std::setw(8) << _Mat->me[ii][jj] << " ";
375  }
376  fout << std::endl;
377  }
378  // m_output(_Mat);
379 
380 }
381 
382 
383 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
385 {
386  AddData(i1,i2,corr * sqrt( (*this)(i1,i1)*(*this)(i2,i2) ) );
387  AddData(i2,i1,corr * sqrt( (*this)(i1,i1)*(*this)(i2,i2) ) );
388  if(ALIUtils::debug >= 9) std::cout << i1<< i2<< corr << "CORR" << (*this)(i1,i1) << " " << (*this)(i2,i2) << std::endl;
389  //- std::cout << (*this)(i1,i1)*(*this)(i2,i2) << std::endl;
390  //- std::cout << sqrt( (*this)(i1,i1)*(*this)(i2,i2) ) << std::endl;
391  if(ALIUtils::debug >= 9) std::cout << corr * sqrt( (*this)(i1,i1)*(*this)(i2,i2) ) << std::endl;
392 
393 }
394 
395 
397 {
398  MatrixMeschach* matout = new MatrixMeschach( mat1 );
399  if( matout->NoColumns() != mat2.NoLines() ){
400  std::cerr << " !! Trying two multiply two matrices when the number of columns of first one is not equal to number of files of second one " << std::endl;
401  // std::cout << " multiplying matrix " << matout->NoLines() << " x " << matout->NoColumns() << " and " << mat2.NoLines() << " x " << mat2.NoColumns() << " results in " << matout->NoLines() << " x " << mat2.NoColumns() << std::endl;
402  }
403  matout->setNoColumns( mat2.NoColumns() );
404 
405  MAT* tempmat = m_get( matout->NoColumns(), matout->NoLines() );
406  m_transp( matout->MatNonConst(), tempmat);
407  //M_FREE( _Mat );
408  matout->setMat( m_get( matout->NoLines(), mat2.NoColumns() ) );
409  mtrm_mlt( tempmat, mat2.MatNonConst(), matout->MatNonConst());
410 
411 
412  /* if(ALIUtils::debug >= 9) std::cout << "add" << matout->NoLines() << matout->NoColumns()
413  << mat2.NoLines() << mat2.NoColumns()
414  << matout->NoLines() << matout->NoColumns() << std::endl;
415  if(ALIUtils::debug >= 9) std::cout << "addM" << matout->Mat()->m << matout->Mat()->n
416  << mat2.Mat()->m << mat2.Mat()->n
417  << matout->Mat()->m << matout->Mat()->n << std::endl;
418  */
419  // return MatrixMeschach( matout );
420  return ( matout );
421 
422 }
void copy(const MatrixMeschach &mat)
ALIint NoLines() const
long double ALIdouble
Definition: CocoaGlobals.h:11
ALIdouble operator()(int i, int j) const
int ALIint
Definition: CocoaGlobals.h:15
static ALIint debug
Definition: ALIUtils.h:36
MatrixMeschach operator+(const MatrixMeschach &mat1, const MatrixMeschach &mat2)
ALIint NoColumns() const
T sqrt(T t)
Definition: SSEVec.h:18
void EliminateLines(ALIint lin_first, ALIint lin_last)
void operator+=(const MatrixMeschach &mat)
const MAT * Mat() const
void SetCorrelation(ALIint i1, ALIint i2, ALIdouble corr)
void EliminateColumns(ALIint lin_first, ALIint lin_last)
JetCorrectorParameters corr
Definition: classes.h:5
ii
Definition: cuy.py:589
MAT * MatNonConst() const
void ostrDump(std::ostream &fout, const ALIstring &mtext)
void AddData(ALIuint col, ALIuint lin, ALIdouble data)
void setNoColumns(ALIint ncol)
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
std::string ALIstring
Definition: CocoaGlobals.h:9
col
Definition: cuy.py:1009
void operator*=(const MatrixMeschach &mat)
MatrixMeschach operator*(const MatrixMeschach &mat1, const MatrixMeschach &mat2)
MatrixMeschach operator-(const MatrixMeschach &mat1, const MatrixMeschach &mat2)
MatrixMeschach & operator=(const MatrixMeschach &mat)
MatrixMeschach * MatrixByMatrix(const MatrixMeschach &mat1, const MatrixMeschach &mat2)
void setMat(MAT *mat)
void Dump(const ALIstring &mtext)
unsigned int ALIuint
Definition: CocoaGlobals.h:17