DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
SimpleMatrix.ih
1 
30 
31 #include <cstdlib>
33 
35 // IMPLEMENTATION of inline methods.
37 
39 // ----------------------- Standard services ------------------------------
40 
44 template <typename T, DGtal::Dimension TM, DGtal::Dimension TN>
45 inline
47 {
48 }
49 
50 
54 template <typename T, DGtal::Dimension TM, DGtal::Dimension TN>
55 inline
57 {
58  for ( DGtal::Dimension i = 0; i < TM*TN; ++i )
59  myValues[ i ] = NumberTraits<Component>::ZERO;
60 
61  //Cofactor coefs computation
62  for (DGtal::Dimension i=0; i<TM; i++)
63  for (DGtal::Dimension j=0; j<TN; j++)
64  myCofactorCoefs[i*N+j] = static_cast<T>(std::pow(-1.0f, (float)i+j));
65 }
66 //------------------------------------------------------------------------------
67 
68 template<typename T, DGtal::Dimension TM, DGtal::Dimension TN>
69 inline
71 {
72  for ( DGtal::Dimension i = 0; i < M*N; ++i )
73  {
74  myValues[ i ] = other.myValues[i];
75  myCofactorCoefs[ i ] = other.myCofactorCoefs[i];
76  }
77 }
78 
79 //---------------------------------------------------------------------------
80 template<typename T, DGtal::Dimension TM, DGtal::Dimension TN>
81 inline
82 void
84 {
85  for ( DGtal::Dimension i = 0; i < M*N; ++i )
86  myValues[ i ] = NumberTraits<T>::ZERO;
87 }
88 //---------------------------------------------------------------------------
89 template<typename T, DGtal::Dimension TM, DGtal::Dimension TN>
90 inline
91 void
93 {
94  for ( DGtal::Dimension i = 0; i < M*N; ++i )
95  myValues[ i ] = aSc;
96 }
97 //---------------------------------------------------------------------------
98 template<typename T, DGtal::Dimension M, DGtal::Dimension N>
99 inline
100 void
102 {
103  BOOST_STATIC_ASSERT( M == N);
104 
105  //fast clear
106  this->clear();
107  for (DGtal::Dimension i=0; i<M; i++)
108  this->setComponent( i, i , NumberTraits<T>::ONE);
109 }
110 //---------------------------------------------------------------------------
111 template<typename T, DGtal::Dimension TM, DGtal::Dimension TN>
112 inline
115 {
116  ASSERT(i<M);
117  RowVector v;
118  for ( DGtal::Dimension j = 0; j < N; ++j )
119  v[ j ] = this->operator()(i,j);
120  return v;
121 }
122 template<typename T, DGtal::Dimension TM, DGtal::Dimension TN>
123 inline
126 {
127  ASSERT(j<N);
128  ColumnVector v;
129  for ( DGtal::Dimension i = 0; i < M; ++i )
130  v[ i ] = this->operator()(i,j);
131  return v;
132 }
133 //---------------------------------------------------------------------------
134 template<typename T, DGtal::Dimension TM, DGtal::Dimension TN>
135 template<typename TC>
136 inline
139 {
140  for ( DGtal::Dimension i = 0; i < M*N; ++i )
141  myValues[ i ] = static_cast<T>(other.myValues[i]);
142  return *this;
143 }
144 
145 //------------------------------------------------------------------------------
146 template<typename T, DGtal::Dimension TM, DGtal::Dimension TN>
147 inline
150 {
152  for ( DGtal::Dimension i = 0; i < M*N; ++i )
153  res.myValues[ i ] = this->myValues[i] + other.myValues[i];
154  return res;
155 }
156 //------------------------------------------------------------------------------
157 template<typename T, DGtal::Dimension TM, DGtal::Dimension TN>
158 inline
161 {
162  for ( DGtal::Dimension i = 0; i < M*N; ++i )
163  myValues[ i ] += other.myValues[i];
164  return *this;
165 }
166 //------------------------------------------------------------------------------
167 template<typename T, DGtal::Dimension M, DGtal::Dimension N>
168 inline
169 T
171  const DGtal::Dimension j ) const
172 {
173  BOOST_STATIC_ASSERT(M == N);
174  return minorDeterminant(i,j)*myCofactorCoefs[i*N+j];
175 }
176 //------------------------------------------------------------------------------
177 template<typename T, DGtal::Dimension M, DGtal::Dimension N>
178 inline
181 {
183  BOOST_STATIC_ASSERT(M == N);
184 
185  for (DGtal::Dimension i=0; i<M; i++)
186  for (DGtal::Dimension j=0; j<M; j++)
187  mat.setComponent( i, j , cofactor(i,j));
188 
189  return mat;
190 }
191 //------------------------------------------------------------------------------
192 template<typename T, DGtal::Dimension M, DGtal::Dimension N>
193 inline
194 T
196  const DGtal::Dimension j) const
197 {
199 }
200 //------------------------------------------------------------------------------
201 template<typename T, DGtal::Dimension M, DGtal::Dimension N>
202 inline
203 T
205 {
207 }
208 
209  //------------------------------------------------------------------------------
210 template<typename T, DGtal::Dimension TM, DGtal::Dimension TN>
211 inline
214 {
215  BOOST_STATIC_ASSERT(TM == TN);
216 
217  SimpleMatrix<T,TM,TM> r = cofactor().transpose();
218 
219  //determinant
220  T det = determinant();
221  ASSERT(det != 0);
222  return r/det;
223 }
224 
225 //------------------------------------------------------------------------------
226 template<typename T, DGtal::Dimension TM, DGtal::Dimension TN>
227 inline
230 {
232  for ( DGtal::Dimension i = 0; i < M*N; ++i )
233  res.myValues[ i ] = this->myValues[i] - other.myValues[i];
234  return res;
235 }
236 //------------------------------------------------------------------------------
237 template<typename T, DGtal::Dimension TM, DGtal::Dimension TN>
238 inline
241 {
242  for ( DGtal::Dimension i = 0; i < M*N; ++i )
243  myValues[ i ] -= other.myValues[i];
244  return *this;
245 }
246 //------------------------------------------------------------------------------
247 template<typename T, DGtal::Dimension TM, DGtal::Dimension TN>
248 inline
249 bool
251 {
252  return myValues == other.myValues;
253 }
254 
255 //------------------------------------------------------------------------------
256 template<typename T, DGtal::Dimension TM, DGtal::Dimension TN>
257 inline
260 {
262  for (DGtal::Dimension i=0; i<M; i++)
263  for (DGtal::Dimension j=0; j<N; j++)
264  res.setComponent(j,i, this->operator()(i,j));
265  return res;
266 }
267 //------------------------------------------------------------------------------
268 template<typename T, DGtal::Dimension M, DGtal::Dimension N>
269 inline
272 {
273  ColumnVector res;
274  for (DGtal::Dimension i=0; i<M; i++)
275  for (DGtal::Dimension k=0; k<N; k++)
276  res[i] += this->operator()(i, k )*other[k];
277 
278  return res;
279 }
280 //------------------------------------------------------------------------------
281 template<typename T, DGtal::Dimension M, DGtal::Dimension N>
282 inline
285 {
287  T e = NumberTraits<T>::ZERO;
288  for (DGtal::Dimension i=0; i<M; i++)
289  for (DGtal::Dimension j=0; j<M; j++)
290  {
291  for (DGtal::Dimension k=0; k<N; k++)
292  {
293  e += this->operator()(i, k )*other(k ,j );
294  }
295 
296  res.setComponent(i,j,e);
297 
298  e = NumberTraits<T>::ZERO;
299  }
300  return res;
301 }
302 //------------------------------------------------------------------------------
303 template<typename T, DGtal::Dimension M, DGtal::Dimension N>
304 inline
307 {
308  for (DGtal::Dimension i=0; i<M*N; i++)
309  this->myValues[i] /= other;
310 
311  return *this;
312 }//------------------------------------------------------------------------------
313 template<typename T, DGtal::Dimension M, DGtal::Dimension N>
314 inline
317 {
318  Self resultat;
319  for (DGtal::Dimension i=0; i<M*N; i++)
320  resultat.myValues[i] = myValues[i]/other;
321 
322  return resultat;
323 }
324 //------------------------------------------------------------------------------
325 template<typename T, DGtal::Dimension M, DGtal::Dimension N>
326 inline
329 {
330  for (DGtal::Dimension i=0; i<M*N; i++)
331  this->myValues[i] *= other;
332 
333  return *this;
334 }
335 //------------------------------------------------------------------------------
336 template<typename T, DGtal::Dimension M, DGtal::Dimension N>
337 inline
339 DGtal::SimpleMatrix<T, M,N>::operator*(const T& other) const
340 {
341  Self resultat;
342  for (DGtal::Dimension i=0; i<M*N; i++)
343  resultat.myValues[i] = other*myValues[i];
344 
345  return resultat;
346 }
347 
348 //------------------------------------------------------------------------------
349 template<typename T, DGtal::Dimension TM, DGtal::Dimension TN>
350 inline
351 void
353  const DGtal::Dimension j,
354  const T &aValue)
355 {
356  ASSERT(i<M);
357  ASSERT(j<N);
358  myValues[i*N + j] = aValue;
359 }
360 //------------------------------------------------------------------------------
361 template<typename T, DGtal::Dimension TM, DGtal::Dimension TN>
362 inline
363 T
365  const DGtal::Dimension j) const
366 {
367  ASSERT(i<M);
368  ASSERT(j<N);
369  return myValues[i*N + j];
370 }
371 
373 // Interface - public :
374 
379 template <typename T, DGtal::Dimension TM, DGtal::Dimension TN >
380 inline
381 void
382 DGtal::SimpleMatrix<T,TM,TN>::selfDisplay ( std::ostream & out ) const
383 {
384  out << "[SimpleMatrix] "<<M<<"x"<<N<< " [";
385  for(DGtal::Dimension i = 0; i < M; ++i)
386  {
387  out<<"[";
388  for(DGtal::Dimension j = 0; j < N; ++j)
389  out<< this->operator()(i,j)<<" ";
390  out<<"]";
391  }
392  out<<"]";
393 }
394 
399 template <typename T,DGtal::Dimension M,DGtal::Dimension N>
400 inline
401 bool
403 {
404  return true;
405 }
406 
407 
408 
409 
410 
412 // Implementation of inline functions //
413 
414 template <typename T,DGtal::Dimension M,DGtal::Dimension N>
415 inline
416 std::ostream&
417 DGtal::operator<< ( std::ostream & out,
418  const SimpleMatrix<T,M,N> & object )
419 {
420  object.selfDisplay( out );
421  return out;
422 }
423