/*========================================================================= * * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *=========================================================================*/ #ifndef itkScaleLogarithmicTransform_hxx #define itkScaleLogarithmicTransform_hxx namespace itk { // Set the parameters template void ScaleLogarithmicTransform::SetParameters(const ParametersType & parameters) { ScaleType scales; for (unsigned int i = 0; i < SpaceDimension; ++i) { scales[i] = std::exp(parameters[i]); } // Save parameters. Needed for proper operation of TransformUpdateParameters. if (¶meters != &(this->m_Parameters)) { this->m_Parameters = parameters; } this->SetScale(scales); // Modified is always called since we just have a pointer to the // parameters and cannot know if the parameters have changed. this->Modified(); } // Get Parameters template auto ScaleLogarithmicTransform::GetParameters() const -> const ParametersType & { itkDebugMacro("Getting parameters "); const ScaleType & scales = this->GetScale(); // Transfer the translation part for (unsigned int i = 0; i < SpaceDimension; ++i) { this->m_Parameters[i] = std::log(scales[i]); } itkDebugMacro("After getting parameters " << this->m_Parameters); return this->m_Parameters; } // Print self template void ScaleLogarithmicTransform::PrintSelf(std::ostream & os, Indent indent) const { Superclass::PrintSelf(os, indent); } template void ScaleLogarithmicTransform::ComputeJacobianWithRespectToParameters( const InputPointType & p, JacobianType & jacobian) const { const ScaleType & scales = this->GetScale(); jacobian.SetSize(SpaceDimension, this->GetNumberOfLocalParameters()); jacobian.Fill(0); for (unsigned int dim = 0; dim < SpaceDimension; ++dim) { // the derivative with respect to Log(scale) = scale * derivative with // respect to scale. jacobian(dim, dim) = scales[dim] * p[dim]; } } } // namespace itk #endif