Shapeworks Studio  2.1
Shape analysis software suite
List of all members | Public Types | Public Member Functions | Public Attributes | Protected Member Functions | Protected Attributes
itk::SparseKernelTransform< TScalarType, NDimensions > Class Template Reference

#include <itkSparseKernelTransform.h>

+ Inheritance diagram for itk::SparseKernelTransform< TScalarType, NDimensions >:
+ Collaboration diagram for itk::SparseKernelTransform< TScalarType, NDimensions >:

Public Types

typedef SparseKernelTransform Self
 
typedef Transform< TScalarType, NDimensions, NDimensions > Superclass
 
typedef SmartPointer< SelfPointer
 
typedef SmartPointer< const SelfConstPointer
 
typedef Superclass::ScalarType ScalarType
 
typedef Superclass::ParametersType ParametersType
 
typedef Superclass::JacobianType JacobianType
 
typedef Superclass::InputPointType InputPointType
 
typedef Superclass::OutputPointType OutputPointType
 
typedef Superclass::InputVectorType InputVectorType
 
typedef Superclass::OutputVectorType OutputVectorType
 
typedef DefaultStaticMeshTraits< TScalarType, NDimensions, NDimensions, TScalarType, TScalarType > PointSetTraitsType
 
typedef PointSet< InputPointType, NDimensions, PointSetTraitsTypePointSetType
 
typedef PointSetType::Pointer PointSetPointer
 
typedef PointSetType::PointsContainer PointsContainer
 
typedef PointSetType::PointsContainerIterator PointsIterator
 
typedef PointSetType::PointsContainerConstIterator PointsConstIterator
 
typedef itk::VectorContainer< unsigned long, InputVectorTypeVectorSetType
 
typedef VectorSetType::Pointer VectorSetPointer
 
typedef Eigen::Matrix< TScalarType, NDimensions, NDimensions > IMatrixType
 
typedef Eigen::Triplet< TScalarType > TripletType
 
typedef Eigen::Matrix< TScalarType, NDimensions, NDimensions > GMatrixType
 
typedef Eigen::SparseMatrix< TScalarType > LMatrixType
 
typedef Eigen::SparseMatrix< TScalarType > KMatrixType
 
typedef Eigen::SparseMatrix< TScalarType > PMatrixType
 
typedef Eigen::Matrix< TScalarType, Eigen::Dynamic, Eigen::Dynamic > YMatrixType
 
typedef Eigen::Matrix< TScalarType, Eigen::Dynamic, Eigen::Dynamic > WMatrixType
 
typedef Eigen::Matrix< TScalarType, Eigen::Dynamic, Eigen::Dynamic > DMatrixType
 
typedef Eigen::Matrix< TScalarType, NDimensions, NDimensions > AMatrixType
 
typedef Eigen::Matrix< TScalarType, NDimensions, 1 > BMatrixType
 
typedef Eigen::Matrix< TScalarType, 1, NDimensions > RowMatrixType
 
typedef Eigen::Matrix< TScalarType, NDimensions, 1 > ColumnMatrixType
 

Public Member Functions

 itkTypeMacro (SparseKernelTransform, Transform)
 
 itkNewMacro (Self)
 
 itkStaticConstMacro (SpaceDimension, unsigned int, NDimensions)
 
 itkGetObjectMacro (SourceLandmarks, PointSetType)
 
virtual void SetSourceLandmarks (PointSetType *)
 
 itkGetObjectMacro (TargetLandmarks, PointSetType)
 
virtual void SetTargetLandmarks (PointSetType *)
 
 itkGetObjectMacro (Displacements, VectorSetType)
 
void ComputeWMatrix (void) const
 
virtual OutputPointType TransformPoint (const InputPointType &thisPoint) const
 
virtual void SetIdentity ()
 
virtual void SetParameters (const ParametersType &)
 
virtual void SetFixedParameters (const ParametersType &)
 
virtual void UpdateParameters (void) const
 
virtual const ParametersTypeGetParameters (void) const
 
virtual const ParametersTypeGetFixedParameters (void) const
 
virtual void ComputeJacobianWithRespectToParameters (const InputPointType &in, JacobianType &jacobian) const
 
virtual void SetStiffness (double stiffness)
 
 itkGetMacro (Stiffness, double)
 

Public Attributes

PointSetPointer m_SourceLandmarks
 
PointSetPointer m_TargetLandmarks
 

Protected Member Functions

void PrintSelf (std::ostream &os, Indent indent) const
 
virtual const GMatrixTypeComputeG (const InputVectorType &landmarkVector) const
 
virtual const GMatrixTypeComputeReflexiveG (PointsIterator) const
 
virtual void ComputeDeformationContribution (const InputPointType &inputPoint, OutputPointType &result) const
 
void ComputeK () const
 
void ComputeL () const
 
void ComputeP () const
 
void ComputeY () const
 
void ComputeD () const
 
void ReorganizeW (void) const
 

Protected Attributes

double m_Stiffness
 
VectorSetPointer m_Displacements
 
LMatrixType m_LMatrix
 
LMatrixType m_LMatrixInverse
 
KMatrixType m_KMatrix
 
PMatrixType m_PMatrix
 
YMatrixType m_YMatrix
 
WMatrixType m_WMatrix
 
DMatrixType m_DMatrix
 
AMatrixType m_AMatrix
 
BMatrixType m_BVector
 
GMatrixType m_GMatrix
 
bool m_WMatrixComputed
 
bool m_LMatrixComputed
 
bool m_LInverseComputed
 
IMatrixType m_I
 

Detailed Description

template<class TScalarType, unsigned int NDimensions>
class itk::SparseKernelTransform< TScalarType, NDimensions >

Intended to be a base class for elastic body spline and thin plate spline. This is implemented in as straightforward a manner as possible from the IEEE TMI paper by Davis, Khotanzad, Flamig, and Harms, Vol. 16, No. 3 June 1997. Notation closely follows their paper, so if you have it in front of you, this code will make a lot more sense.

SparseKernelTransform: Provides support for defining source and target landmarks Defines a number of data types used in the computations Defines the mathematical framework used to compute all splines, so that subclasses need only provide a kernel specific to that spline

