18#ifndef itkStackTransform_h
19#define itkStackTransform_h
37template <
class TScalarType,
unsigned int NInputDimensions,
unsigned int NOutputDimensions>
59 using typename Superclass::ScalarType;
60 using typename Superclass::ParametersType;
61 using typename Superclass::FixedParametersType;
62 using typename Superclass::NumberOfParametersType;
63 using typename Superclass::ParametersValueType;
64 using typename Superclass::JacobianType;
70 using typename Superclass::InputPointType;
71 using typename Superclass::InputVectorType;
72 using typename Superclass::OutputVectorType;
73 using typename Superclass::InputVnlVectorType;
74 using typename Superclass::OutputVnlVectorType;
75 using typename Superclass::OutputCovariantVectorType;
76 using typename Superclass::InputCovariantVectorType;
77 using typename Superclass::OutputPointType;
78 using typename Superclass::OutputVectorPixelType;
79 using typename Superclass::InputVectorPixelType;
113 const ParametersType &
120 const auto numberOfFixedParameters = fixedParameters.size();
121 if (numberOfFixedParameters < NumberOfGeneralFixedParametersOfStack)
123 itkExceptionMacro(<<
"The number of FixedParameters (" << numberOfFixedParameters <<
") should be at least "
124 << NumberOfGeneralFixedParametersOfStack);
127 if (Superclass::m_FixedParameters != fixedParameters)
129 Superclass::m_FixedParameters = fixedParameters;
131 CreateSubTransforms(FixedParametersType(fixedParameters.data_block() + NumberOfGeneralFixedParametersOfStack,
132 numberOfFixedParameters - NumberOfGeneralFixedParametersOfStack));
133 UpdateStackSpacingAndOrigin();
140 NumberOfParametersType
143 if (this->m_SubTransformContainer.empty())
149 return this->m_SubTransformContainer.size() * m_SubTransformContainer[0]->GetNumberOfParameters();
158 if (this->m_SubTransformContainer.size() != num)
160 this->m_SubTransformContainer.clear();
161 this->m_SubTransformContainer.resize(num);
170 return static_cast<unsigned>(m_SubTransformContainer.size());
184 this->m_SubTransformContainer[i] = transform;
195 m_SubTransformContainer.empty() ? nullptr : m_SubTransformContainer.front();
196 this->UpdateFixedParametersInternally((subTransform ==
nullptr) ? FixedParametersType()
197 : subTransform->GetFixedParameters());
205 const auto & fixedParametersOfSubTransform = transform.GetFixedParameters();
206 const auto & parametersOfSubTransform = transform.GetParameters();
208 UpdateFixedParametersInternally(fixedParametersOfSubTransform);
210 for (
auto & subTransform : m_SubTransformContainer)
214 transformcopy->SetFixedParameters(fixedParametersOfSubTransform);
215 transformcopy->SetParameters(parametersOfSubTransform);
217 subTransform = transformcopy;
226 return this->m_SubTransformContainer[i];
231 NumberOfParametersType
244 NumberOfGeneralFixedParametersOfStack
250 assert(Superclass::m_FixedParameters.size() >= NumberOfGeneralFixedParametersOfStack);
251 const auto numberOfSubTransforms = Superclass::m_FixedParameters[IndexOfNumberOfSubTransforms];
253 if (numberOfSubTransforms >= 0.0 && numberOfSubTransforms <= UINT_MAX &&
254 static_cast<double>(
static_cast<unsigned>(numberOfSubTransforms)) == numberOfSubTransforms)
256 m_SubTransformContainer.resize(
static_cast<unsigned>(numberOfSubTransforms));
260 itkExceptionMacro(<<
"The FixedParameters element (" << numberOfSubTransforms
261 <<
") should be a valid number (the number of subtransforms).");
264 for (
auto & subTransform : m_SubTransformContainer)
266 subTransform = this->CreateSubTransform();
267 subTransform->SetFixedParameters(fixedParametersOfSubTransform);
274 assert(Superclass::m_FixedParameters.size() >= NumberOfGeneralFixedParametersOfStack);
275 m_StackSpacing = Superclass::m_FixedParameters[IndexOfStackSpacing];
276 m_StackOrigin = Superclass::m_FixedParameters[IndexOfStackOrigin];
285 const auto numberOfFixedParametersOfSubTransform = fixedParametersOfSubTransform.size();
287 FixedParametersType & fixedParametersOfStack = this->Superclass::m_FixedParameters;
289 const auto minimumNumberOfFixedParametersOfStack =
290 NumberOfGeneralFixedParametersOfStack + numberOfFixedParametersOfSubTransform;
292 if (fixedParametersOfStack.size() < minimumNumberOfFixedParametersOfStack)
294 fixedParametersOfStack.set_size(minimumNumberOfFixedParametersOfStack);
296 fixedParametersOfStack[IndexOfNumberOfSubTransforms] = m_SubTransformContainer.size();
297 fixedParametersOfStack[IndexOfStackOrigin] = m_StackOrigin;
298 fixedParametersOfStack[IndexOfStackSpacing] = m_StackSpacing;
299 std::copy_n(fixedParametersOfSubTransform.begin(),
300 numberOfFixedParametersOfSubTransform,
301 fixedParametersOfStack.begin() + NumberOfGeneralFixedParametersOfStack);
308 virtual SubTransformPointer
312 static constexpr const char * unimplementedOverrideMessage =
"Not implemented for StackTransform";
318 itkExceptionMacro(<< unimplementedOverrideMessage);
324 itkExceptionMacro(<< unimplementedOverrideMessage);
327 OutputCovariantVectorType
330 itkExceptionMacro(<< unimplementedOverrideMessage);
338 itkExceptionMacro(<< unimplementedOverrideMessage);
344 itkExceptionMacro(<< unimplementedOverrideMessage);
352 itkExceptionMacro(<< unimplementedOverrideMessage);
361 itkExceptionMacro(<< unimplementedOverrideMessage);
369 itkExceptionMacro(<< unimplementedOverrideMessage);
379 itkExceptionMacro(<< unimplementedOverrideMessage);
393#ifndef ITK_MANUAL_INSTANTIATION
394# include "itkStackTransform.hxx"