これはきれいではなく、テンプレートパラメータを使用して行列を選ぶことに依存しますが、それは機能します。
#include <Eigen/Core>
#include <algorithm>
#include <vector>
// Simple little templated comparison functor
template <typename MatrixT>
bool compareRows(MatrixT a, MatrixT b) {
return a(0,0) < b(0,0);
}
// These are the 6 template arguments to every Eigen matrix
template <typename Scalar, int rows, int cols, int options, int maxRows, int maxCols>
Eigen::Matrix<Scalar, rows, cols, options, maxRows, maxCols> sortMatrix(
Eigen::Matrix<Scalar, rows, cols, options, maxRows, maxCols> target
) {
// Manually construct a vector of correctly-typed matrix rows
std::vector<Eigen::Matrix<Scalar, 1, cols>> matrixRows;
for (unsigned int i = 0; i < target.rows(); i++)
matrixRows.push_back(target.row(i));
std::sort(
matrixRows.begin(),
matrixRows.end(),
compareRows<Eigen::Matrix<Scalar, 1, cols>>
);
Eigen::Matrix<Scalar, rows, cols, options, maxRows, maxCols> sorted;
for (unsigned int i = 0; i < matrixRows.size(); i++)
sorted.row(i) = matrixRows[i];
return sorted;
}
ありがたいことに、テンプレート引数控除のために、あなたは、単にこのようなこの混乱呼び出すことができます。
Eigen::Matrix3f myMatrix;
// Fill in contents here
Eigen::Matrix3f sorted = sortMatrix(myMatrix);
私はこれを行うために、よりエレガントな方法がありますほとんど肯定的だが、しかし、私はできません今すぐ考えてみてください。また、std::vector
を使用しているため、-std=c++11
以上でコンパイルする必要があります。
は
感謝を – user1420
あなたドンこの過度に複雑なテンプレートを行う必要はありません。単純な 'Eigen :: MatrixXd'ができます。 – xjcl