This formulation allows the stiffness of the spline to be adjusted, allowing the spline to vary from interpolating the landmarks to approximating the landmarks. This part of the formulation is based on the short paper by R. Sprengel, K. Rohr, H. Stiehl. "Thin-Plate Spline Approximation for Image Registration". In 18th International Conference of the IEEE Engineering in Medicine and Biology Society. 1996.

This class was modified to support its use in the ITK registration framework by Rupert Brooks, McGill Centre for Intelligent Machines, Montreal, Canada March 2007. See the Insight Journal Paper by Brooks, R., Arbel, T. "Improvements to the itk::KernelTransform and its subclasses."

Definition at line 76 of file itkSparseKernelTransform.h.

Member Typedef Documentation

template<class TScalarType, unsigned int NDimensions>
typedef Eigen::Matrix<TScalarType, NDimensions, NDimensions> itk::SparseKernelTransform< TScalarType, NDimensions >::AMatrixType

'A' matrix typedef. Rotational part of the Affine component

Definition at line 249 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
typedef Eigen::Matrix<TScalarType,NDimensions,1> itk::SparseKernelTransform< TScalarType, NDimensions >::BMatrixType

'B' matrix typedef. Translational part of the Affine component

Definition at line 253 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
typedef Eigen::Matrix<TScalarType,NDimensions,1> itk::SparseKernelTransform< TScalarType, NDimensions >::ColumnMatrixType

Column matrix typedef.

Definition at line 261 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
typedef Eigen::Matrix<TScalarType, Eigen::Dynamic, Eigen::Dynamic> itk::SparseKernelTransform< TScalarType, NDimensions >::DMatrixType

'D' matrix typedef. Deformation component

Definition at line 245 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
typedef Eigen::Matrix<TScalarType, NDimensions, NDimensions> itk::SparseKernelTransform< TScalarType, NDimensions >::GMatrixType

'G' matrix typedef.

Definition at line 220 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
typedef Eigen::Matrix<TScalarType, NDimensions, NDimensions> itk::SparseKernelTransform< TScalarType, NDimensions >::IMatrixType

'I' (identity) matrix typedef.

Definition at line 155 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
typedef Superclass::InputPointType itk::SparseKernelTransform< TScalarType, NDimensions >::InputPointType

Standard coordinate point type for this class.

Definition at line 105 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
typedef Superclass::InputVectorType itk::SparseKernelTransform< TScalarType, NDimensions >::InputVectorType

Standard vector type for this class.

Definition at line 109 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
typedef Superclass::JacobianType itk::SparseKernelTransform< TScalarType, NDimensions >::JacobianType

Jacobian type.

Definition at line 102 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
typedef Eigen::SparseMatrix<TScalarType> itk::SparseKernelTransform< TScalarType, NDimensions >::KMatrixType

'K' matrix typedef.

Definition at line 228 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
typedef Eigen::SparseMatrix<TScalarType> itk::SparseKernelTransform< TScalarType, NDimensions >::LMatrixType

'L' matrix typedef.

Definition at line 224 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
typedef Superclass::ParametersType itk::SparseKernelTransform< TScalarType, NDimensions >::ParametersType

Parameters type.

Definition at line 99 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
typedef Eigen::SparseMatrix<TScalarType> itk::SparseKernelTransform< TScalarType, NDimensions >::PMatrixType

'P' matrix typedef.

Definition at line 232 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
typedef DefaultStaticMeshTraits<TScalarType, NDimensions, NDimensions, TScalarType, TScalarType> itk::SparseKernelTransform< TScalarType, NDimensions >::PointSetTraitsType

PointList typedef. This type is used for maintaining lists of points, specifically, the source and target landmark lists.

Definition at line 118 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
typedef Eigen::Matrix<TScalarType,1,NDimensions> itk::SparseKernelTransform< TScalarType, NDimensions >::RowMatrixType

Row matrix typedef.

Definition at line 257 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
typedef Superclass::ScalarType itk::SparseKernelTransform< TScalarType, NDimensions >::ScalarType

Scalar type.

Definition at line 96 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
typedef SparseKernelTransform itk::SparseKernelTransform< TScalarType, NDimensions >::Self

Standard class typedefs.

Definition at line 81 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
typedef Eigen::Triplet<TScalarType> itk::SparseKernelTransform< TScalarType, NDimensions >::TripletType

triplets used to fill sparse matrices.

Definition at line 217 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
typedef itk::VectorContainer<unsigned long,InputVectorType> itk::SparseKernelTransform< TScalarType, NDimensions >::VectorSetType

VectorSet typedef.

Definition at line 126 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
typedef Eigen::Matrix<TScalarType, Eigen::Dynamic, Eigen::Dynamic> itk::SparseKernelTransform< TScalarType, NDimensions >::WMatrixType

'W' matrix typedef.

Definition at line 241 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
typedef Eigen::Matrix<TScalarType, Eigen::Dynamic, Eigen::Dynamic> itk::SparseKernelTransform< TScalarType, NDimensions >::YMatrixType

'Y' matrix typedef.

Definition at line 237 of file itkSparseKernelTransform.h.

Member Function Documentation

template<class TScalarType , unsigned int NDimensions>
void itk::SparseKernelTransform< TScalarType, NDimensions >::ComputeD ( void  ) const
protected

Compute displacements $ q_i - p_i $.

Definition at line 199 of file itkSparseKernelTransform.hxx.

200 {
201  unsigned long numberOfLandmarks = m_SourceLandmarks->GetNumberOfPoints();
202 
203  PointsIterator sp = m_SourceLandmarks->GetPoints()->Begin();
204  PointsIterator tp = m_TargetLandmarks->GetPoints()->Begin();
205  PointsIterator end = m_SourceLandmarks->GetPoints()->End();
206 
207  m_Displacements->Reserve( numberOfLandmarks );
208  typename VectorSetType::Iterator vt = m_Displacements->Begin();
209 
210  while( sp != end )
211  {
212  vt->Value() = tp->Value() - sp->Value();
213  vt++;
214  sp++;
215  tp++;
216  }
217  // std::cout<<" Computed displacements "<<m_Displacements<<std::endl;
218 }
template<class TScalarType , unsigned int NDimensions>
void itk::SparseKernelTransform< TScalarType, NDimensions >::ComputeDeformationContribution ( const InputPointType thisPoint,
OutputPointType &  result 
) const
protectedvirtual

