Skip to content

Libs/Utils/EigenUtils.h

Namespaces

Name
shapeworks

Source code

#pragma once

#include <Eigen/Core>

#include "Shapeworks.h"

namespace shapeworks {

// Returns a 4x4 Eigen (col-major) from the given 3x4 (left-hand) itk::Transform.
Eigen::MatrixXd itkTransformToEigen(TransformPtr itk_xform);

// Returns a 3x4 itk::AffineTransform from the given (col-major) 4x4 Eigen::Matrix
TransformPtr eigen44ToItkTransform(const Eigen::Matrix<double, 4, 4> &eigen_mat);

// Returns a 4x4 Eigen (row-major) from the given vtkTransform4x4.
Eigen::Matrix<double, 4, 4, Eigen::RowMajor> vtkTransformToEigen(MeshTransform vtk_xform);

// Returns a 4x4 vtkMatrix4x4 from the given (row-major) 4x4 Eigen::Matrix
MeshTransform eigen44ToVtkTransform(const Eigen::Matrix<double, 4, 4, Eigen::RowMajor> &eigen_mat);

template<typename T>
using VnlMatrix = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;

template<typename T, unsigned NRows, unsigned NCols>
Eigen::Matrix<T, NRows, NCols, Eigen::RowMajor> itkToEigen(const itk::Matrix<T, NRows, NCols> &itk_mat)
{
  return Eigen::Matrix<T, NRows, NCols, Eigen::RowMajor>(itk_mat.GetVnlMatrix().data_block());
}

// With any luck, rvalue assignment will be used here (though it's explicit in the vxl code).
template<typename T, int NRows, int NCols>
itk::Matrix<T, NRows, NCols> eigenToItk(const Eigen::Matrix<T, NRows, NCols, Eigen::RowMajor> &eigen_mat)
{
  return itk::Matrix<T, NRows, NCols>(vnl_matrix_fixed<T, NRows, NCols>(eigen_mat.data()));
}

template<typename T>
Eigen::Map<VnlMatrix<T>> vnlToEigen(const vnl_matrix<T> &vnl_mat)
{
  return Eigen::Map<VnlMatrix<T>>(const_cast<T*>(vnl_mat.data_block()), vnl_mat.rows(), vnl_mat.cols());
}

template<int NRows, int NCols, typename T>
Eigen::Map<Eigen::Matrix<T, NRows, NCols, Eigen::RowMajor>> wrapDataWithEigen(T *data)
{
  return Eigen::Map<Eigen::Matrix<T, NRows, NCols, Eigen::RowMajor>>(data);
}

template<typename T>
Eigen::Map<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>>
wrapDataWithEigen(T *data, size_t nrows, size_t ncols)
{
  return Eigen::Map<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>>(data, nrows, ncols);
}

template<unsigned NRows, unsigned NCols, typename T>
itk::Matrix<T, NRows, NCols> wrapDataWithItk(T *data)
{
  std::cerr << "WARNING: vnl cannot wrap data, so this just copies input array\n";
  itk::Matrix<T, NRows, NCols> itk_mat;
  vnl_matrix_fixed<T, NRows, NCols> &vnl_mat = itk_mat.GetVnlMatrix();
  vnl_mat.copy_in(data);
  return itk_mat;
}

} // shapeworks

Updated on 2022-07-23 at 16:40:07 -0600