2016-09-26 15 views
1

私はEigenにn×3の行列を持っています。第1列の値を昇順にソートして、第2列と第3列の値を並べ替えることをお勧めします。ソート前 例えば:固有値行列の列の値を列1の値の昇順に並べ替えます。

1 4 6 
-2 5 2 
    3 1 0 

1列の値の昇順に従ってソート後:

-2 5 2 
    1 4 6 
    3 1 0 

私はこれにアプローチする方法での損失でいます。私は各列をベクトルに読み込み、std :: sortを使って列1のベクトルをソートすることができましたが、列1のソートされた値に対して、列2と列3の対応する値をどのように保持できるのか分かりません。それが何らかの形で役立つなら固定されています。

答えて

1

これはきれいではなく、テンプレートパラメータを使用して行列を選ぶことに依存しますが、それは機能します。

#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以上でコンパイルする必要があります。

+0

感謝を – user1420

+0

あなたドンこの過度に複雑なテンプレートを行う必要はありません。単純な 'Eigen :: MatrixXd'ができます。 – xjcl

0

私が思いついた最善の解決策は、std::vectorに行をコピーし、そのソートするために行くことだった。私はこの上で行くと、あなたに戻って取得します、

#include <Eigen/Core> 
#include <algorithm> // std::sort 
#include <vector>  // std::vector 

bool compare_head(const Eigen::VectorXd& lhs, const Eigen::VectorXd& rhs) 
{ 
    return lhs(0) < rhs(0); 
} 

Eigen::MatrixXd sorted_rows_by_head(Eigen::MatrixXd A_nx3) 
{ 
    std::vector<Eigen::VectorXd> vec; 
    for (int64_t i = 0; i < A_nx3.rows(); ++i) 
     vec.push_back(A_nx3.row(i)); 

    std::sort(vec.begin(), vec.end(), &compare_head); 

    for (int64_t i = 0; i < A_nx3.rows(); ++i) 
     A_nx3.row(i) = vec[i]; 

    return A_nx3; 
} 
関連する問題