Compute the contribution of the landmarks weighted by the kernel funcion to the global deformation of the space

Default implementation of the the method. This can be overloaded in transforms whose kernel produce diagonal G matrices.

Reimplemented in itk::CompactlySupportedRBFSparseKernelTransform< TScalarType, NDimensions >.

Definition at line 170 of file itkSparseKernelTransform.hxx.

172 {
173 
174  unsigned long numberOfLandmarks = m_SourceLandmarks->GetNumberOfPoints();
175 
176  PointsIterator sp = m_SourceLandmarks->GetPoints()->Begin();
177 
178  for(unsigned int lnd=0; lnd < numberOfLandmarks; lnd++ )
179  {
180  const GMatrixType & Gmatrix = ComputeG( thisPoint - sp->Value() );
181  for(unsigned int dim=0; dim < NDimensions; dim++ )
182  {
183  for(unsigned int odim=0; odim < NDimensions; odim++ )
184  {
185  result[ odim ] += Gmatrix(dim, odim ) * m_DMatrix(dim,lnd);
186  }
187  }
188  ++sp;
189  }
190 
191 }
virtual const GMatrixType & ComputeG(const InputVectorType &landmarkVector) const
Eigen::Matrix< TScalarType, NDimensions, NDimensions > GMatrixType
template<class TScalarType , unsigned int NDimensions>
const SparseKernelTransform< TScalarType, NDimensions >::GMatrixType & itk::SparseKernelTransform< TScalarType, NDimensions >::ComputeG ( const InputVectorType landmarkVector) const
protectedvirtual

Compute G(x) This is essentially the kernel of the transform. By overriding this method, we can obtain (among others): Elastic body spline Thin plate spline Volume spline

Reimplemented in itk::CompactlySupportedRBFSparseKernelTransform< TScalarType, NDimensions >.

Definition at line 133 of file itkSparseKernelTransform.hxx.

134 {
135  //
136  // Should an Exception be thrown here ?
137  //
138  itkWarningMacro(<< "ComputeG() should be reimplemented in the subclass !!");
139  return m_GMatrix;
140 }
template<class TScalarType , unsigned int NDimensions>
void itk::SparseKernelTransform< TScalarType, NDimensions >::ComputeK ( void  ) const
protected

Compute K matrix.

Definition at line 417 of file itkSparseKernelTransform.hxx.

418 {
419  unsigned long numberOfLandmarks = m_SourceLandmarks->GetNumberOfPoints();
420  GMatrixType G;
421  //std::vector<TripletType> tripletList;
422 
423  m_KMatrix = KMatrixType( NDimensions * numberOfLandmarks,
424  NDimensions * numberOfLandmarks );
425  //m_KMatrix.set_size( NDimensions * numberOfLandmarks,
426  // NDimensions * numberOfLandmarks );
427 
428  //m_KMatrix.fill( 0.0 );
429 
430  PointsIterator p1 = m_SourceLandmarks->GetPoints()->Begin();
431  PointsIterator end = m_SourceLandmarks->GetPoints()->End();
432 
433  // K matrix is symmetric, so only evaluate the upper triangle and
434  // store the values in both the upper and lower triangle
435  unsigned int i = 0;
436  while( p1 != end )
437  {
438  PointsIterator p2 = p1; // start at the diagonal element
439  unsigned int j = i;
440 
441  // Compute the block diagonal element, i.e. kernel for pi->pi
442  //G = ComputeReflexiveG(p1);
443 
444  // force to compute the basis on the diagonal
445  const InputVectorType s = p1.Value() - p1.Value();
446  G = ComputeG(s); // the basis
447 
448  //m_KMatrix.update(G, i*NDimensions, i*NDimensions);
449  for(unsigned int d = 0; d < NDimensions; d++)
450  {
451  if(G(d,d) != 0 )
452  m_KMatrix.insert(i*NDimensions+d ,i*NDimensions+d) = G(d,d) + m_Stiffness; // this is as a regularizer
453  //tripletList.push_back(TripletType(i*NDimensions+d ,i*NDimensions+d, m_GMatrix(d,d)));
454  }
455 
456  p2++;
457  j++;
458 
459  // Compute the upper (and copy into lower) triangular part of K
460  // only save the lower part, don't need it
461  while( p2 != end )
462  {
463  const InputVectorType s = p1.Value() - p2.Value();
464  G = ComputeG(s); // the basis
465 
466  // write value in upper and lower triangle of matrix
467  for(unsigned int ii = 0 ; ii < NDimensions; ii++)
468  for(unsigned int jj = 0 ; jj < NDimensions; jj++)
469  {
470  if (G(ii,jj) != 0)
471  {
472  m_KMatrix.insert(i*NDimensions+ii ,j*NDimensions+jj) = G(ii,jj); // upper
473  m_KMatrix.insert(j*NDimensions+ii ,i*NDimensions+jj) = G(ii,jj); // lower
474  }
475 
476  //tripletList.push_back(TripletType(i*NDimensions+ii ,j*NDimensions+jj, G(ii,jj)));
477  //tripletList.push_back(TripletType(j*NDimensions+ii ,i*NDimensions+jj, G(ii,jj)));
478  }
479 
480  // m_KMatrix.update(G, i*NDimensions, j*NDimensions);
481  // m_KMatrix.update(G, j*NDimensions, i*NDimensions);
482  p2++;
483  j++;
484  }
485  p1++;
486  i++;
487  }
488  //std::cout<<"K matrix: "<<std::endl;
489  //std::cout<<m_KMatrix<<std::endl;
490 
491  // // shireen: for debugging let's make sure that the L matrix is sparse (based on gaussian basis)
492  // std::ofstream ofs;
493  // ofs.open("Ksparse.csv");
494  // for (int k = 0; k < m_KMatrix.outerSize(); ++k) // column index
495  // for (typename KMatrixType::InnerIterator it(m_KMatrix,k); it; ++it)
496  // ofs << it.row() << ", " << it.col() << ", " << it.value() << std::endl;
497  // ofs.close();
498 
499  std::cout << "Kmatrix - nnz = " << m_KMatrix.nonZeros() << std::endl;
501 
502  //m_KMatrix.setFromTriplets(tripletList.begin(), tripletList.end());
503 }
Superclass::InputVectorType InputVectorType
virtual const GMatrixType & ComputeG(const InputVectorType &landmarkVector) const
Index nonZeros() const
Definition: SparseMatrix.h:246
Eigen::SparseMatrix< TScalarType > KMatrixType
Scalar & insert(Index row, Index col)
Definition: SparseMatrix.h:220
Eigen::Matrix< TScalarType, NDimensions, NDimensions > GMatrixType
template<class TScalarType , unsigned int NDimensions>
void itk::SparseKernelTransform< TScalarType, NDimensions >::ComputeL ( void  ) const
protected

