DGtal  1.4.beta
testSimpleMatrix.cpp File Reference
#include <iostream>
#include "DGtal/base/Common.h"
#include "DGtal/math/linalg/SimpleMatrix.h"
#include "DGtal/math/linalg/CStaticMatrix.h"
#include "DGtal/math/linalg/CDenseMatrix.h"
#include "DGtal/math/linalg/CStaticVector.h"
#include "DGtal/math/linalg/CDenseVector.h"
#include "DGtal/math/linalg/CLinearAlgebra.h"
#include "DGtal/helpers/StdDefs.h"
Include dependency graph for testSimpleMatrix.cpp:

Go to the source code of this file.

Functions

bool testSimpleMatrix ()
 
bool testArithm ()
 
bool testColRow ()
 
bool testDetCofactor ()
 
bool testM1Matrix ()
 
bool testInverse ()
 
bool testConstructor ()
 
bool testConcepts ()
 
int main (int argc, char **argv)
 

Detailed Description

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Author
David Coeurjolly (david.nosp@m..coe.nosp@m.urjol.nosp@m.ly@l.nosp@m.iris..nosp@m.cnrs.nosp@m..fr ) Laboratoire d'InfoRmatique en Image et Systèmes d'information - LIRIS (CNRS, UMR 5205), CNRS, France
Date
2012/07/10

Functions for testing class SimpleMatrix.

This file is part of the DGtal library.

Definition in file testSimpleMatrix.cpp.

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 403 of file testSimpleMatrix.cpp.

404 {
405  trace.beginBlock ( "Testing class SimpleMatrix" );
406  trace.info() << "Args:";
407  for ( int i = 0; i < argc; ++i )
408  trace.info() << " " << argv[ i ];
409  trace.info() << endl;
410 
411  bool res = testSimpleMatrix() && testArithm() && testColRow() &&
414  trace.emphase() << ( res ? "Passed." : "Error." ) << endl;
415  trace.endBlock();
416  return res ? 0 : 1;
417 }
void beginBlock(const std::string &keyword="")
std::ostream & emphase()
std::ostream & info()
double endBlock()
Trace trace
Definition: Common.h:153
bool testInverse()
bool testM1Matrix()
bool testDetCofactor()
bool testColRow()
bool testConstructor()
bool testConcepts()
bool testArithm()
bool testSimpleMatrix()

References DGtal::Trace::beginBlock(), DGtal::Trace::emphase(), DGtal::Trace::endBlock(), DGtal::Trace::info(), testArithm(), testColRow(), testConcepts(), testConstructor(), testDetCofactor(), testInverse(), testM1Matrix(), testSimpleMatrix(), and DGtal::trace.

◆ testArithm()

bool testArithm ( )

Definition at line 91 of file testSimpleMatrix.cpp.

