ITK  4.2.0
Insight Segmentation and Registration Toolkit
itkSymmetricSecondRankTensor.h
Go to the documentation of this file.
1 /*=========================================================================
2  *
3  * Copyright Insight Software Consortium
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0.txt
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *=========================================================================*/
18 #ifndef __itkSymmetricSecondRankTensor_h
19 #define __itkSymmetricSecondRankTensor_h
20 
21 // Undefine an eventual SymmetricSecondRankTensor macro
22 #ifdef SymmetricSecondRankTensor
23 #undef SymmetricSecondRankTensor
24 #endif
25 
26 #include "itkIndent.h"
27 #include "itkFixedArray.h"
28 #include "itkMatrix.h"
30 
31 namespace itk
32 {
74 template< typename TComponent, unsigned int NDimension = 3 >
76  FixedArray< TComponent, NDimension *( NDimension + 1 ) / 2 >
77 {
78 public:
81  typedef FixedArray< TComponent, NDimension *( NDimension + 1 ) / 2 > Superclass;
82 
84  itkStaticConstMacro(Dimension, unsigned int, NDimension);
85  itkStaticConstMacro( InternalDimension, unsigned int, ( NDimension * ( NDimension + 1 ) / 2 ) );
87 
89  typedef FixedArray< TComponent,
90  itkGetStaticConstMacro(InternalDimension) > BaseArray;
91 
94 
98 
100  typedef TComponent ComponentType;
104 
107 
110 
111  SymmetricSecondRankTensor (const ComponentType & r) { this->Fill(r); }
112 
114  template< typename TCoordRepB >
116  BaseArray(pa) {}
117 
118  typedef ComponentType ComponentArrayType[itkGetStaticConstMacro(InternalDimension)];
119 
122 
124  template< typename TCoordRepB >
126  {
128  return *this;
129  }
131 
133  Self & operator=(const ComponentType & r);
134 
135  Self & operator=(const ComponentArrayType r);
136 
139  Self operator+(const Self & vec) const;
140 
141  Self operator-(const Self & vec) const;
142 
143  const Self & operator+=(const Self & vec);
144 
145  const Self & operator-=(const Self & vec);
146 
148  Self operator *(const RealValueType & scalar) const;
149 
150  Self operator/(const RealValueType & scalar) const;
151 
152  const Self & operator*=(const RealValueType & scalar);
153 
154  const Self & operator/=(const RealValueType & scalar);
155 
157  static unsigned int GetNumberOfComponents()
158  {
159  return itkGetStaticConstMacro(InternalDimension);
160  }
161 
163  ComponentType GetNthComponent(int c) const { return this->operator[](c); }
164 
166  void SetNthComponent(int c, const ComponentType & v) { this->operator[](c) = v; }
167 
169  ValueType & operator()(unsigned int row, unsigned int col);
170 
171  const ValueType & operator()(unsigned int row, unsigned int col) const;
172 
175  void SetIdentity();
176 
179 
181  void ComputeEigenValues(EigenValuesArrayType & eigenValues) const;
182 
185  void ComputeEigenAnalysis(EigenValuesArrayType & eigenValues,
186  EigenVectorsMatrixType & eigenVectors) const;
187 
191  template<typename TMatrixValueType>
193  template<typename TMatrixValueType>
194  Self Rotate( const vnl_matrix_fixed<TMatrixValueType, NDimension, NDimension> & m) const
195  {
196  return this->Rotate( static_cast<Matrix<TMatrixValueType, NDimension, NDimension> >(m) );
197  }
198  template<typename TMatrixValueType>
200  {
201  return this->Rotate( static_cast<Matrix<TMatrixValueType> >(m) );
202  }
204 
206  MatrixType PreMultiply(const MatrixType & m) const;
207 
209  MatrixType PostMultiply(const MatrixType & m) const;
210 
211 private:
212 };
213 
216 typedef std::ostream OutputStreamType;
217 typedef std::istream InputStreamType;
218 
219 template< typename TComponent, unsigned int NDimension >
222 
223 template< typename TComponent, unsigned int NDimension >
224 ITK_EXPORT InputStreamType & operator>>(InputStreamType & is,
226 } // end namespace itk
227 
229 
230 // Define instantiation macro for this template.
231 #define ITK_TEMPLATE_SymmetricSecondRankTensor(_, EXPORT, TypeX, TypeY) \
232  namespace itk \
233  { \
234  _( 2 ( class EXPORT SymmetricSecondRankTensor< ITK_TEMPLATE_2 TypeX > ) ) \
235  namespace Templates \
236  { \
237  typedef SymmetricSecondRankTensor< ITK_TEMPLATE_2 TypeX > \
238  SymmetricSecondRankTensor##TypeY; \
239  } \
240  }
241 
242 #if ITK_TEMPLATE_EXPLICIT
243 //template < typename TComponent, unsigned int NDimension> const unsigned int
244 // itk::SymmetricSecondRankTensor<TComponent,NDimension>::InternalDimension;
245 
246 #include "Templates/itkSymmetricSecondRankTensor+-.h"
247 #endif
248 
249 #if ITK_TEMPLATE_TXX
250 #include "itkSymmetricSecondRankTensor.hxx"
251 #endif
252 
253 #endif
254