Compute L matrix.

postponed till needing the jacobian for this class

Definition at line 351 of file itkSparseKernelTransform.hxx.

352 {
353  unsigned long numberOfLandmarks = m_SourceLandmarks->GetNumberOfPoints();
354  //vnl_matrix<TScalarType> O2(NDimensions*(NDimensions+1),
355  // NDimensions*(NDimensions+1), 0);
356 
357  this->ComputeP();
358  this->ComputeK();
359 
360  //m_LMatrix.set_size( NDimensions*(numberOfLandmarks+NDimensions+1),
361  // NDimensions*(numberOfLandmarks+NDimensions+1) );
362  //m_LMatrix.fill( 0.0 );
363  m_LMatrix = LMatrixType( NDimensions*(numberOfLandmarks+NDimensions+1),
364  NDimensions*(numberOfLandmarks+NDimensions+1) );
365 
366  //std::vector<TripletType> tripletList;
367 
368  // putting KMATRIX
369  //m_LMatrix.update( m_KMatrix, 0, 0 );
370  //it.value();
371  //it.row(); // row index
372  //it.col(); // col index (here it is equal to k)
373  //it.index(); // inner index, here it is equal to it.row()
374  for (int k = 0; k < m_KMatrix.outerSize(); ++k) // column index
375  for (typename KMatrixType::InnerIterator it(m_KMatrix,k); it; ++it)
376  m_LMatrix.insert(it.row(), it.col()) = it.value() ;
377  //tripletList.push_back( TripletType ( it.row(), it.col(), it.value() ) );
378 
379  // putting PMATRIX - will keep the lower only ??
380  //m_LMatrix.update( m_PMatrix, 0, m_KMatrix.columns() );
381  //m_LMatrix.update( m_PMatrix.transpose(), m_KMatrix.rows(), 0);
382  for (int p = 0; p < m_PMatrix.outerSize(); ++p) // column index
383  for (typename PMatrixType::InnerIterator it(m_PMatrix,p); it; ++it)
384  {
385  // fill P -> upper
386  m_LMatrix.insert(it.row(), NDimensions*numberOfLandmarks + it.col()) = it.value() ;
387  //tripletList.push_back( TripletType ( it.row(), NDimensions*numberOfLandmarks + it.col(), it.value() ) );
388 
389  // fill P.transpose -> lower
390  m_LMatrix.insert(NDimensions*numberOfLandmarks + it.col(), it.row()) = it.value() ;
391  //tripletList.push_back( TripletType ( NDimensions*numberOfLandmarks + it.col(), it.row(), it.value() ) );
392  }
393  //m_LMatrix.update( O2, m_KMatrix.rows(), m_KMatrix.columns());
394 
395  // // shireen: for debugging let's make sure that the L matrix is sparse (based on gaussian basis)
396  // std::ofstream ofs;
397  // ofs.open("Lsparse.csv");
398  // for (int k = 0; k < m_LMatrix.outerSize(); ++k) // column index
399  // for (typename LMatrixType::InnerIterator it(m_LMatrix,k); it; ++it)
400  // ofs << it.row() << ", " << it.col() << ", " << it.value() << std::endl;
401  // ofs.close();
402 
403 
404  std::cout << "Lmatrix - nnz = " << m_LMatrix.nonZeros() << std::endl;
406 
407  //m_LMatrix.setFromTriplets(tripletList.begin(), tripletList.end());
409 }
Index outerSize() const
Definition: SparseMatrix.h:126
Eigen::SparseMatrix< TScalarType > LMatrixType
Index nonZeros() const
Definition: SparseMatrix.h:246
Scalar & insert(Index row, Index col)
Definition: SparseMatrix.h:220
template<class TScalarType , unsigned int NDimensions>
void itk::SparseKernelTransform< TScalarType, NDimensions >::ComputeP ( ) const
protected

Compute P matrix.

Definition at line 512 of file itkSparseKernelTransform.hxx.

