17 #ifndef _itkQuaternionRigidTransformGradientDescentOptimizer_txx
18 #define _itkQuaternionRigidTransformGradientDescentOptimizer_txx
21 #include "vnl/vnl_quaternion.h"
48 const unsigned int spaceDimension = m_CostFunction->GetNumberOfParameters();
51 if (scales.size() != spaceDimension)
53 itkExceptionMacro(<<
"The size of Scales is "
55 <<
", but the NumberOfParameters is "
61 for (
unsigned int i=0; i< spaceDimension; i++)
63 transformedGradient[i] = m_Gradient[i] / scales[i];
69 vnl_quaternion<double> newQuaternion;
70 for (
unsigned int j=0; j < 4; j++ )
72 newQuaternion[j] = currentPosition[j] + direction * m_LearningRate *
73 transformedGradient[j];
76 newQuaternion.normalize();
80 for (
unsigned int j=0; j < 4; j++ )
82 newPosition[j] = newQuaternion[j];
86 for (
unsigned int j=4; j< spaceDimension; j++)
88 newPosition[j] = currentPosition[j] +
89 direction * m_LearningRate * transformedGradient[j];
97 this->SetCurrentPosition( newPosition );