Moka libraries
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
Matrice.cc
Go to the documentation of this file.
1 #include "Matrice.hh"
2 #include <cstdlib>
3 #include <cstdio>
4 #include <cassert>
5 
6 bool no(coord c)
7 {
8  if(c.i==-1 && c.j==-1)
9  {return true;}
10  else
11  {return false;}
12 }
13 
14 Matrice::Matrice() : FSize(0), FValid(false)
15 {
16  nb_lignes = 0;
17  nb_colonnes = 0;
18  mat = NULL;
19 }
20 
22 { return FValid; }
23 
24 unsigned long Matrice::size() const
25 { return FSize; }
26 
28 {
29  if ( mat==NULL ) return;
30 
31  for (int i = 0 ; mat[i]!=NULL && i < nb_lignes ; i++)
32  { delete []mat[i]; mat[i]=NULL; }
33 
34  delete []mat; mat=NULL;
35 
36  FValid=false;
37 }
38 
39 bool Matrice::allocate(int nbli,int nbcol)
40 {
41  desallocate();
42 
43  nb_lignes=nbli;
44  nb_colonnes=nbcol;
45 
46  FSize = sizeof(int*)*nbli + sizeof(int)*nbcol*nbli;
47  FValid = false;
48 
49  mat = new int*[nbli];
50  if ( mat==NULL ) return false;
51 
52  for (int i = 0 ; i < nbli ; i++)
53  {
54  mat[i] = new int [nbcol] ;
55  if ( mat[i]==NULL )
56  { desallocate(); return false; }
57  }
58 
59  FValid=true;
60 }
61 
62 Matrice::Matrice(int nbli,int nbcol) : FSize(0), FValid(false), mat(NULL)
63 {
64  allocate(nbli,nbcol);
65 
66  if ( valid() )
67  for(int i = 0 ; i < nbli ; i++)
68  {
69  for(int j = 0 ; j < nbcol ; j++)
70  {
71  mat[i][j]=0;
72  }
73  }
74 }
75 
76 Matrice::Matrice(const Matrice & source) : FSize(source.FSize)
77 {
78  allocate(source.nb_lignes,source.nb_colonnes);
79 
80  if ( valid() )
81  for (int i = 0 ; i < source.nb_lignes ; i++)
82  {
83  for (int j = 0 ; j < source.nb_colonnes ; j++)
84  {
85  this->mat[i][j]=source.mat[i][j];
86  }
87  }
88 }
89 
91 { desallocate(); }
92 
94 {
95  coord c;
96  c.i=-1;
97  c.j=-1;
98 
99  for(int i=pos;i<nb_colonnes;i++)
100  {
101  if(mat[pos][i]!=0 && mat[pos][i]%mat[pos][pos]!=0)
102  {
103  c.i=pos;
104  c.j=i;
105  }
106  }
107 
108  return c;
109 }
110 
112 {
113  coord c;
114  c.i=-1;
115  c.j=-1;
116 
117  for(int i=pos;i<nb_lignes;i++)
118  {
119  if(mat[i][pos]!=0 && mat[i][pos]%mat[pos][pos]!=0)
120  {
121  c.i=i;
122  c.j=pos;
123  }
124  }
125 
126  return c;
127 }
128 
130 {
131  coord c;
132  c.i=-1;
133  c.j=-1;
134 
135  for(int i=pos+1;i<nb_lignes;i++)
136  {
137  for(int j=pos+1;j<nb_colonnes;j++)
138  {
139  if(mat[i][j]!=0 && mat[i][j]%mat[pos][pos]!=0)
140  {
141  c.i=i;
142  c.j=j;
143  }
144  }
145  }
146  return c;
147 }
148 
150 {
151  coord c;
152  int min=99999;
153  c.i=-1;
154  c.j=-1;
155 
156  for(int i=pos;i<nb_lignes;i++)
157  {
158  for(int j=pos;j<nb_colonnes;j++)
159  {
160  if(abs(mat[i][j])<min && mat[i][j]!=0)
161  {
162  min=abs(mat[i][j]);
163  c.i=i;
164  c.j=j;
165  }
166  }
167  }
168  return c;
169 }
170 
171 
173 {
174  int a=op2->nb_lignes;
175  int b=op2->nb_colonnes;
176  int c=nb_colonnes;
177 
178  assert( a==nb_lignes );
179 
180  Matrice *mattmp=new Matrice(a,c);
181 
182  for(int i=0;i<a;i++)
183  {
184  for(int j=0;j<c;j++)
185  {
186  for(int k=0;k<b;k++)
187  {
188  mattmp->mat[i][j]+=op2->mat[i][k]*mat[k][j];
189  }
190  }
191  }
192 
193  // TODO copy mattmp dans this: setMatrice(mattmp) ou + optimisé
194  desallocate();
195  mat = mattmp->mat;
196  mattmp->mat = NULL;
197  FValid = mattmp->FValid;
198  delete mattmp;
199 }
200 
201 /*si les 2 matrices sont de meme dim
202  alors le this devient la matrice M*/
204 {
205  assert(nb_lignes==m->nb_lignes);
206  assert(nb_colonnes==m->nb_colonnes);
207 
208  for(int i=0;i<nb_lignes;i++)
209  {
210  for(int j=0;j<nb_colonnes;j++)
211  {
212  mat[i][j]=m->mat[i][j];
213  }
214  }
215 }
216 
217 int Matrice::getVal(int i,int j)
218 {
219  return this->mat[i][j];
220 }
221 
223 {
224  return this->nb_lignes;
225 }
226 
228 {
229  return this->nb_colonnes;
230 }
231 
232 void Matrice::setVal(int i,int j, int val)
233 {
234  this->mat[i][j]=val;
235 }
236 
237 void Matrice::inverseColonne(int i, int j)
238 {
239  int tmp1;
240  int tmp2;
241  for(int n=0;n<nb_lignes;n++)
242  {
243  tmp1= mat[n][i];
244  tmp2= mat[n][j];
245  mat[n][i]=tmp2;
246  mat[n][j]=tmp1;
247  }
248 }
249 
250 void Matrice::inverseLigne(int i, int j)
251 {
252  int tmp1;
253  int tmp2;
254  for(int n=0;n<nb_colonnes;n++)
255  {
256  tmp1= mat[i][n];
257  tmp2= mat[j][n];
258  mat[i][n]=tmp2;
259  mat[j][n]=tmp1;
260  }
261 }
262 
263 void Matrice::multiplyLigne(int i, int coeff)
264 {
265  for(int n=0;n<nb_colonnes;n++)
266  {
267  mat[i][n]*=coeff;
268  }
269 }
270 
271 void Matrice::multiplyColonne(int i, int coeff)
272 {
273 
274  for(int n=0;n<nb_lignes;n++)
275  {
276  mat[n][i]*=coeff;
277  }
278 }
279 
280 void Matrice::addLigne(int i,int j, int coeff)
281 {
282  for(int n=0;n<nb_colonnes;n++)
283  {
284  mat[i][n]+=coeff*mat[j][n];
285  }
286 }
287 
288 void Matrice::addColonne(int i,int j, int coeff)
289 {
290  for(int n=0;n<nb_lignes;n++)
291  {
292  mat[n][i]+=coeff*mat[n][j];
293  }
294 }
295 
297 {
298  for (int i=0;i<nb_lignes;i++)
299  {
300  for(int j=0;j<nb_colonnes;j++)
301  {
302  printf("%2d ",mat[i][j]);
303  }
304  std::cout << std::endl;
305  }
306 }
307 
309 {
310  int nb_z=0;
311  for (int j=0;j<nb_colonnes;j++)
312  {
313  if(mat[0][j]==0)
314  {
315  nb_z+=1;
316  }
317  else
318  {
319  break;
320  }
321  }
322  return nb_z;
323 }
324 
326 {
327  int nb_z=this->nbCycle();
328  int nb_t=0;
329  for (int j=nb_z;j<nb_colonnes;j++)
330  {
331  if(mat[j-nb_z][j]>1)
332  {
333  nb_t+=1;
334  }
335  else
336  {
337  break;
338  }
339  }
340  return nb_t;
341 }
342