513 {
514  unsigned long numberOfLandmarks = m_SourceLandmarks->GetNumberOfPoints();
515 
516  //IMatrixType I = IMatrixType::Identity();
517  //IMatrixType temp;
518  InputPointType p;
519 
520  //I.set_identity();
521 
522  //std::vector<TripletType> tripletList;
523 
524  //m_PMatrix.set_size( NDimensions*numberOfLandmarks,
525  // NDimensions*(NDimensions+1) );
526  //m_PMatrix.fill( 0.0 );
527  m_PMatrix = PMatrixType(NDimensions*numberOfLandmarks,
528  NDimensions*(NDimensions+1) );
529  for (unsigned int i = 0; i < numberOfLandmarks; i++)
530  {
531  m_SourceLandmarks->GetPoint(i, &p);
532  for (unsigned int j = 0; j < NDimensions; j++)
533  {
534  //temp = I * p[j];
535  for(unsigned int d = 0 ; d < NDimensions; d++)
536  {
537  m_PMatrix.insert(i*NDimensions + d, j*NDimensions + d) = p[j];
538  //tripletList.push_back( TripletType( i*NDimensions + d, j*NDimensions + d, p[j] ) );
539  }
540  //m_PMatrix.update(temp, i*NDimensions, j*NDimensions);
541  }
542 
543  for(unsigned int d = 0 ; d < NDimensions; d++)
544  {
545  m_PMatrix.insert(i*NDimensions + d, NDimensions*NDimensions + d) = 1;
546  //tripletList.push_back( TripletType( i*NDimensions + d, NDimensions*NDimensions + d, 1 ) );
547  }
548  //m_PMatrix.update(I, i*NDimensions, NDimensions*NDimensions);
549  }
550 
551  std::cout << "Pmatrix - nnz = " << m_PMatrix.nonZeros() << std::endl;
553  //m_PMatrix.setFromTriplets(tripletList.begin(), tripletList.end());
554 }
Superclass::InputPointType InputPointType
Index nonZeros() const
Definition: SparseMatrix.h:246
Scalar & insert(Index row, Index col)
Definition: SparseMatrix.h:220
Eigen::SparseMatrix< TScalarType > PMatrixType
template<class TScalarType , unsigned int NDimensions>
const SparseKernelTransform< TScalarType, NDimensions >::GMatrixType & itk::SparseKernelTransform< TScalarType, NDimensions >::ComputeReflexiveG ( PointsIterator  ) const
protectedvirtual