92 {
93  unsigned int nbok = 0;
94  unsigned int nb = 0;
95 
96 
97  typedef SimpleMatrix<double,3,4> M34d;
98  typedef SimpleMatrix<double,4,3> M43d;
99  typedef SimpleMatrix<double,3,3> M33d;
100 
101  M34d m34d, two,four;
102  M34d m34dbis, resadd, ressub;
103 
104  two.constant(2);
105  four.constant(4);
106 
107  for(DGtal::Dimension i = 0; i< 3; ++i)
108  for(DGtal::Dimension j = 0; j< 4; ++j)
109  {
110  m34d.setComponent(i,j,i*j);
111  m34dbis.setComponent(i,j,i+j);
112  resadd.setComponent(i,j,i*j+i+j);
113  ressub.setComponent(i,j,i*j-(double)i-(double)j);
114  }
115 
116 
117  trace.info() << m34d <<std::endl;
118  trace.info() << m34dbis<<std::endl;
119 
120  trace.beginBlock ( "Testing add ..." );
121  nbok += ((m34d + m34dbis) == resadd) ? 1 : 0;
122  nb++;
123  trace.info() << "(" << nbok << "/" << nb << ") "
124  << "ok" << std::endl;
125  nbok += ((m34dbis + m34d) == resadd) ? 1 : 0;
126  nb++;
127  trace.info() << "(" << nbok << "/" << nb << ") "
128  << "ok commutative" << std::endl;
129 
130  M34d other;
131  other += m34d;
132  nbok += (other == m34d) ? 1 : 0;
133  nb++;
134  trace.info() << "(" << nbok << "/" << nb << ") "
135  << "ok +=" << std::endl;
136 
137  trace.endBlock();
138 
139  trace.beginBlock ( "Testing substraction ..." );
140  nbok += ((m34d - m34dbis) == ressub) ? 1 : 0;
141  nb++;
142  trace.info()<<ressub<<std::endl;
143  trace.info()<<m34d - m34dbis<<std::endl;
144 
145  trace.info() << "(" << nbok << "/" << nb << ") "
146  << "ok simple" << std::endl;
147  trace.endBlock();
148 
149  trace.beginBlock ( "Testing scalar product/divide ..." );
150  nbok += ( (two*2.0) == four) ? 1 : 0;
151  nb++;
152  trace.info()<<ressub<<std::endl;
153  trace.info() << "(" << nbok << "/" << nb << ") "
154  << " [2]*2 == [4]" << std::endl;
155 
156  nbok += ( two == four/2.0) ? 1 : 0;
157  nb++;
158  trace.info()<<ressub<<std::endl;
159  trace.info() << "(" << nbok << "/" << nb << ") "
160  << " [2]= [4]/2" << std::endl;
161  trace.endBlock();
162 
163 
164  trace.beginBlock ( "Testing transpose ..." );
165  M43d transp = m34d.transpose();
166  nbok += (transp.transpose() == m34d) ? 1 : 0;
167  nb++;
168  trace.info() << "(" << nbok << "/" << nb << ") "
169  << "ok idem potent" << std::endl;
170  trace.endBlock();
171 
172  trace.beginBlock ( "Testing product ..." );
173 
174  M43d one;
175  M33d eight33;
176 
177  one.constant(1);
178  eight33.constant(8);
179  trace.info() << two * one<<std::endl;
180  nbok += (two * one == eight33) ? 1 : 0;
181  nb++;
182  trace.info() << "(" << nbok << "/" << nb << ") "
183  << " [2]*[1] = [8]" << std::endl;
184  trace.endBlock();
185 
186 
187 
188  return nbok == nb;
189 
190 }
Aim: implements basic MxN Matrix services (M,N>=1).
Definition: SimpleMatrix.h:76
void constant(const Component &aScalar)
DGtal::uint32_t Dimension
Definition: Common.h:136

References DGtal::Trace::beginBlock(), DGtal::SimpleMatrix< TComponent, TM, TN >::constant(), DGtal::Trace::endBlock(), DGtal::Trace::info(), and DGtal::trace.

Referenced by main().

◆ testColRow()

bool testColRow ( )

Definition at line 192 of file testSimpleMatrix.cpp.

193 {
194  unsigned int nbok = 0;
195  unsigned int nb = 0;
196 
198  for(DGtal::Dimension i = 0; i< 3; ++i)
199  for(DGtal::Dimension j = 0; j< 4; ++j)
200  mat.setComponent(i,j,i+j);
201 
202  trace.beginBlock("Get Row");
203  trace.info() << mat <<std::endl;
205  row = mat.row(1);
206  trace.info() << row << std::endl;
207  nbok += (row[1] == 2 ) ? 1 : 0;
208  nb++;
209  trace.info() << "(" << nbok << "/" << nb << ") "
210  << " row value" << std::endl;
211  trace.endBlock();
212 
213  trace.beginBlock("Get Col");
215  col = mat.column(1);
216  trace.info() << row << std::endl;
217  nbok += (col[1] == 2 ) ? 1 : 0;
218  nb++;
219  trace.info() << "(" << nbok << "/" << nb << ") "
220  << " col value" << std::endl;
221  trace.endBlock();
222 
223 
224 
225  trace.beginBlock("Prod Matrix x Row^t");
226  //Row vector is a dim 4 vector
229  c = mat*r;
231 
232  trace.info() << c << std::endl;
233  nbok += (c == expected) ? 1 : 0;
234  nb++;
235  trace.info() << "(" << nbok << "/" << nb << ") "
236  << " mat*row^t" << std::endl;
237  trace.endBlock();
238 
239  return nbok == nb;
240 }
Aim: Implements basic operations that will be used in Point and Vector classes.
Definition: PointVector.h:593
ColumnVector column(const DGtal::Dimension j) const
RowVector row(const DGtal::Dimension i) const
void setComponent(const DGtal::Dimension i, const DGtal::Dimension j, const Component &aValue)

References DGtal::Trace::beginBlock(), DGtal::SimpleMatrix< TComponent, TM, TN >::column(), DGtal::Trace::endBlock(), DGtal::Trace::info(), DGtal::SimpleMatrix< TComponent, TM, TN >::row(), DGtal::SimpleMatrix< TComponent, TM, TN >::setComponent(), and DGtal::trace.

Referenced by main().

◆ testConcepts()

bool testConcepts ( )

Definition at line 384 of file testSimpleMatrix.cpp.

