CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 ( this == 0 ) {
69  std::cerr << "EXITING: trying to use 'operator=' with an MatrixMeschach for which memory space is not reserved!!!!" << std::endl;
71  }
72 
73  if ( mat._Mat != _Mat ) {
74  _NoLines = mat._Mat->m;
75  _NoColumns = mat._Mat->n;
76  M_FREE( _Mat );
77  _Mat = m_get( mat.NoLines(), mat.NoColumns() );
78  copy( mat );
79  }
80  if(ALIUtils::debug >= 9) std::cout << "operator=" << mat._Mat << _Mat << NoLines() << NoColumns() << Mat()->m << Mat()->n <<std::endl;
81  return *this;
82 }
83 
84 
85 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
87 {
88  // std::cout << " multiply matrices " << std::endl;
89 
90  if( _NoColumns != mat.NoLines() ){
91  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;
92  std::cout << " multiplying matrix " << _NoLines << " x " << _NoColumns << " and " << mat.NoLines() << " x " << mat.NoColumns() << " results in " << _NoLines << " x " << mat.NoColumns() << std::endl;
93  }
94  _NoColumns = mat.NoColumns();
95 
96  MAT* tempmat = m_get( _NoColumns, _NoLines );
97  m_transp( _Mat, tempmat);
98  // M_FREE( _Mat );
99  _Mat = m_get( _NoLines, mat.NoColumns() );
100  mtrm_mlt( tempmat, mat._Mat, _Mat);
101 
102  // _NoColumns = mat.NoColumns();
103  // M_FREE(tempmat);
104 }
105 
106 
107 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
109 {
110  if(_NoLines != mat._NoLines || _NoColumns != mat._NoColumns ) {
111  std::cerr << "!!!! cannot sum two matrices with different size" << std::endl
112  << "MATRIX 1:" << _NoLines << " X " << _NoColumns << std::endl
113  << "MATRIX 2:" << mat._NoLines << " X " << mat._NoColumns << std::endl;
114  }
115  MAT* tempmat = m_get( _NoColumns, _NoLines );
116  m_copy( _Mat, tempmat);
117  M_FREE( _Mat );
118  _Mat = m_get( _NoLines, _NoColumns );
119  m_add( tempmat, mat._Mat, _Mat);
120  M_FREE(tempmat);
121 
122 }
123 
124 
125 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
127 {
128  for (ALIuint ii=0; ii<_Mat->m; ii++) {
129  for (ALIuint jj=0; jj<_Mat->n; jj++) {
130  _Mat->me[ii][jj] *= num;
131  }
132  }
133 
134 }
135 
136 
137 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
139 {
140  MatrixMeschach mat1copy = mat1;
141  if( mat1copy.NoColumns() != mat2.NoLines() ){
142  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;
143  std::cout << " multiplying matrix " << mat1copy.NoLines() << " x " << mat1copy.NoColumns() << " and " << mat2.NoLines() << " x " << mat2.NoColumns() << " results in " << mat1copy.NoLines() << " x " << mat2.NoColumns() << std::endl;
144  }
145  mat1copy.setNoColumns( mat2.NoColumns() );
146 
147  MAT* tempmat = m_get( mat1copy.NoColumns(), mat1copy.NoLines() );
148  m_transp( mat1copy.MatNonConst(), tempmat);
149 
150  //M_FREE( _Mat );
151  mat1copy.setMat( m_get( mat1copy.NoLines(), mat2.NoColumns() ) );
152  mtrm_mlt( tempmat, mat2.MatNonConst(), mat1copy.MatNonConst());
153 
154  free(tempmat);
155 
156  return mat1copy;
157 
158 
159  MatrixMeschach* matout = new MatrixMeschach( mat1copy );
160 
161  /* if(ALIUtils::debug >= 9) std::cout << "add" << mat1copy.NoLines() << mat1copy.NoColumns()
162  << mat2.NoLines() << mat2.NoColumns()
163  << matout.NoLines() << matout.NoColumns() << std::endl;
164  if(ALIUtils::debug >= 9) std::cout << "addM" << mat1copy.Mat()->m << mat1copy.Mat()->n
165  << mat2.Mat()->m << mat2.Mat()->n
166  << matout.Mat()->m << matout.Mat()->n << std::endl;
167  */
168  // return MatrixMeschach( matout );
169  return ( *matout );
170 
171 }
172 
173 
174 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
176 {
177  MatrixMeschach matout( mat1 );
178  matout += mat2;
179  if(ALIUtils::debug >= 9) std::cout << "add" << mat1.NoLines() << mat1.NoColumns()
180  << mat2.NoLines() << mat2.NoColumns()
181  << matout.NoLines() << matout.NoColumns() << std::endl;
182  if(ALIUtils::debug >= 9) std::cout << "addM" << mat1.Mat()->m << mat1.Mat()->n
183  << mat2.Mat()->m << mat2.Mat()->n
184  << matout.Mat()->m << matout.Mat()->n << std::endl;
185  return MatrixMeschach( matout );
186 
187 }
188 
189 
190 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
192 {
193  MatrixMeschach matout( mat1 );
194  MatrixMeschach matout2( mat2 );
195  matout += (-1 * matout2);
196  return MatrixMeschach( matout );
197 }
198 
199 
200 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
202 {
203  MatrixMeschach matout( mat );
204  matout *= doub;
205  return matout;
206 }
207 
208 
209 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
211 {
212  return doub*mat;
213 }
214 
215 
216 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
218 {
219  // if(ALIUtils::debug >= 9)
220  /* std::cout << "transposed" <<_NoLines<<_NoColumns;
221  MAT* tempmat = m_get(_NoColumns, _NoLines);
222  m_transp( _Mat, tempmat );
223  std::cout << "transposed" <<_NoLines<<_NoColumns;
224  M_FREE( _Mat );
225  _Mat = m_get(_NoColumns, _NoLines);
226  std::cout << "transposed" <<_NoLines<<_NoColumns;
227  m_copy( tempmat, _Mat );
228  std::cout << "transposed" <<_NoLines<<_NoColumns;
229  int ntemp = _NoLines;
230  _NoLines = _NoColumns;
231  _NoColumns = ntemp;
232  M_FREE(tempmat);
233  */
234 
235  //- std::cout << "transposed" <<_NoLines<<_NoColumns;
236  MAT* tempmat = m_get(_NoColumns, _NoLines);
237  m_transp( _Mat, tempmat );
238  //- std::cout << "transposed" <<_NoLines<<_NoColumns;
239  M_FREE( _Mat );
240  _Mat = m_get(_NoColumns, _NoLines);
241  //- std::cout << "transposed" <<_NoLines<<_NoColumns;
242  for( ALIint lin=0; lin < _NoColumns; lin++ ) {
243  for( ALIint col=0; col < _NoLines; col++ ) {
244  //- std::cout << "setting mat " << lin << " " << col << std::endl;
245  _Mat->me[lin][col] = tempmat->me[lin][col];
246  }
247  }
248  // m_copy( tempmat, _Mat );
249  //- std::cout << "transposed" <<_NoLines<<_NoColumns;
250  int ntemp = _NoLines;
252  _NoColumns = ntemp;
253  M_FREE(tempmat);
254 
255 }
256 
257 
258 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
260 {
261  if(ALIUtils::debug >= 9) std::cout << "inverse" << _NoLines << "C" << _NoColumns << std::endl;
262  MAT* tempmat = m_get(_NoLines, _NoColumns);
263  ALIdouble factor = 1000.;
264  (*this) *= 1./factor;
265  m_inverse( _Mat, tempmat );
266  m_copy( tempmat, _Mat );
267  (*this) *= 1./factor;
268  M_FREE(tempmat);
269 }
270 
271 
272 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
274 {
275  if ( lin >= _Mat->m || col >= _Mat->n ) {
276  std::cerr << "EXITING: matrix has only " << _NoLines << " lines and "
277  << _NoColumns << " columns " << std::endl;
278  std::cerr << "EXITING: matrix has only " << _Mat->m << " lines and "
279  << _Mat->n << " columns " << std::endl;
280  std::cerr << " You tried to add data in line " << lin << " and column "
281  << col << std::endl;
282  std::exception();
283  }
284  _Mat->me[lin][col] = data;
285 
286 }
287 
288 
289 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
291 {
292  return _Mat->me[i][j];
293 }
294 
295 
296 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
297 //@@
298 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
299 void MatrixMeschach::EliminateLines( ALIint lin_first, ALIint lin_last )
300 {
301  //- return;
302  if ( lin_last < lin_first ) {
303  std::cerr << "EXITING: cannot Eliminate Lines in matrix if first line is " <<
304  lin_first << " and lastt line is " << lin_last << std::endl;
305  //t std::exception();
306  return;
307  }
308  ALIint dif = (lin_last - lin_first) + 1;
309  ALIint newANolin = NoLines() - dif;
310  ALIint newANocol = NoColumns();
311  MatrixMeschach newmat( newANolin, newANocol );
312  ALIint iin = 0;
313  for ( ALIint ii=0; ii<NoLines(); ii++) {
314  if( ii < lin_first || ii > lin_last ) {
315  for ( ALIint jj=0; jj<NoColumns(); jj++) {
316  newmat.AddData(iin, jj, (*this)(ii,jj) );
317  if(ALIUtils::debug >= 9) std::cout << iin << jj << "nmat" << newmat.Mat()->me[iin][jj] << std::endl;
318  }
319  iin++;
320  }
321  }
322  M_FREE( _Mat );
323  _Mat = m_get( newANolin, newANocol );
324  copy( newmat );
325  _NoLines = _Mat->m;
326  _NoColumns = _Mat->n;
327  Dump( "newnewmat" );
328 
329 }
330 
331 
332 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
333 void MatrixMeschach::EliminateColumns( ALIint lin_first, ALIint lin_last )
334 {
335  //- return;
336  if ( lin_last < lin_first ) {
337  std::cerr << "EXITING: cannot Eliminate Lines in matrix if first line is " <<
338  lin_first << " and lastt line is " << lin_last << std::endl;
339  //t std::exception();
340  return;
341  }
342  ALIint dif = (lin_last - lin_first) + 1;
343  ALIint newANolin = NoLines();
344  ALIint newANocol = NoColumns() - dif;
345  MatrixMeschach newmat( newANolin, newANocol );
346  ALIint jjn = 0;
347  for ( ALIint jj=0; jj<NoColumns(); jj++) {
348  if( jj < lin_first || jj > lin_last ) {
349  for ( ALIint ii=0; ii<NoLines(); ii++) {
350  newmat.AddData( ii, jjn, (*this)(ii,jj) );
351  if(ALIUtils::debug >= 9) std::cout << ii << jjn << "nmat" << newmat.Mat()->me[ii][jjn] << std::endl;
352  }
353  jjn++;
354  }
355  }
356  M_FREE( _Mat );
357  _Mat = m_get( newANolin, newANocol );
358  copy( newmat );
359  _NoLines = _Mat->m;
360  _NoColumns = _Mat->n;
361  Dump( "newnewmat" );
362 }
363 
364 
365 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
366 void MatrixMeschach::Dump( const ALIstring& mtext )
367 {
368  ostrDump( std::cout, mtext);
369 }
370 
371 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
372 void MatrixMeschach::ostrDump( std::ostream& fout, const ALIstring& mtext )
373 {
374  fout << "DUMPM@@@@@ " << mtext << " @@@@@" << std::endl;
375  fout << "Matrix is (_Mat)" << _Mat->m << "x" << _Mat->n << std::endl;
376  fout << "Matrix is " << _NoLines << "x" << _NoColumns << std::endl;
377  for (ALIuint ii=0; ii<_Mat->m; ii++) {
378  for (ALIuint jj=0; jj<_Mat->n; jj++) {
379  fout << std::setw(8) << _Mat->me[ii][jj] << " ";
380  }
381  fout << std::endl;
382  }
383  // m_output(_Mat);
384 
385 }
386 
387 
388 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
390 {
391  AddData(i1,i2,corr * sqrt( (*this)(i1,i1)*(*this)(i2,i2) ) );
392  AddData(i2,i1,corr * sqrt( (*this)(i1,i1)*(*this)(i2,i2) ) );
393  if(ALIUtils::debug >= 9) std::cout << i1<< i2<< corr << "CORR" << (*this)(i1,i1) << " " << (*this)(i2,i2) << std::endl;
394  //- std::cout << (*this)(i1,i1)*(*this)(i2,i2) << std::endl;
395  //- std::cout << sqrt( (*this)(i1,i1)*(*this)(i2,i2) ) << std::endl;
396  if(ALIUtils::debug >= 9) std::cout << corr * sqrt( (*this)(i1,i1)*(*this)(i2,i2) ) << std::endl;
397 
398 }
399 
400 
402 {
403  MatrixMeschach* matout = new MatrixMeschach( mat1 );
404  if( matout->NoColumns() != mat2.NoLines() ){
405  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;
406  // std::cout << " multiplying matrix " << matout->NoLines() << " x " << matout->NoColumns() << " and " << mat2.NoLines() << " x " << mat2.NoColumns() << " results in " << matout->NoLines() << " x " << mat2.NoColumns() << std::endl;
407  }
408  matout->setNoColumns( mat2.NoColumns() );
409 
410  MAT* tempmat = m_get( matout->NoColumns(), matout->NoLines() );
411  m_transp( matout->MatNonConst(), tempmat);
412  //M_FREE( _Mat );
413  matout->setMat( m_get( matout->NoLines(), mat2.NoColumns() ) );
414  mtrm_mlt( tempmat, mat2.MatNonConst(), matout->MatNonConst());
415 
416 
417  /* if(ALIUtils::debug >= 9) std::cout << "add" << matout->NoLines() << matout->NoColumns()
418  << mat2.NoLines() << mat2.NoColumns()
419  << matout->NoLines() << matout->NoColumns() << std::endl;
420  if(ALIUtils::debug >= 9) std::cout << "addM" << matout->Mat()->m << matout->Mat()->n
421  << mat2.Mat()->m << mat2.Mat()->n
422  << matout->Mat()->m << matout->Mat()->n << std::endl;
423  */
424  // return MatrixMeschach( matout );
425  return ( matout );
426 
427 }
void copy(const MatrixMeschach &mat)
int i
Definition: DBlmapReader.cc:9
ALIint NoLines() const
long double ALIdouble
Definition: CocoaGlobals.h:11
ALIdouble operator()(int i, int j) const
MatrixMeschach operator+(const MatrixMeschach &mat1, const MatrixMeschach &mat2)
MatrixMeschach operator-(const MatrixMeschach &mat1, const MatrixMeschach &mat2)
MatrixMeschach * MatrixByMatrix(const MatrixMeschach &mat1, const MatrixMeschach &mat2)
int ALIint
Definition: CocoaGlobals.h:15
static ALIint debug
Definition: ALIUtils.h:35
int ii
Definition: cuy.py:588
ALIint NoColumns() const
T sqrt(T t)
Definition: SSEVec.h:48
void EliminateLines(ALIint lin_first, ALIint lin_last)
int j
Definition: DBlmapReader.cc:9
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)
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
void operator*=(const MatrixMeschach &mat)
tuple cout
Definition: gather_cfg.py:121
MatrixMeschach operator*(const MatrixMeschach &mat1, const MatrixMeschach &mat2)
MatrixMeschach & operator=(const MatrixMeschach &mat)
int col
Definition: cuy.py:1008
void setMat(MAT *mat)
void Dump(const ALIstring &mtext)
unsigned int ALIuint
Definition: CocoaGlobals.h:17