Compute a G(x) for a point to itself (i.e. for the block diagonal elements of the matrix K. Parameter indicates for which landmark the reflexive G is to be computed. The default implementation for the reflexive contribution is a diagonal matrix where the diagonal elements are the stiffness of the spline.

Definition at line 148 of file itkSparseKernelTransform.hxx.

149 {
150  m_GMatrix = GMatrixType::Zero();
151  for(unsigned d = 0; d < NDimensions; d++)
152  m_GMatrix(d,d) = m_Stiffness;
153 
154  //m_GMatrix.fill( NumericTraits< TScalarType >::Zero );
155  //m_GMatrix.fill_diagonal( m_Stiffness );
156 
157  return m_GMatrix;
158 }
template<class TScalarType , unsigned int NDimensions>
void itk::SparseKernelTransform< TScalarType, NDimensions >::ComputeWMatrix ( void  ) const

Compute W matrix.

Definition at line 225 of file itkSparseKernelTransform.hxx.

226 {
227  itk::TimeProbe clock;
228 
229  // std::cout<<"Computing W matrix"<<std::endl;
230 
231  //typedef vnl_svd<TScalarType> SVDSolverType;
232 
233  if(!m_LMatrixComputed) {
234  this->ComputeL();
235  }
236  this->ComputeY();
237 
238  //SVDSolverType svd( m_LMatrix, 1e-8 );
239  //m_WMatrix = svd.solve( m_YMatrix );
240 
241  clock.Start();
242 
243  //Eigen::BiCGSTAB<LMatrixType> solver;
245  solver.preconditioner().setDroptol(1e-10);
246  solver.preconditioner().setFillfactor(1000);
247 
248  // Eigen::SparseLU<LMatrixType> solver;
249  solver.compute(m_LMatrix);
250 
251  if(solver.info()!= Eigen::Success) {
252  // decomposition failed
253  throw std::runtime_error("LMatrix failed to decompose ...!");
254  }
255 
256  unsigned long numberOfLandmarks = m_SourceLandmarks->GetNumberOfPoints();
257  m_WMatrix = WMatrixType::Zero(NDimensions*(numberOfLandmarks+NDimensions+1), 1);
258  m_WMatrix = solver.solve(m_YMatrix);
259 
260  // m_WMatrix = WMatrixType::Random(NDimensions*(numberOfLandmarks+NDimensions+1), 1);
261  // solver.setMaxIterations(1);
262  // int i = 0;
263  // do {
264  // m_WMatrix = solver.solveWithGuess(m_YMatrix,m_WMatrix);
265  // std::cout << "#iteration: " << i << " " << "estimated error: " << solver.error() << std::endl;
266  // ++i;
267  // } while (solver.info()!= Eigen::Success && i<100);
268 
269  std::cout << "#iterations: " << solver.iterations() << std::endl;
270  std::cout << "estimated error: " << solver.error() << std::endl;
271 
272  std::cout << solver.error() << std::endl;
273  if(solver.info() != Eigen::Success) {
274  // solving failed
275  throw std::runtime_error("solving sparse system failed ...!");
276  }
277 
278  clock.Stop();
279  std::cout << "Computing Wmatrix:" << std::endl;
280  std::cout << "Mean: " << clock.GetMean() << std::endl;
281  std::cout << "Total: " << clock.GetTotal() << std::endl;
282 
283  this->ReorganizeW();
284  m_WMatrixComputed=true;
285 }
A bi conjugate gradient stabilized solver for sparse square problems.
Definition: BiCGSTAB.h:112
BiCGSTAB< _MatrixType, _Preconditioner > & compute(const MatrixType &A)
const internal::solve_retval< BiCGSTAB< _MatrixType, _Preconditioner >, Rhs > solve(const MatrixBase< Rhs > &b) const
template<class TScalarType , unsigned int NDimensions>
void itk::SparseKernelTransform< TScalarType, NDimensions >::ComputeY ( void  ) const
protected

Compute Y matrix.

Definition at line 563 of file itkSparseKernelTransform.hxx.

564 {
565  unsigned long numberOfLandmarks = m_SourceLandmarks->GetNumberOfPoints();
566 
567  this->ComputeD();
568 
569  typename VectorSetType::ConstIterator displacement =
570  m_Displacements->Begin();
571 
572  //m_YMatrix.set_size( NDimensions*(numberOfLandmarks+NDimensions+1), 1);
573  //m_YMatrix.fill( 0.0 );
574  m_YMatrix = YMatrixType::Zero(NDimensions*(numberOfLandmarks+NDimensions+1), 1);
575 
576  for (unsigned int i = 0; i < numberOfLandmarks; i++)
577  {
578  for (unsigned int j = 0; j < NDimensions; j++)
579  {
580  m_YMatrix(i*NDimensions+j, 0) = displacement.Value()[j];
581  //m_YMatrix.put(i*NDimensions+j, 0, displacement.Value()[j]);
582  }
583  displacement++;
584  }
585 
586  for (unsigned int i = 0; i < NDimensions*(NDimensions+1); i++)
587  {
588  m_YMatrix(numberOfLandmarks*NDimensions+i, 0) = 0;
589  //m_YMatrix.put(numberOfLandmarks*NDimensions+i, 0, 0);
590  }
591 }
template<class TScalarType , unsigned int NDimensions>
const SparseKernelTransform< TScalarType, NDimensions >::ParametersType & itk::SparseKernelTransform< TScalarType, NDimensions >::GetFixedParameters ( void  ) const
virtual

Get Transform Fixed Parameters - Gets the Target Landmarks

Definition at line 893 of file itkSparseKernelTransform.hxx.

894 {
895  this->m_FixedParameters = ParametersType( m_SourceLandmarks->GetNumberOfPoints() * NDimensions );
896 
897  PointsIterator itr = m_SourceLandmarks->GetPoints()->Begin();
898  PointsIterator end = m_SourceLandmarks->GetPoints()->End();
899 
900  unsigned int pcounter = 0;
901  while( itr != end )
902  {
903  InputPointType landmark = itr.Value();
904  for(unsigned int dim=0; dim<NDimensions; dim++)
905  {
906  this->m_FixedParameters[ pcounter ] = landmark[ dim ];
907  pcounter++;
908  }
909  itr++;
910  }
911 
912  return this->m_FixedParameters;
913 
914 }
Superclass::ParametersType ParametersType
Superclass::InputPointType InputPointType
template<class TScalarType , unsigned int NDimensions>
const SparseKernelTransform< TScalarType, NDimensions >::ParametersType & itk::SparseKernelTransform< TScalarType, NDimensions >::GetParameters ( void  ) const
virtual

Get the Transformation Parameters - Gets the Source Landmarks

Definition at line 879 of file itkSparseKernelTransform.hxx.

880 {
881  this->UpdateParameters();
882  return this->m_Parameters;
883 
884 }
virtual void UpdateParameters(void) const
template<class TScalarType, unsigned int NDimensions>
itk::SparseKernelTransform< TScalarType, NDimensions >::itkGetObjectMacro ( SourceLandmarks  ,
PointSetType   
)

Get the source landmarks list, which we will denote $ p $.

template<class TScalarType, unsigned int NDimensions>
itk::SparseKernelTransform< TScalarType, NDimensions >::itkGetObjectMacro ( TargetLandmarks  ,
PointSetType   
)

Get the target landmarks list, which we will denote $ q $.

template<class TScalarType, unsigned int NDimensions>
itk::SparseKernelTransform< TScalarType, NDimensions >::itkGetObjectMacro ( Displacements  ,
VectorSetType   
)

Get the displacements list, which we will denote $ d $, where $ d_i = q_i - p_i $.

template<class TScalarType, unsigned int NDimensions>
itk::SparseKernelTransform< TScalarType, NDimensions >::itkNewMacro ( Self  )

New macro for creation of through a Smart Pointer

template<class TScalarType, unsigned int NDimensions>
itk::SparseKernelTransform< TScalarType, NDimensions >::itkStaticConstMacro ( SpaceDimension  ,
unsigned  int,
NDimensions   
)

Dimension of the domain space.

template<class TScalarType, unsigned int NDimensions>
itk::SparseKernelTransform< TScalarType, NDimensions >::itkTypeMacro ( SparseKernelTransform< TScalarType, NDimensions >  ,
Transform   
)

Run-time type information (and related methods).

template<class TScalarType , unsigned int NDimensions>
void itk::SparseKernelTransform< TScalarType, NDimensions >::ReorganizeW ( void  ) const
protected

Reorganize the components of W into D (deformable), A (rotation part of affine) and B (translational part of affine ) components.

Warning
This method release the memory of the W Matrix

Definition at line 600 of file itkSparseKernelTransform.hxx.

601 {
602  unsigned long numberOfLandmarks = m_SourceLandmarks->GetNumberOfPoints();
603 
604  // The deformable (non-affine) part of the registration goes here
605  m_DMatrix = DMatrixType::Zero(NDimensions,numberOfLandmarks);
606  //m_DMatrix.set_size(NDimensions,numberOfLandmarks);
607 
608  unsigned int ci = 0;
609  for(unsigned int lnd=0; lnd < numberOfLandmarks; lnd++ )
610  {
611  for(unsigned int dim=0; dim < NDimensions; dim++ )
612  {
613  //std::cout << m_WMatrix(ci,0) << std::endl;
614  m_DMatrix(dim,lnd) = m_WMatrix(ci++,0);
615  }
616  }
617 
618  // This matrix holds the rotational part of the Affine component
619  m_AMatrix = AMatrixType::Zero(NDimensions, NDimensions);
620  for(unsigned int j=0; j < NDimensions; j++ )
621  {
622  for(unsigned int i=0; i < NDimensions; i++ )
623  {
624  m_AMatrix(i,j) = m_WMatrix(ci++,0);
625  }
626  }
627 
628  // This vector holds the translational part of the Affine component
629  m_BVector = BMatrixType::Zero(NDimensions,1);
630  for(unsigned int k=0; k < NDimensions; k++ )
631  {
632  m_BVector(k) = m_WMatrix(ci++,0);
633  }
634 
635  // release WMatrix memory by assigning a small one.
636  m_WMatrix = WMatrixType(1,1);
637 
639 
640  // std::ofstream ofs;
641  // ofs.open("D.csv");
642  // for (int k = 0; k < m_DMatrix.outerSize(); ++k) // column index
643  // for (typename DMatrixType::InnerIterator it(m_DMatrix,k); it; ++it)
644  // ofs << it.row() << ", " << it.col() << ", " << it.value() << std::endl;
645  // ofs.close();
646 }
Eigen::Matrix< TScalarType, Eigen::Dynamic, Eigen::Dynamic > WMatrixType
template<class TScalarType , unsigned int NDimensions>
void itk::SparseKernelTransform< TScalarType, NDimensions >::SetFixedParameters ( const ParametersType parameters)
virtual

Set Transform Fixed Parameters: To support the transform file writer this function was added to set the target landmarks similar to the SetParameters function setting the source landmarks

Definition at line 807 of file itkSparseKernelTransform.hxx.

808 {
809  typename PointsContainer::Pointer landmarks = PointsContainer::New();
810  const unsigned int numberOfLandmarks = parameters.Size() / NDimensions;
811 
812  landmarks->Reserve( numberOfLandmarks );
813 
814  PointsIterator itr = landmarks->Begin();
815  PointsIterator end = landmarks->End();
816 
817  InputPointType landMark;
818 
819  unsigned int pcounter = 0;
820  while( itr != end )
821  {
822  for(unsigned int dim=0; dim<NDimensions; dim++)
823  {
824  landMark[ dim ] = parameters[ pcounter ];
825  pcounter++;
826  }
827  itr.Value() = landMark;
828  itr++;
829  }
830 
831  // m_TargetLandmarks->SetPoints( landmarks );
832  m_SourceLandmarks->SetPoints( landmarks );
833 
834  // these are invalidated when the source lms change
835  m_WMatrixComputed=false;
836  m_LMatrixComputed=false;
837  m_LInverseComputed=false;
838 
839  // you must recompute L and Linv - this does not require the targ lms
840  //this->ComputeLInverse();
841  this->ComputeL();
842 
843 }
Superclass::InputPointType InputPointType
template<class TScalarType , unsigned int NDimensions>
void itk::SparseKernelTransform< TScalarType, NDimensions >::SetIdentity ( )
virtual

Compute the Jacobian Matrix of the transformation at one point Set the Transformation Parameters to be an identity transform

Definition at line 745 of file itkSparseKernelTransform.hxx.

746 {
747  this->SetParameters(this->GetFixedParameters());
748 }
virtual void SetParameters(const ParametersType &)
virtual const ParametersType & GetFixedParameters(void) const
template<class TScalarType , unsigned int NDimensions>
void itk::SparseKernelTransform< TScalarType, NDimensions >::SetParameters ( const ParametersType parameters)
virtual

Set the Transformation Parameters and update the internal transformation. The parameters represent the source landmarks. Each landmark point is represented by NDimensions doubles. All the landmarks are concatenated to form one flat Array<double>.

Definition at line 759 of file itkSparseKernelTransform.hxx.

760 {
761  // std::cout<<"Setting parameters to "<<parameters<<std::endl;
762  typename PointsContainer::Pointer landmarks = PointsContainer::New();
763  const unsigned int numberOfLandmarks = parameters.Size() / NDimensions;
764  landmarks->Reserve( numberOfLandmarks );
765 
766  PointsIterator itr = landmarks->Begin();
767  PointsIterator end = landmarks->End();
768 
769  InputPointType landMark;
770 
771  unsigned int pcounter = 0;
772  while( itr != end )
773  {
774  for(unsigned int dim=0; dim<NDimensions; dim++)
775  {
776  landMark[ dim ] = parameters[ pcounter ];
777  pcounter++;
778  }
779  itr.Value() = landMark;
780  itr++;
781  }
782 
783  // m_SourceLandmarks->SetPoints( landmarks );
784  m_TargetLandmarks->SetPoints( landmarks );
785 
786  // W MUST be recomputed if the target lms are set
787  this->ComputeWMatrix();
788 
789  // if(!m_LInverseComputed) {
790  // this->ComputeLInverse();
791  // }
792 
793  // Modified is always called since we just have a pointer to the
794  // parameters and cannot know if the parameters have changed.
795  this->Modified();
796 
797 }
Superclass::InputPointType InputPointType
template<class TScalarType , unsigned int NDimensions>
void itk::SparseKernelTransform< TScalarType, NDimensions >::SetSourceLandmarks ( PointSetType *  landmarks)
virtual

Set the source landmarks list.

Definition at line 79 of file itkSparseKernelTransform.hxx.

80 {
81  itkDebugMacro("setting SourceLandmarks to " << landmarks );
82  if (this->m_SourceLandmarks != landmarks)
83  {
84  this->m_SourceLandmarks = landmarks;
85  this->UpdateParameters();
86  this->Modified();
87 
88  // these are invalidated when the source lms change
89  m_WMatrixComputed = false;
90  m_LMatrixComputed = false;
91  m_LInverseComputed = false;
92 
93  // you must recompute L and Linv - this does not require the targ lms
94  // Linverse is only needed ofr Jacobian computation, I will defer this in case Jacobian is needed
95  // we will assume by default that this transform is used only for warping, if it is a part of optimization
96  // the GetJacobian will feel that the inverse is not computed and will compute it
97  //this->ComputeLInverse();
98  this->ComputeL();
99 
100  }
101 }
virtual void UpdateParameters(void) const
template<class TScalarType, unsigned int NDimensions>
virtual void itk::SparseKernelTransform< TScalarType, NDimensions >::SetStiffness ( double  stiffness)
inlinevirtual

Stiffness of the spline. A stiffness of zero results in the standard interpolating spline. A non-zero stiffness allows the spline to approximate rather than interpolate the landmarks. Stiffness values are usually rather small, typically in the range of 0.001 to 0.1. The approximating spline formulation is based on the short paper by R. Sprengel, K. Rohr, H. Stiehl. "Thin-Plate Spline Approximation for Image Registration". In 18th International Conference of the IEEE Engineering in Medicine and Biology Society. 1996.

Definition at line 199 of file itkSparseKernelTransform.h.

template<class TScalarType , unsigned int NDimensions>
void itk::SparseKernelTransform< TScalarType, NDimensions >::SetTargetLandmarks ( PointSetType *  landmarks)
virtual

Set the target landmarks list.

Definition at line 110 of file itkSparseKernelTransform.hxx.

111 {
112  itkDebugMacro("setting TargetLandmarks to " << landmarks );
113  if (this->m_TargetLandmarks != landmarks)
114  {
115  this->m_TargetLandmarks = landmarks;
116  // this is invalidated when the target lms change
117  m_WMatrixComputed=false;
118  this->ComputeWMatrix();
119  this->UpdateParameters();
120  this->Modified();
121  }
122 
123 }
virtual void UpdateParameters(void) const
template<class TScalarType , unsigned int NDimensions>
SparseKernelTransform< TScalarType, NDimensions >::OutputPointType itk::SparseKernelTransform< TScalarType, NDimensions >::TransformPoint ( const InputPointType thisPoint) const
virtual

Compute L matrix inverse. Compute the position of point in the new space

Definition at line 656 of file itkSparseKernelTransform.hxx.

657 {
658 
659  OutputPointType result;
660 
661  typedef typename OutputPointType::ValueType ValueType;
662 
663  result.Fill( NumericTraits< ValueType >::Zero );
664 
665  this->ComputeDeformationContribution( thisPoint, result );
666 
667  // Add the rotational part of the Affine component
668  for(unsigned int j=0; j < NDimensions; j++ )
669  {
670  for(unsigned int i=0; i < NDimensions; i++ )
671  {
672  result[i] += m_AMatrix(i,j) * thisPoint[j];
673  }
674  }
675 
676 
677 
678  // This vector holds the translational part of the Affine component
679  for(unsigned int k=0; k < NDimensions; k++ )
680  {
681  result[k] += m_BVector(k) + thisPoint[k];
682  }
683 
684  return result;
685 
686 }
virtual void ComputeDeformationContribution(const InputPointType &inputPoint, OutputPointType &result) const
template<class TScalarType , unsigned int NDimensions>
void itk::SparseKernelTransform< TScalarType, NDimensions >::UpdateParameters ( void  ) const
virtual

Update the Parameters array from the landmarks corrdinates.

Definition at line 851 of file itkSparseKernelTransform.hxx.

852 {
853  this->m_Parameters = ParametersType( m_TargetLandmarks->GetNumberOfPoints() * NDimensions );
854 
855  PointsIterator itr = m_TargetLandmarks->GetPoints()->Begin();
856  PointsIterator end = m_TargetLandmarks->GetPoints()->End();
857 
858  unsigned int pcounter = 0;
859  while( itr != end )
860  {
861  InputPointType landmark = itr.Value();
862  for(unsigned int dim=0; dim<NDimensions; dim++)
863  {
864  this->m_Parameters[ pcounter ] = landmark[ dim ];
865  pcounter++;
866  }
867  itr++;
868  }
869 }
Superclass::ParametersType ParametersType
Superclass::InputPointType InputPointType

Member Data Documentation

template<class TScalarType, unsigned int NDimensions>
AMatrixType itk::SparseKernelTransform< TScalarType, NDimensions >::m_AMatrix
mutableprotected

Rotatinoal/Shearing part of the Affine component of the Transformation

Definition at line 348 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
BMatrixType itk::SparseKernelTransform< TScalarType, NDimensions >::m_BVector
mutableprotected

Translational part of the Affine component of the Transformation

Definition at line 351 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
VectorSetPointer itk::SparseKernelTransform< TScalarType, NDimensions >::m_Displacements
protected

The list of displacements. d[i] = q[i] - p[i];

Definition at line 320 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
DMatrixType itk::SparseKernelTransform< TScalarType, NDimensions >::m_DMatrix
mutableprotected

The Deformation matrix. This is an auxiliary matrix that will hold the Deformation (non-affine) part of the transform. Those are the coefficients that will multiply the Kernel function

Definition at line 345 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
GMatrixType itk::SparseKernelTransform< TScalarType, NDimensions >::m_GMatrix
mutableprotected

The G matrix. It is made mutable because m_GMatrix was made an ivar only to avoid copying the matrix at return time

Definition at line 356 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
IMatrixType itk::SparseKernelTransform< TScalarType, NDimensions >::m_I
protected

Identity matrix.

Definition at line 366 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
KMatrixType itk::SparseKernelTransform< TScalarType, NDimensions >::m_KMatrix
mutableprotected

The K matrix.

Definition at line 329 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
bool itk::SparseKernelTransform< TScalarType, NDimensions >::m_LInverseComputed
mutableprotected

Has the L inverse matrix been computed?

Definition at line 363 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
LMatrixType itk::SparseKernelTransform< TScalarType, NDimensions >::m_LMatrix
mutableprotected

The L matrix.

Definition at line 323 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
bool itk::SparseKernelTransform< TScalarType, NDimensions >::m_LMatrixComputed
mutableprotected

Has the L matrix been computed?

Definition at line 361 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
LMatrixType itk::SparseKernelTransform< TScalarType, NDimensions >::m_LMatrixInverse
mutableprotected

The inverse of L, which we also cache.

Definition at line 326 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
PMatrixType itk::SparseKernelTransform< TScalarType, NDimensions >::m_PMatrix
mutableprotected

The P matrix.

Definition at line 332 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
PointSetPointer itk::SparseKernelTransform< TScalarType, NDimensions >::m_SourceLandmarks

The list of source landmarks, denoted 'p'.

Definition at line 265 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
double itk::SparseKernelTransform< TScalarType, NDimensions >::m_Stiffness
protected

Stiffness parameter

Definition at line 316 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
PointSetPointer itk::SparseKernelTransform< TScalarType, NDimensions >::m_TargetLandmarks

The list of target landmarks, denoted 'q'.

Definition at line 268 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
WMatrixType itk::SparseKernelTransform< TScalarType, NDimensions >::m_WMatrix
mutableprotected

The W matrix.

Definition at line 338 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
bool itk::SparseKernelTransform< TScalarType, NDimensions >::m_WMatrixComputed
mutableprotected

Has the W matrix been computed?

Definition at line 359 of file itkSparseKernelTransform.h.

template<class TScalarType, unsigned int NDimensions>
YMatrixType itk::SparseKernelTransform< TScalarType, NDimensions >::m_YMatrix
mutableprotected

The Y matrix.

Definition at line 335 of file itkSparseKernelTransform.h.


The documentation for this class was generated from the following files: