NAMIC Wiki:DTI:ITK
From NAMIC Wiki
Home < NAMIC Wiki:DTI:ITK
Header for proposed itkSymmetricTensor.
/*========================================================================= Program: Insight Segmentation & Registration Toolkit Module: $RCSfile: itkSymmetricTensor.txx,v $ Language: C++ Date: $Date: 2004/04/15 22:37:33 $ Version: $Revision: 1.10 $ Copyright (c) Insight Software Consortium. All rights reserved. See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #ifndef __itkSymmetricTensor_h #define __itkSymmetricTensor_h #include "itkFixedArray.h" #include "itkSymmetricTensorTraits.h" #include "vnl/vnl_matrix.h" namespace itk { /** \class itkSymmetricTensor * */ template < typename TRealType = float, unsigned int VTensorDimension = 3, typename TTensorTraits = SymmetricTensorTraits<TRealType,VTensorDimension> > class ITK_EXPORT SymmetricTensor : public FixedArray< TRealType, VTensorDimension*(VTensorDimension+1)/2 > { public: /// The compact linear vector dimension of the tensor. static const unsigned int NVectorDimension = VTensorDimension*(VTensorDimension+1)/2; /** Standard class typedefs. */ typedef SymmetricTensor Self; typedef SmartPointer<Self> Pointer; typedef SmartPointer<const Self> ConstPointer; typedef FixedArray< TRealType, NVectorDimension > Superclass; /** Run-time type information (and related methods) */ itkTypeMacro(SymmetricTensor, FixedArray); /** Define the data type and the vector of data type used in calculations. */ typedef TRealType RealType; typedef vnl_matrix_fixed<TRealType,VTensorDimension,VTensorDimension> VnlMatrixType; /* Return vnl_matrix object. We do this here, since it's always the same, * regardless of tensor size. */ VnlMatrixType GetVnlMatrix() const; /** Compute eigenvalues. This is done in the traits class, since the best * implementation depends on the actual tensor size. */ void ComputeEigenvalues( double (&lambda)[VTensorDimension] ) const { TTensorTraits::ComputeEigenvalues( *this, lambda ); } SymmetricTensor() : Superclass() {} SymmetricTensor(const Self& other) : Superclass( other ) {} void operator=(const Self& other) { this->Superclass::operator=( other ); } /** This is part of a hack that allows reading a raw vector field using * itkRawImageIO and subsequently casting to itkSymmetricTensor * using itkCastImageFilter. */ SymmetricTensor(const Vector<TRealType,NVectorDimension>& other) : Superclass( other ) {} /** This is part of a hack that allows reading a raw vector field using * itkRawImageIO and subsequently casting to itkSymmetricTensor * using itkCastImageFilter. */ typedef TRealType ComponentType; /** This is part of a hack that allows reading a raw vector field using * itkRawImageIO and subsequently casting to itkSymmetricTensor * using itkCastImageFilter. */ static int GetNumberOfComponents() { return VTensorDimension*(VTensorDimension+1)/2;} /** This is part of a hack that allows reading a raw vector field using * itkRawImageIO and subsequently casting to itkSymmetricTensor * using itkCastImageFilter. */ void SetNthComponent(int c, const ComponentType& v) { this->operator[](c) = v; } protected: void PrintSelf(std::ostream& os, Indent indent) const; }; } // end namespace itk #ifndef ITK_MANUAL_INSTANTIATION #include "itkSymmetricTensor.txx" #endif #endif