結論: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);
}