DGtal  1.5.beta
SimpleMatrixSpecializations.ih
1 /**
2  * This program is free software: you can redistribute it and/or modify
3  * it under the terms of the GNU Lesser General Public License as
4  * published by the Free Software Foundation, either version 3 of the
5  * License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program. If not, see <http://www.gnu.org/licenses/>.
14  *
15  **/
16 
17 /**
18  * @file SimpleMatrixSpecializations.ih
19  * @author David Coeurjolly (\c david.coeurjolly@liris.cnrs.fr )
20  * Laboratoire d'InfoRmatique en Image et Systèmes d'information - LIRIS (CNRS, UMR 5205), CNRS, France
21  *
22  * @date 2012/07/19
23  *
24  * Implementation of inline methods defined in SimpleMatrixSpecializations.h
25  *
26  * This file is part of the DGtal library.
27  */
28 
29 
30 //////////////////////////////////////////////////////////////////////////////
31 #include <cstdlib>
32 //////////////////////////////////////////////////////////////////////////////
33 ///////////////////////////////////////////////////////////////////////////////
34 // IMPLEMENTATION of inline methods.
35 ///////////////////////////////////////////////////////////////////////////////
36 
37 ///////////////////////////////////////////////////////////////////////////////
38 // ----------------------- Standard services ------------------------------
39 template <typename M, DGtal::Dimension TM, DGtal::Dimension TN>
40 inline
41 typename DGtal::SimpleMatrixSpecializations<M,TM,TN>::Component
42 DGtal::SimpleMatrixSpecializations<M,TM,TN>::minorDeterminant(const Matrix &aM,
43  const DGtal::Dimension ai,
44  const DGtal::Dimension aj)
45 {
46  BOOST_STATIC_ASSERT(TM == TN);
47  ASSERT(ai<TM);
48  ASSERT(aj<TN);
49  DGtal::SimpleMatrix<Component,TM-1,TN-1> mat;
50  DGtal::Dimension indexR=0;
51  DGtal::Dimension indexC=0;
52  for (DGtal::Dimension i=0; i<TM; i++)
53  for (DGtal::Dimension j=0; j<TN; j++)
54  {
55  if (i!=ai && j!=aj)
56  {
57  ASSERT(indexR < TM -1);
58  ASSERT(indexC < TN -1);
59  mat.setComponent(indexR,indexC, aM(i,j));
60  indexC++;
61  }
62  if (indexC==TM-1)
63  {
64  indexC=0;
65  indexR++;
66  }
67 
68  if (indexR==TM-1)
69  return mat.determinant();
70  }
71 
72  return mat.determinant();
73 }
74 
75 template <typename M, DGtal::Dimension TM, DGtal::Dimension TN>
76 inline
77 typename DGtal::SimpleMatrixSpecializations<M,TM,TN>::Component
78 DGtal::SimpleMatrixSpecializations<M,TM,TN>::determinant(const Matrix &aM)
79 {
80  BOOST_STATIC_ASSERT(TM == TN);
81 
82  Component d = DGtal::NumberTraits<Component>::ZERO;
83  for(DGtal::Dimension i= 0; i< TM; ++i)
84  d += aM(i,0) * aM.cofactor(i,0);
85  return d;
86 }
87 // ----------------------- Specialization 1x1 ------------------------------
88 
89 template <typename M>
90 inline
91 typename DGtal::SimpleMatrixSpecializations<M,1,1>::Component
92 DGtal::SimpleMatrixSpecializations<M,1,1>::minorDeterminant(const Matrix &aM,
93  const DGtal::Dimension i,
94  const DGtal::Dimension j)
95 {
96  boost::ignore_unused_variable_warning( aM );
97  boost::ignore_unused_variable_warning( i );
98  boost::ignore_unused_variable_warning( j );
99  ASSERT(false && "Not defined for 1x1 matrices");
100  return NumberTraits<Component>::ZERO;
101 }
102 
103 template <typename M>
104 inline
105 typename DGtal::SimpleMatrixSpecializations<M,1,1>::Component
106 DGtal::SimpleMatrixSpecializations<M,1,1>::determinant(const Matrix &aM)
107 {
108 
109  return aM(0,0);
110 }
111 // ----------------------- Specialization 2x2 ------------------------------
112 
113 template <typename M>
114 inline
115 typename DGtal::SimpleMatrixSpecializations<M,2,2>::Component
116 DGtal::SimpleMatrixSpecializations<M,2,2>::minorDeterminant(const Matrix &aM,
117  const DGtal::Dimension i,
118  const DGtal::Dimension j)
119 {
120  ASSERT(i<2);
121  ASSERT(j<2);
122  return aM((i+1) % 2,(j+1) % 2);
123 }
124 
125 template <typename M>
126 inline
127 typename DGtal::SimpleMatrixSpecializations<M,2,2>::Component
128 DGtal::SimpleMatrixSpecializations<M,2,2>::determinant(const Matrix &aM)
129 {
130 
131  return aM(0,0)*aM(1,1) - aM(0,1)*aM(1,0);
132 }
133 // ----------------------- Specialization 3x3 ------------------------------
134 
135 template <typename M>
136 inline
137 typename DGtal::SimpleMatrixSpecializations<M,3,3>::Component
138 DGtal::SimpleMatrixSpecializations<M,3,3>::minorDeterminant(const Matrix &aM,
139  const DGtal::Dimension ai,
140  const DGtal::Dimension aj)
141 {
142  ASSERT(ai<3);
143  ASSERT(aj<3);
144  DGtal::SimpleMatrix<Component,2,2> mat;
145  DGtal::Dimension indexR=0;
146  DGtal::Dimension indexC=0;
147  for (DGtal::Dimension i=0; i<3; i++)
148  for (DGtal::Dimension j=0; j<3; j++)
149  {
150  if (i!=ai && j!=aj)
151  {
152  ASSERT(indexR < 3 -1);
153  ASSERT(indexC < 3 -1);
154  mat.setComponent(indexR,indexC, aM(i,j));
155  indexC++;
156  }
157  if (indexC==3-1)
158  {
159  indexC=0;
160  indexR++;
161  }
162 
163  if (indexR==3-1)
164  return mat.determinant(); //DGtal::SimpleMatrixSpecializations<M,2,2>::determinant(mat);
165  }
166 
167  return mat.determinant(); //DGtal::SimpleMatrixSpecializations<M,2,2>::determinant(mat);
168 }
169 
170 template <typename M>
171 inline
172 typename DGtal::SimpleMatrixSpecializations<M,3,3>::Component
173 DGtal::SimpleMatrixSpecializations<M,3,3>::determinant(const Matrix &aM)
174 {
175  return aM(0,0) * ( (aM(1,1)*aM(2,2))-
176  (aM(1,2)*aM(2,1)) )-
177  aM(1,0) * ( (aM(0,1)*aM(2,2))-
178  (aM(0,2)*aM(2,1)) )
179  + aM(2,0) * ( (aM(0,1)*aM(1,2))-
180  (aM(0,2)*aM(1,1)) );
181 }
182 
183 // //
184 ///////////////////////////////////////////////////////////////////////////////
185 
186