ITK  6.0.0
Insight Toolkit
itkSymmetricSecondRankTensor.h
Go to the documentation of this file.
1 /*=========================================================================
2  *
3  * Copyright NumFOCUS
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  * https://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 VDimension = 3>
75 class ITK_TEMPLATE_EXPORT SymmetricSecondRankTensor : public FixedArray<TComponent, VDimension *(VDimension + 1) / 2>
76 {
77 public:
80  using Superclass = FixedArray<TComponent, VDimension *(VDimension + 1) / 2>;
81 
83  static constexpr unsigned int Dimension = VDimension;
84  static constexpr unsigned int InternalDimension = VDimension * (VDimension + 1) / 2;
85 
88 
91 
95 
97  using ComponentType = TComponent;
98  using typename Superclass::ValueType;
101 
104 
107 #ifdef ITK_FUTURE_LEGACY_REMOVE
108  SymmetricSecondRankTensor() = default;
109 #else
110  SymmetricSecondRankTensor() { this->Fill(0); }
111 #endif
112 
114  SymmetricSecondRankTensor(const ComponentType & r) { this->Fill(r); }
115 
117  template <typename TCoordinateB>
119  : BaseArray(pa)
120  {}
121 
122  using ComponentArrayType = ComponentType[Self::InternalDimension];
123 
126  : BaseArray(r)
127  {}
128 
130  template <typename TCoordinateB>
131  Self &
133  {
134  BaseArray::operator=(pa);
135  return *this;
136  }
140  Self &
141  operator=(const ComponentType & r);
142 
143  Self &
144  operator=(const ComponentArrayType r);
145 
148  Self
149  operator+(const Self & r) const;
150 
151  Self
152  operator-(const Self & r) const;
153 
154  const Self &
155  operator+=(const Self & r);
156 
157  const Self &
158  operator-=(const Self & r);
159 
161  Self
162  operator*(const RealValueType & r) const;
163 
164  Self
165  operator/(const RealValueType & r) const;
166 
167  const Self &
168  operator*=(const RealValueType & r);
169 
170  const Self &
171  operator/=(const RealValueType & r);
172 
174  static unsigned int
176  {
177  return Self::InternalDimension;
178  }
179 
181  ComponentType
182  GetNthComponent(int c) const
183  {
184  return this->operator[](c);
185  }
186 
188  void
189  SetNthComponent(int c, const ComponentType & v)
190  {
191  this->operator[](c) = v;
192  }
193 
195  ValueType &
196  operator()(unsigned int row, unsigned int col);
197 
198  const ValueType &
199  operator()(unsigned int row, unsigned int col) const;
200 
203  void
204  SetIdentity();
205 
207  AccumulateValueType
208  GetTrace() const;
209 
211  void
212  ComputeEigenValues(EigenValuesArrayType & eigenValues) const;
213 
216  void
217  ComputeEigenAnalysis(EigenValuesArrayType & eigenValues, EigenVectorsMatrixType & eigenVectors) const;
218 
222  template <typename TMatrixValueType>
223  Self
224  Rotate(const Matrix<TMatrixValueType, VDimension, VDimension> & m) const;
225  template <typename TMatrixValueType>
226  Self
227  Rotate(const vnl_matrix_fixed<TMatrixValueType, VDimension, VDimension> & m) const
228  {
229  return this->Rotate(static_cast<Matrix<TMatrixValueType, VDimension, VDimension>>(m));
230  }
231  template <typename TMatrixValueType>
232  Self
233  Rotate(const vnl_matrix<TMatrixValueType> & m) const
234  {
235  return this->Rotate(static_cast<Matrix<TMatrixValueType>>(m));
236  }
240  MatrixType
241  PreMultiply(const MatrixType & m) const;
242 
244  MatrixType
245  PostMultiply(const MatrixType & m) const;
246 
247 private:
248 };
249 
252 using OutputStreamType = std::ostream;
253 using InputStreamType = std::istream;
254 
255 template <typename TComponent, unsigned int VDimension>
258 
259 template <typename TComponent, unsigned int VDimension>
262 
263 template <typename T>
264 inline void
266 {
267  a.swap(b);
268 }
269 } // end namespace itk
270 
272 
273 #ifndef ITK_MANUAL_INSTANTIATION
274 # include "itkSymmetricSecondRankTensor.hxx"
275 #endif
276 
277 #endif
itk::OutputStreamType
std::ostream OutputStreamType
Definition: itkSymmetricSecondRankTensor.h:252
itk::SymmetricSecondRankTensor::Rotate
Self Rotate(const vnl_matrix< TMatrixValueType > &m) const
Definition: itkSymmetricSecondRankTensor.h:233
itkMatrix.h
itk::operator*
CovariantVector< T, VVectorDimension > operator*(const T &scalar, const CovariantVector< T, VVectorDimension > &v)
Definition: itkCovariantVector.h:272
itk::SymmetricSecondRankTensor::GetNthComponent
ComponentType GetNthComponent(int c) const
Definition: itkSymmetricSecondRankTensor.h:182
itk::operator-
ConstNeighborhoodIterator< TImage > operator-(const ConstNeighborhoodIterator< TImage > &it, const typename ConstNeighborhoodIterator< TImage >::OffsetType &ind)
Definition: itkConstNeighborhoodIterator.h:672
itk::operator<<
ITKCommon_EXPORT std::ostream & operator<<(std::ostream &out, typename AnatomicalOrientation::CoordinateEnum value)
itkSymmetricEigenAnalysis.h
itkNumericTraitsTensorPixel.h
itk::SymmetricSecondRankTensor::Rotate
Self Rotate(const vnl_matrix_fixed< TMatrixValueType, VDimension, VDimension > &m) const
Definition: itkSymmetricSecondRankTensor.h:227
itk::SymmetricSecondRankTensor
Represent a symmetric tensor of second rank.
Definition: itkSymmetricSecondRankTensor.h:75
itk::SymmetricSecondRankTensor::SetNthComponent
void SetNthComponent(int c, const ComponentType &v)
Definition: itkSymmetricSecondRankTensor.h:189
itk::SymmetricSecondRankTensor< TComponent, 3 >::RealValueType
typename NumericTraits< ValueType >::RealType RealValueType
Definition: itkSymmetricSecondRankTensor.h:100
itkIndent.h
itk::SymmetricSecondRankTensor::GetNumberOfComponents
static unsigned int GetNumberOfComponents()
Definition: itkSymmetricSecondRankTensor.h:175
itkFixedArray.h
itk::SymmetricSecondRankTensor< TComponent, 3 >::ComponentArrayType
ComponentType[Self::InternalDimension] ComponentArrayType
Definition: itkSymmetricSecondRankTensor.h:122
itk::SymmetricSecondRankTensor::SymmetricSecondRankTensor
SymmetricSecondRankTensor(const ComponentType &r)
Definition: itkSymmetricSecondRankTensor.h:114
itk::SymmetricSecondRankTensor< TComponent, 3 >::ComponentType
TComponent ComponentType
Definition: itkSymmetricSecondRankTensor.h:97
itk::FixedArray
Simulate a standard C array with copy semantics.
Definition: itkFixedArray.h:53
itk::Matrix
A templated class holding a M x N size Matrix.
Definition: itkMatrix.h:52
itk::SymmetricSecondRankTensor< TComponent, 3 >::AccumulateValueType
typename NumericTraits< ValueType >::RealType AccumulateValueType
Definition: itkSymmetricSecondRankTensor.h:99
itk::SymmetricEigenAnalysisFixedDimension
Definition: itkSymmetricEigenAnalysis.h:758
itk::swap
void swap(Array< T > &a, Array< T > &b) noexcept
Definition: itkArray.h:242
itk
The "itk" namespace contains all Insight Segmentation and Registration Toolkit (ITK) classes....
Definition: itkAnatomicalOrientation.h:29
itk::InputStreamType
std::istream InputStreamType
Definition: itkSymmetricSecondRankTensor.h:253
itk::operator+
ConstNeighborhoodIterator< TImage > operator+(const ConstNeighborhoodIterator< TImage > &it, const typename ConstNeighborhoodIterator< TImage >::OffsetType &ind)
Definition: itkConstNeighborhoodIterator.h:654
itk::SymmetricSecondRankTensor::SymmetricSecondRankTensor
SymmetricSecondRankTensor(const SymmetricSecondRankTensor< TCoordinateB, VDimension > &pa)
Definition: itkSymmetricSecondRankTensor.h:118
itk::NumericTraits::RealType
double RealType
Definition: itkNumericTraits.h:86
AddImageFilter
Definition: itkAddImageFilter.h:81
itk::SymmetricSecondRankTensor::SymmetricSecondRankTensor
SymmetricSecondRankTensor(const ComponentArrayType r)
Definition: itkSymmetricSecondRankTensor.h:125
itk::GTest::TypedefsAndConstructors::Dimension2::Dimension
constexpr unsigned int Dimension
Definition: itkGTestTypedefsAndConstructors.h:44
itk::SymmetricSecondRankTensor::operator=
Self & operator=(const SymmetricSecondRankTensor< TCoordinateB, VDimension > &pa)
Definition: itkSymmetricSecondRankTensor.h:132
itk::operator>>
std::istream & operator>>(std::istream &is, Point< T, VPointDimension > &vct)
itk::FixedArray< TComponent, VDimension *(VDimension+1)/2 >::ValueType
TComponent ValueType
Definition: itkFixedArray.h:63