LoginSignup
18
14

More than 5 years have passed since last update.

STLのコンテナからEigen::Matrixへ変換する

Last updated at Posted at 2013-10-02

結論:Eigen::Map を使えばいい。適当にラッパー書いた。

使い方

nnmn.cpp
Eigen::VectorXf v = eigen_vector(vector); // from std::vector<float> vector;
Eigen::MatrixXf m = eigen_matrix(matrix); // from std::vector<std::vector<float> > matrix;

コンパイルは、g++ nnmn.cpp -std=c++0x 的な感じで。unique_ptr使ってるので、c++0xなり何なり付ける。

以下実装。書いてから思ったけど、固有ベクトルと間違えそうだし関数名変えたほうがいいかも

実装

matix_util.h
#pragma once

#include <Eigen/Core>
#include <iterator>
#include <memory>

namespace internal {

/**
   @brief Serialize Matrix to 1D array
   @param matrix
   @param array1d: pointer of 1D array
 */
template <class Matrix, class T>
inline void matrix_to_array1d(Matrix& matrix, T* array1d)
{
  const int cols = matrix.size();
  const int rows = matrix[0].size();

  for (int i = 0 ; i < cols; ++i) {
    std::copy(matrix[i].begin(), matrix[i].end(), array1d);
    array1d += rows;
  }
}

} // end namespace internal

/**
   @brief Eigen::Matrix from matrix
   @param matrix
   @return Eigen::Matrix
 */
template <class ValueType=float, class Matrix>
Eigen::Matrix<ValueType, Eigen::Dynamic, Eigen::Dynamic>
eigen_matrix(Matrix& matrix)
{
  const int cols = matrix.size();
  const int rows = matrix[0].size();

  // copy to 1d array
  std::unique_ptr<ValueType[]> array1d(new ValueType [rows*cols]);
  internal::matrix_to_array1d(matrix, array1d.get());

  // eigen matrix from 1darray
  return Eigen::Map<Eigen::Matrix<ValueType, Eigen::Dynamic, Eigen::Dynamic> >(array1d.get(), rows, cols);
}

/**
   @brief Eigen::Vector from vector
   @param vector
   @return Eigen::Vector
 */
template <class Vector>
Eigen::Matrix<typename Vector::value_type, Eigen::Dynamic, 1>
eigen_vector(Vector& vector)
{
  typedef typename Vector::value_type value_type;
  return Eigen::Map<Eigen::Matrix<value_type, Eigen::Dynamic, 1> >(&vector[0], vector.size(), 1);
}
18
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
14