这并不美观,依赖于使用它的模板参数拆开矩阵 - 但它可以工作。
#include <Eigen/Core>
#include <algorithm>
#include <vector>
template <typename MatrixT>
bool compareRows(MatrixT a, MatrixT b) {
return a(0,0) < b(0,0);
}
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
) {
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
或更高版本进行编译。