385 {
386  typedef DGtal::SimpleMatrix<double,3,3> Matrix;
387  typedef Matrix::ColumnVector Vector;
388 
389  BOOST_CONCEPT_ASSERT(( concepts::CStaticVector<Vector> ));
390  BOOST_CONCEPT_ASSERT(( concepts::CDenseVector<Vector> ));
391  BOOST_CONCEPT_ASSERT(( concepts::CStaticMatrix<Matrix> ));
392  BOOST_CONCEPT_ASSERT(( concepts::CDenseMatrix<Matrix> ));
393  BOOST_CONCEPT_ASSERT(( concepts::CLinearAlgebra<Vector, Matrix> ));
394  BOOST_CONCEPT_ASSERT(( concepts::CStaticVector<DGtal::Z3i::Space::Vector> ));
395  BOOST_CONCEPT_ASSERT(( concepts::CDenseVector<DGtal::Z3i::Space::Vector> ));
396 
397  return true;
398 }
DigitalPlane::Point Vector
Aim: Represent any dynamic or static sized matrix having dense representation.
Definition: CDenseMatrix.h:89
Aim: Represent any dynamic or static sized matrix having dense representation.
Definition: CDenseVector.h:89
Aim: Check right multiplication between matrix and vector and internal matrix multiplication....
Aim: Represent any static sized matrix having sparse or dense representation.
Definition: CStaticMatrix.h:90
Aim: Represent any static sized column vector having sparse or dense representation.
Definition: CStaticVector.h:91

Referenced by main().

◆ testConstructor()

bool testConstructor ( )

Definition at line 354 of file testSimpleMatrix.cpp.

355 {
356  unsigned int nbok = 0;
357  unsigned int nb = 0;
358 
359  trace.beginBlock( "Initilizer-list constructor test" );
360  SimpleMatrix<double, 3, 3> mat = {1, 2, 3, 4, 5, 6, 7, 8, 9};
361  trace.info() << mat << std::endl;
362 
363  trace.info() << "Testing values: ";
364  trace.info() << mat( 0, 0 );
365  nbok += ( mat( 0, 0 ) == 1 ) ? 1 : 0;
366  nb++;
367  trace.info() << "(" << nbok << "/" << nb << ") ";
368 
369  trace.info() << mat( 0, 1 );
370  nbok += ( mat( 0, 1 ) == 2 ) ? 1 : 0;
371  nb++;
372  trace.info() << "(" << nbok << "/" << nb << ") ";
373 
374  trace.info() << mat( 2, 2 );
375  nbok += ( mat( 2, 2 ) == 9 ) ? 1 : 0;
376  nb++;
377  trace.info() << "(" << nbok << "/" << nb << ") ";
378 
379  trace.info() << std::endl;
380  trace.endBlock();
381  return nbok == nb;
382 }

References DGtal::Trace::beginBlock(), DGtal::Trace::endBlock(), DGtal::Trace::info(), and DGtal::trace.

Referenced by main().

◆ testDetCofactor()

bool testDetCofactor ( )

Definition at line 242 of file testSimpleMatrix.cpp.

243 {
244  unsigned int nbok = 0;
245  unsigned int nb = 0;
246 
247  typedef DGtal::SimpleMatrix<double,2,2> MAT2;
248  MAT2 mat2;
249  mat2.setComponent(0,0,1);
250  mat2.setComponent(1,1,2);
251 
252  trace.beginBlock("det2x2 tests...");
253  trace.info() << mat2<<std::endl;
254  trace.info() << mat2.determinant() << std::endl;
255  nbok += (mat2.determinant() == 2) ? 1 : 0;
256  nb++;
257  trace.info() << "(" << nbok << "/" << nb << ") "
258  << " 2" << std::endl;
259  trace.endBlock();
260 
262  MAT mat;
263  mat.setComponent(0,0,1);
264  mat.setComponent(1,1,2);
265  mat.setComponent(2,2,4);
266 
267  trace.beginBlock("det3x3 tests...");
268  trace.info() << mat<<std::endl;
269  nbok += (mat.determinant() == 8) ? 1 : 0;
270  nb++;
271  trace.info() << "(" << nbok << "/" << nb << ") "
272  << " 8" << std::endl;
273  trace.endBlock();
274 
275 
276  typedef DGtal::SimpleMatrix<double,4,4> MAT44;
277  MAT44 mat44;
278  mat44.setComponent(0,0,1);
279  mat44.setComponent(1,1,2);
280  mat44.setComponent(2,2,4);
281  mat44.setComponent(3,3,4);
282 
283  trace.beginBlock("det4x4 tests...");
284  trace.info() << mat44 <<std::endl;
285  trace.info() << mat44.determinant() << std::endl;
286  nbok += (mat44.determinant() == 32) ? 1 : 0;
287  nb++;
288  trace.info() << "(" << nbok << "/" << nb << ") "
289  << " 32" << std::endl;
290  trace.endBlock();
291 
292 
293  return nbok == nb;
294 }

