17 #ifndef __itkMatrixOffsetTransformBase_txx
18 #define __itkMatrixOffsetTransformBase_txx
20 #include "itkNumericTraits.h"
22 #include "vnl/algo/vnl_matrix_inverse.h"
30 template<
class TScalarType,
unsigned int NInputDimensions,
31 unsigned int NOutputDimensions>
34 :
Superclass(OutputSpaceDimension, ParametersDimension)
36 m_Matrix.SetIdentity();
40 m_Translation.Fill( 0 );
42 m_InverseMatrix.SetIdentity();
43 m_InverseMatrixMTime = m_MatrixMTime;
44 this->m_FixedParameters.SetSize ( NInputDimensions );
45 this->m_FixedParameters.Fill ( 0.0 );
50 template<
class TScalarType,
unsigned int NInputDimensions,
51 unsigned int NOutputDimensions>
54 unsigned int paramDims )
57 m_Matrix.SetIdentity();
61 m_Translation.Fill( 0 );
63 m_InverseMatrix.SetIdentity();
64 m_InverseMatrixMTime = m_MatrixMTime;
68 template<
class TScalarType,
unsigned int NInputDimensions,
69 unsigned int NOutputDimensions>
75 m_MatrixMTime.Modified();
78 m_Translation.Fill(0);
79 for(
unsigned int i=0; i<NOutputDimensions; i++)
81 m_Translation[i] = offset[i];
83 this->ComputeMatrixParameters();
87 template<
class TScalarType,
unsigned int NInputDimensions,
88 unsigned int NOutputDimensions>
96 template<
class TScalarType,
unsigned int NInputDimensions,
97 unsigned int NOutputDimensions>
102 Superclass::PrintSelf(os,indent);
106 os << indent <<
"Matrix: " << std::endl;
107 for (i = 0; i < NInputDimensions; i++)
110 for (j = 0; j < NOutputDimensions; j++)
112 os << m_Matrix[i][j] <<
" ";
117 os << indent <<
"Offset: " << m_Offset << std::endl;
118 os << indent <<
"Center: " << m_Center << std::endl;
119 os << indent <<
"Translation: " << m_Translation << std::endl;
121 os << indent <<
"Inverse: " << std::endl;
122 for (i = 0; i < NInputDimensions; i++)
125 for (j = 0; j < NOutputDimensions; j++)
127 os << this->GetInverseMatrix()[i][j] <<
" ";
131 os << indent <<
"Singular: " << m_Singular << std::endl;
135 template<
class TScalarType,
unsigned int NInputDimensions,
136 unsigned int NOutputDimensions>
141 m_Matrix.SetIdentity();
142 m_MatrixMTime.Modified();
143 m_Offset.Fill( NumericTraits< OutputVectorValueType >::Zero );
144 m_Translation.Fill( NumericTraits< OutputVectorValueType >::Zero );
145 m_Center.Fill( NumericTraits< InputPointValueType >::Zero );
147 m_InverseMatrix.SetIdentity();
148 m_InverseMatrixMTime = m_MatrixMTime;
154 template<
class TScalarType,
unsigned int NInputDimensions,
155 unsigned int NOutputDimensions>
162 m_Offset = m_Matrix * other->m_Offset + m_Offset;
163 m_Matrix = m_Matrix * other->m_Matrix;
167 m_Offset = other->m_Matrix * m_Offset + other->m_Offset;
168 m_Matrix = other->m_Matrix * m_Matrix;
171 this->ComputeTranslation();
172 this->ComputeMatrixParameters();
174 m_MatrixMTime.Modified();
181 template<
class TScalarType,
unsigned int NInputDimensions,
182 unsigned int NOutputDimensions>
185 NOutputDimensions>::OutputPointType
189 return m_Matrix * point + m_Offset;
194 template<
class TScalarType,
unsigned int NInputDimensions,
195 unsigned int NOutputDimensions>
198 NOutputDimensions>::OutputVectorType
202 return m_Matrix * vect;
207 template<
class TScalarType,
unsigned int NInputDimensions,
208 unsigned int NOutputDimensions>
211 NOutputDimensions>::OutputVnlVectorType
215 return m_Matrix * vect;
220 template<
class TScalarType,
unsigned int NInputDimensions,
221 unsigned int NOutputDimensions>
224 NOutputDimensions>::OutputCovariantVectorType
230 for (
unsigned int i = 0; i < NOutputDimensions; i++)
232 result[i] = NumericTraits<ScalarType>::Zero;
233 for (
unsigned int j = 0; j < NInputDimensions; j++)
235 result[i] += this->GetInverseMatrix()[j][i]*vec[j];
242 template<
class TScalarType,
unsigned int NInputDimensions,
243 unsigned int NOutputDimensions>
246 NOutputDimensions>::InverseMatrixType &
251 if(m_InverseMatrixMTime != m_MatrixMTime)
262 m_InverseMatrixMTime = m_MatrixMTime;
265 return m_InverseMatrix;
269 template<
class TScalarType,
unsigned int NInputDimensions,
270 unsigned int NOutputDimensions>
280 this->GetInverseMatrix();
286 inverse->m_Matrix = this->GetInverseMatrix();
287 inverse->m_InverseMatrix = m_Matrix;
288 inverse->m_Offset = -(this->GetInverseMatrix() * m_Offset);
289 inverse->ComputeTranslation();
290 inverse->ComputeMatrixParameters();
296 template<
class TScalarType,
unsigned int NInputDimensions,
297 unsigned int NOutputDimensions>
299 NOutputDimensions>::InverseTransformBasePointer
309 template<
class TScalarType,
unsigned int NInputDimensions,
310 unsigned int NOutputDimensions>
315 this->m_FixedParameters = fp;
317 typedef typename ParametersType::ValueType ParameterValueType;
318 for (
unsigned int i = 0; i < NInputDimensions; i++ )
320 c[i] = this->m_FixedParameters[i];
322 this->SetCenter ( c );
326 template<
class TScalarType,
unsigned int NInputDimensions,
327 unsigned int NOutputDimensions>
330 NOutputDimensions>::ParametersType &
334 this->m_FixedParameters.SetSize ( NInputDimensions );
335 for (
unsigned int i = 0; i < NInputDimensions; i++ )
337 this->m_FixedParameters[i] = this->m_Center[i];
339 return this->m_FixedParameters;
343 template<
class TScalarType,
unsigned int NInputDimensions,
344 unsigned int NOutputDimensions>
347 NOutputDimensions>::ParametersType &
352 unsigned int par = 0;
354 for(
unsigned int row=0; row<NOutputDimensions; row++)
356 for(
unsigned int col=0; col<NInputDimensions; col++)
358 this->m_Parameters[par] = m_Matrix[row][col];
364 for(
unsigned int i=0; i<NOutputDimensions; i++)
366 this->m_Parameters[par] = m_Translation[i];
370 return this->m_Parameters;
375 template<
class TScalarType,
unsigned int NInputDimensions,
376 unsigned int NOutputDimensions>
381 if (parameters.Size() <
382 (NOutputDimensions * NInputDimensions + NOutputDimensions))
385 (<<
"Error setting parameters: parameters array size ("
386 << parameters.Size() <<
") is less than expected "
387 <<
" (NInputDimensions * NOutputDimensions + NOutputDimensions) "
388 <<
" (" << NInputDimensions <<
" * " << NOutputDimensions
389 <<
" + " << NOutputDimensions
390 <<
" = " << NInputDimensions*NOutputDimensions+NOutputDimensions <<
")"
394 unsigned int par = 0;
396 this->m_Parameters = parameters;
398 for(
unsigned int row=0; row<NOutputDimensions; row++)
400 for(
unsigned int col=0; col<NInputDimensions; col++)
402 m_Matrix[row][col] = this->m_Parameters[par];
408 for(
unsigned int i=0; i<NOutputDimensions; i++)
410 m_Translation[i] = this->m_Parameters[par];
414 m_MatrixMTime.Modified();
416 this->ComputeMatrix();
418 this->ComputeOffset();
428 template<
class TScalarType,
unsigned int NInputDimensions,
429 unsigned int NOutputDimensions>
438 this->m_Jacobian.
Fill( 0.0 );
442 unsigned int blockOffset = 0;
444 for(
unsigned int block=0; block < NInputDimensions; block++)
446 for(
unsigned int dim=0; dim < NOutputDimensions; dim++ )
448 this->m_Jacobian( block , blockOffset + dim ) = v[dim];
451 blockOffset += NInputDimensions;
455 for(
unsigned int dim=0; dim < NOutputDimensions; dim++ )
457 this->m_Jacobian( dim , blockOffset + dim ) = 1.0;
460 return this->m_Jacobian;
465 template<
class TScalarType,
unsigned int NInputDimensions,
466 unsigned int NOutputDimensions>
471 const MatrixType & matrix = this->GetMatrix();
474 for(
unsigned int i=0; i<NOutputDimensions; i++)
476 offset[i] = m_Translation[i] + m_Center[i];
477 for(
unsigned int j=0; j<NInputDimensions; j++)
479 offset[i] -= matrix[i][j] * m_Center[j];
487 template<
class TScalarType,
unsigned int NInputDimensions,
488 unsigned int NOutputDimensions>
493 const MatrixType & matrix = this->GetMatrix();
496 for(
unsigned int i=0; i<NOutputDimensions; i++)
498 translation[i] = m_Offset[i] - m_Center[i];
499 for(
unsigned int j=0; j<NInputDimensions; j++)
501 translation[i] += matrix[i][j] * m_Center[j];
505 m_Translation = translation;
511 template<
class TScalarType,
unsigned int NInputDimensions,
512 unsigned int NOutputDimensions>
525 template<
class TScalarType,
unsigned int NInputDimensions,
526 unsigned int NOutputDimensions>