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 
12 
13 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
15  //- std::cout << "creating matrix0 " << std::endl;
16 }
17 
18 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
20  //- std::cout << "deleting matrix " << std::endl;
21  M_FREE(_Mat);
22 }
23 
24 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
26  //- std::cout << "creating matrix " << std::endl;
27  _NoLines = NoLin;
28  _NoColumns = NoCol;
29  _Mat = m_get(NoLin, NoCol);
30  //_data = new ALIdouble[NoCol][NoLin];
31 }
32 
33 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
35  //- std::cout << "creating matrixc " << std::endl;
36  _NoLines = mat._Mat->m;
37  _NoColumns = mat._Mat->n;
38  _Mat = m_get(mat.NoLines(), mat.NoColumns());
39  // std::cout << "copy const" << mat._Mat << _Mat << NoLines() << NoColumns() << Mat()->m << Mat()->n <<std::endl;
40  copy(mat);
41 }
42 
43 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
45  // 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;
46 
47  for (ALIint lin = 0; lin < _NoLines; lin++) {
48  for (ALIint col = 0; col < _NoColumns; col++) {
49  _Mat->me[lin][col] = mat.MatNonConst()->me[lin][col];
50  }
51  }
52  // m_copy( mat._Mat, _Mat );
53 }
54 
55 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
57  if (mat._Mat != _Mat) {
58  _NoLines = mat._Mat->m;
59  _NoColumns = mat._Mat->n;
60  M_FREE(_Mat);
61  _Mat = m_get(mat.NoLines(), mat.NoColumns());
62  copy(mat);
63  }
64  if (ALIUtils::debug >= 9)
65  std::cout << "operator=" << mat._Mat << _Mat << NoLines() << NoColumns() << Mat()->m << Mat()->n << std::endl;
66  return *this;
67 }
68 
69 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
71  // std::cout << " multiply matrices " << std::endl;
72 
73  if (_NoColumns != mat.NoLines()) {
74  std::cerr << " !! Trying two multiply two matrices when the number of columns of first one is not equal to number "
75  "of files of second one "
76  << std::endl;
77  std::cout << " multiplying matrix " << _NoLines << " x " << _NoColumns << " and " << mat.NoLines() << " x "
78  << mat.NoColumns() << " results in " << _NoLines << " x " << mat.NoColumns() << std::endl;
79  }
80  _NoColumns = mat.NoColumns();
81 
82  MAT* tempmat = m_get(_NoColumns, _NoLines);
83  m_transp(_Mat, tempmat);
84  // M_FREE( _Mat );
85  _Mat = m_get(_NoLines, mat.NoColumns());
86  mtrm_mlt(tempmat, mat._Mat, _Mat);
87 
88  // _NoColumns = mat.NoColumns();
89  // M_FREE(tempmat);
90 }
91 
92 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
94  if (_NoLines != mat._NoLines || _NoColumns != mat._NoColumns) {
95  std::cerr << "!!!! cannot sum two matrices with different size" << std::endl
96  << "MATRIX 1:" << _NoLines << " X " << _NoColumns << std::endl
97  << "MATRIX 2:" << mat._NoLines << " X " << mat._NoColumns << std::endl;
98  }
99  MAT* tempmat = m_get(_NoColumns, _NoLines);
100  m_copy(_Mat, tempmat);
101  M_FREE(_Mat);
102  _Mat = m_get(_NoLines, _NoColumns);
103  m_add(tempmat, mat._Mat, _Mat);
104  M_FREE(tempmat);
105 }
106 
107 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
109  for (ALIuint ii = 0; ii < _Mat->m; ii++) {
110  for (ALIuint jj = 0; jj < _Mat->n; jj++) {
111  _Mat->me[ii][jj] *= num;
112  }
113  }
114 }
115 
116 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
118  MatrixMeschach mat1copy = mat1;
119  if (mat1copy.NoColumns() != mat2.NoLines()) {
120  std::cerr << " !! Trying two multiply two matrices when the number of columns of first one is not equal to number "
121  "of files of second one "
122  << std::endl;
123  std::cout << " multiplying matrix " << mat1copy.NoLines() << " x " << mat1copy.NoColumns() << " and "
124  << mat2.NoLines() << " x " << mat2.NoColumns() << " results in " << mat1copy.NoLines() << " x "
125  << mat2.NoColumns() << std::endl;
126  }
127  mat1copy.setNoColumns(mat2.NoColumns());
128 
129  MAT* tempmat = m_get(mat1copy.NoColumns(), mat1copy.NoLines());
130  m_transp(mat1copy.MatNonConst(), tempmat);
131 
132  //M_FREE( _Mat );
133  mat1copy.setMat(m_get(mat1copy.NoLines(), mat2.NoColumns()));
134  mtrm_mlt(tempmat, mat2.MatNonConst(), mat1copy.MatNonConst());
135 
136  free(tempmat);
137 
138  return mat1copy;
139 
140  MatrixMeschach* matout = new MatrixMeschach(mat1copy);
141 
142  /* if(ALIUtils::debug >= 9) std::cout << "add" << mat1copy.NoLines() << mat1copy.NoColumns()
143  << mat2.NoLines() << mat2.NoColumns()
144  << matout.NoLines() << matout.NoColumns() << std::endl;
145  if(ALIUtils::debug >= 9) std::cout << "addM" << mat1copy.Mat()->m << mat1copy.Mat()->n
146  << mat2.Mat()->m << mat2.Mat()->n
147  << matout.Mat()->m << matout.Mat()->n << std::endl;
148  */
149  // return MatrixMeschach( matout );
150  return (*matout);
151 }
152 
153 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
155  MatrixMeschach matout(mat1);
156  matout += mat2;
157  if (ALIUtils::debug >= 9)
158  std::cout << "add" << mat1.NoLines() << mat1.NoColumns() << mat2.NoLines() << mat2.NoColumns() << matout.NoLines()
159  << matout.NoColumns() << std::endl;
160  if (ALIUtils::debug >= 9)
161  std::cout << "addM" << mat1.Mat()->m << mat1.Mat()->n << mat2.Mat()->m << mat2.Mat()->n << matout.Mat()->m
162  << matout.Mat()->n << std::endl;
163  return MatrixMeschach(matout);
164 }
165 
166 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
168  MatrixMeschach matout(mat1);
169  const MatrixMeschach& matout2(mat2);
170  matout += (-1 * matout2);
171  return MatrixMeschach(matout);
172 }
173 
174 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
176  MatrixMeschach matout(mat);
177  matout *= doub;
178  return matout;
179 }
180 
181 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
182 MatrixMeschach operator*(const MatrixMeschach& mat, const ALIdouble doub) { return doub * mat; }
183 
184 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
186  // if(ALIUtils::debug >= 9)
187  /* std::cout << "transposed" <<_NoLines<<_NoColumns;
188  MAT* tempmat = m_get(_NoColumns, _NoLines);
189  m_transp( _Mat, tempmat );
190  std::cout << "transposed" <<_NoLines<<_NoColumns;
191  M_FREE( _Mat );
192  _Mat = m_get(_NoColumns, _NoLines);
193  std::cout << "transposed" <<_NoLines<<_NoColumns;
194  m_copy( tempmat, _Mat );
195  std::cout << "transposed" <<_NoLines<<_NoColumns;
196  int ntemp = _NoLines;
197  _NoLines = _NoColumns;
198  _NoColumns = ntemp;
199  M_FREE(tempmat);
200  */
201 
202  //- std::cout << "transposed" <<_NoLines<<_NoColumns;
203  MAT* tempmat = m_get(_NoColumns, _NoLines);
204  m_transp(_Mat, tempmat);
205  //- std::cout << "transposed" <<_NoLines<<_NoColumns;
206  M_FREE(_Mat);
207  _Mat = m_get(_NoColumns, _NoLines);
208  //- std::cout << "transposed" <<_NoLines<<_NoColumns;
209  for (ALIint lin = 0; lin < _NoColumns; lin++) {
210  for (ALIint col = 0; col < _NoLines; col++) {
211  //- std::cout << "setting mat " << lin << " " << col << std::endl;
212  _Mat->me[lin][col] = tempmat->me[lin][col];
213  }
214  }
215  // m_copy( tempmat, _Mat );
216  //- std::cout << "transposed" <<_NoLines<<_NoColumns;
217  int ntemp = _NoLines;
219  _NoColumns = ntemp;
220  M_FREE(tempmat);
221 }
222 
223 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
225  if (ALIUtils::debug >= 9)
226  std::cout << "inverse" << _NoLines << "C" << _NoColumns << std::endl;
227  MAT* tempmat = m_get(_NoLines, _NoColumns);
228  ALIdouble factor = 1000.;
229  (*this) *= 1. / factor;
230  m_inverse(_Mat, tempmat);
231  m_copy(tempmat, _Mat);
232  (*this) *= 1. / factor;
233  M_FREE(tempmat);
234 }
235 
236 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
238  if (lin >= _Mat->m || col >= _Mat->n) {
239  std::cerr << "EXITING: matrix has only " << _NoLines << " lines and " << _NoColumns << " columns " << std::endl;
240  std::cerr << "EXITING: matrix has only " << _Mat->m << " lines and " << _Mat->n << " columns " << std::endl;
241  std::cerr << " You tried to add data in line " << lin << " and column " << col << std::endl;
242  std::exception();
243  }
244  _Mat->me[lin][col] = data;
245 }
246 
247 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
248 ALIdouble MatrixMeschach::operator()(int i, int j) const { return _Mat->me[i][j]; }
249 
250 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
251 //@@
252 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
253 void MatrixMeschach::EliminateLines(ALIint lin_first, ALIint lin_last) {
254  //- return;
255  if (lin_last < lin_first) {
256  std::cerr << "EXITING: cannot Eliminate Lines in matrix if first line is " << lin_first << " and lastt line is "
257  << lin_last << std::endl;
258  //t std::exception();
259  return;
260  }
261  ALIint dif = (lin_last - lin_first) + 1;
262  ALIint newANolin = NoLines() - dif;
263  ALIint newANocol = NoColumns();
264  MatrixMeschach newmat(newANolin, newANocol);
265  ALIint iin = 0;
266  for (ALIint ii = 0; ii < NoLines(); ii++) {
267  if (ii < lin_first || ii > lin_last) {
268  for (ALIint jj = 0; jj < NoColumns(); jj++) {
269  newmat.AddData(iin, jj, (*this)(ii, jj));
270  if (ALIUtils::debug >= 9)
271  std::cout << iin << jj << "nmat" << newmat.Mat()->me[iin][jj] << std::endl;
272  }
273  iin++;
274  }
275  }
276  M_FREE(_Mat);
277  _Mat = m_get(newANolin, newANocol);
278  copy(newmat);
279  _NoLines = _Mat->m;
280  _NoColumns = _Mat->n;
281  Dump("newnewmat");
282 }
283 
284 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
285 void MatrixMeschach::EliminateColumns(ALIint lin_first, ALIint lin_last) {
286  //- return;
287  if (lin_last < lin_first) {
288  std::cerr << "EXITING: cannot Eliminate Lines in matrix if first line is " << lin_first << " and lastt line is "
289  << lin_last << std::endl;
290  //t std::exception();
291  return;
292  }
293  ALIint dif = (lin_last - lin_first) + 1;
294  ALIint newANolin = NoLines();
295  ALIint newANocol = NoColumns() - dif;
296  MatrixMeschach newmat(newANolin, newANocol);
297  ALIint jjn = 0;
298  for (ALIint jj = 0; jj < NoColumns(); jj++) {
299  if (jj < lin_first || jj > lin_last) {
300  for (ALIint ii = 0; ii < NoLines(); ii++) {
301  newmat.AddData(ii, jjn, (*this)(ii, jj));
302  if (ALIUtils::debug >= 9)
303  std::cout << ii << jjn << "nmat" << newmat.Mat()->me[ii][jjn] << std::endl;
304  }
305  jjn++;
306  }
307  }
308  M_FREE(_Mat);
309  _Mat = m_get(newANolin, newANocol);
310  copy(newmat);
311  _NoLines = _Mat->m;
312  _NoColumns = _Mat->n;
313  Dump("newnewmat");
314 }
315 
316 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
317 void MatrixMeschach::Dump(const ALIstring& mtext) { ostrDump(std::cout, mtext); }
318 
319 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
320 void MatrixMeschach::ostrDump(std::ostream& fout, const ALIstring& mtext) {
321  fout << "DUMPM@@@@@ " << mtext << " @@@@@" << std::endl;
322  fout << "Matrix is (_Mat)" << _Mat->m << "x" << _Mat->n << std::endl;
323  fout << "Matrix is " << _NoLines << "x" << _NoColumns << std::endl;
324  for (ALIuint ii = 0; ii < _Mat->m; ii++) {
325  for (ALIuint jj = 0; jj < _Mat->n; jj++) {
326  fout << std::setw(8) << _Mat->me[ii][jj] << " ";
327  }
328  fout << std::endl;
329  }
330  // m_output(_Mat);
331 }
332 
333 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
335  AddData(i1, i2, corr * sqrt((*this)(i1, i1) * (*this)(i2, i2)));
336  AddData(i2, i1, corr * sqrt((*this)(i1, i1) * (*this)(i2, i2)));
337  if (ALIUtils::debug >= 9)
338  std::cout << i1 << i2 << corr << "CORR" << (*this)(i1, i1) << " " << (*this)(i2, i2) << std::endl;
339  //- std::cout << (*this)(i1,i1)*(*this)(i2,i2) << std::endl;
340  //- std::cout << sqrt( (*this)(i1,i1)*(*this)(i2,i2) ) << std::endl;
341  if (ALIUtils::debug >= 9)
342  std::cout << corr * sqrt((*this)(i1, i1) * (*this)(i2, i2)) << std::endl;
343 }
344 
346  MatrixMeschach* matout = new MatrixMeschach(mat1);
347  if (matout->NoColumns() != mat2.NoLines()) {
348  std::cerr << " !! Trying two multiply two matrices when the number of columns of first one is not equal to number "
349  "of files of second one "
350  << std::endl;
351  // std::cout << " multiplying matrix " << matout->NoLines() << " x " << matout->NoColumns() << " and " << mat2.NoLines() << " x " << mat2.NoColumns() << " results in " << matout->NoLines() << " x " << mat2.NoColumns() << std::endl;
352  }
353  matout->setNoColumns(mat2.NoColumns());
354 
355  MAT* tempmat = m_get(matout->NoColumns(), matout->NoLines());
356  m_transp(matout->MatNonConst(), tempmat);
357  //M_FREE( _Mat );
358  matout->setMat(m_get(matout->NoLines(), mat2.NoColumns()));
359  mtrm_mlt(tempmat, mat2.MatNonConst(), matout->MatNonConst());
360 
361  /* if(ALIUtils::debug >= 9) std::cout << "add" << matout->NoLines() << matout->NoColumns()
362  << mat2.NoLines() << mat2.NoColumns()
363  << matout->NoLines() << matout->NoColumns() << std::endl;
364  if(ALIUtils::debug >= 9) std::cout << "addM" << matout->Mat()->m << matout->Mat()->n
365  << mat2.Mat()->m << mat2.Mat()->n
366  << matout->Mat()->m << matout->Mat()->n << std::endl;
367  */
368  // return MatrixMeschach( matout );
369  return (matout);
370 }
void copy(const MatrixMeschach &mat)
long double ALIdouble
Definition: CocoaGlobals.h:11
int ALIint
Definition: CocoaGlobals.h:15
static ALIint debug
Definition: ALIUtils.h:34
MAT * MatNonConst() const
ALIint NoLines() const
ALIint NoColumns() const
dictionary corr
MatrixMeschach operator+(const MatrixMeschach &mat1, const MatrixMeschach &mat2)
T sqrt(T t)
Definition: SSEVec.h:19
void EliminateLines(ALIint lin_first, ALIint lin_last)
ALIdouble operator()(int i, int j) const
void operator+=(const MatrixMeschach &mat)
void SetCorrelation(ALIint i1, ALIint i2, ALIdouble corr)
void EliminateColumns(ALIint lin_first, ALIint lin_last)
ii
Definition: cuy.py:589
const MAT * Mat() 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:79
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