References DGtal::Trace::beginBlock(), DGtal::Trace::endBlock(), DGtal::Trace::info(), DGtal::SimpleMatrix< TComponent, TM, TN >::setComponent(), and DGtal::trace.

Referenced by main().

◆ testInverse()

bool testInverse ( )

Definition at line 305 of file testSimpleMatrix.cpp.

306 {
307  unsigned int nbok = 0;
308  unsigned int nb = 0;
309 
310  trace.beginBlock("Inverse tests 2X2...");
311 
312  typedef DGtal::SimpleMatrix<double,2,2> MAT2;
313  MAT2 mat2;
314  mat2.setComponent(0,0,1);
315  mat2.setComponent(1,1,2);
316 
317  MAT2 Id2;
318  Id2.identity();
319 
320  trace.info() << mat2<<std::endl;
321  trace.info() << mat2.inverse() << std::endl;
322  nbok += (( mat2 * mat2.inverse() )== Id2 ) ? 1 : 0;
323  nb++;
324  trace.info() << "(" << nbok << "/" << nb << ") "
325  << " M*M^-1=Id" << std::endl;
326 
327  trace.endBlock();
328 
329  trace.beginBlock("Inverse tests 6x6 random...");
330 
331  typedef DGtal::SimpleMatrix<double,6,6> MAT6;
332  MAT6 mat;
333 
334  for(unsigned int i=0; i< 6; i++)
335  for(unsigned int j=0; j< 6; j++)
336  mat.setComponent(i,j, rand() % 10);
337 
338  MAT6 Id6;
339  Id6.identity();
340 
341  trace.info() << "M= "<<mat<<std::endl;
342  trace.info() << "M^-1=" <<mat.inverse() << std::endl;
343  trace.info() << "det(M)= "<<mat.determinant() <<std::endl;
344  trace.info() << "M*M^-1= "<<mat.inverse()*mat << std::endl;
345 
346 
347 
348  trace.endBlock();
349 
350 
351  return nbok == nb;
352 }

References DGtal::Trace::beginBlock(), DGtal::Trace::endBlock(), DGtal::Trace::info(), DGtal::SimpleMatrix< TComponent, TM, TN >::setComponent(), and DGtal::trace.

Referenced by main().

◆ testM1Matrix()

bool testM1Matrix ( )

Definition at line 296 of file testSimpleMatrix.cpp.

297 {
298  trace.beginBlock("Mx1 matrix test");
300  trace.info() << mat<<std::endl;
301  trace.endBlock();
302  return true;
303 }

References DGtal::Trace::beginBlock(), DGtal::Trace::endBlock(), DGtal::Trace::info(), and DGtal::trace.

Referenced by main().

◆ testSimpleMatrix()

bool testSimpleMatrix ( )

Example of a test. To be completed.

Definition at line 52 of file testSimpleMatrix.cpp.

53 {
54  unsigned int nbok = 0;
55  unsigned int nb = 0;
56 
57  trace.beginBlock ( "Testing create ..." );
58 
59  typedef SimpleMatrix<double,3,4> M34d;
60 
61  M34d m34d;
62  trace.info() << m34d<<std::endl;
63 
64  m34d.setComponent(1,2, 0.5);
65  trace.info() << m34d<<std::endl;
66 
67  nbok += (m34d(1,2) == 0.5) ? 1 : 0;
68  nb++;
69  trace.info() << "(" << nbok << "/" << nb << ") "
70  << "true == true" << std::endl;
71 
72  M34d matrix;
73  bool res=true;
74 
75  matrix.constant(12.3);
76  trace.info() << matrix;
77  for(DGtal::Dimension i = 0; i< 3; ++i)
78  for(DGtal::Dimension j = 0; j< 4; ++j)
79  res = res && (matrix(i,j) == 12.3);
80  nbok += res ? 1 : 0;
81  nb++;
82  trace.info() << "(" << nbok << "/" << nb << ") "
83  << "all equals to 12.3" << std::endl;
84 
85 
86  trace.endBlock();
87 
88  return nbok == nb;
89 }

References DGtal::Trace::beginBlock(), DGtal::Trace::endBlock(), DGtal::Trace::info(), and DGtal::trace.

Referenced by main().