14

私が持っているとしましょう

Eigen::VectorXd x; //{1,2,3,4,5,6,7,8}

Eigen::VectorXd ind_vec; //{0,2,4,5}

ind_vecxの要素を抽出する簡単な方法はありますか?

何かのようなもの:

x.extract(ind_vec) returning {1, 3, 5, 6}
4

5 に答える 5

17

現在の答えは私にとって満足のいくものではなかったので、少しグーグルで調べたところ、Eigenのドキュメントでこのチュートリアルを見つけました。

#include <Eigen/Dense>
#include <iostream>
using namespace std;
int main()
{
  Eigen::ArrayXf v(6);
  v << 1, 2, 3, 4, 5, 6;
  cout << "v.head(3) =" << endl << v.head(3) << endl << endl;
  cout << "v.tail<3>() = " << endl << v.tail<3>() << endl << endl;
  v.segment(1,4) *= 2;
  cout << "after 'v.segment(1,4) *= 2', v =" << endl << v << endl;
}

出力します:

v.head(3) =
1
2
3

v.tail<3>() = 
4
5
6

after 'v.segment(1,4) *= 2', v =
 1
 4
 6
 8
10
 6

ベクトルでテストしたことはありませんが、同様に可能であると思います。

于 2015-10-09T07:55:59.670 に答える
5

ベクトルだけの場合は、自分で書くのは簡単なようです:

#include "Eigen/Core"

template <typename T, typename T2>
T extract(const T2& full, const T& ind)
{
    int num_indices = ind.innerSize();
    T target(num_indices);
    for (int i = 0; i < num_indices; i++)
    {
        target[i] = full[ind[i]];
    }
    return target;
}

int main()
{
    Eigen::VectorXd full(8); 
    full << 1, 2, 3, 4, 5, 6, 7, 8;
    Eigen::Vector4d ind_vec(4);
    ind_vec << 0, 2, 4, 5;
    std::cout << "full:" << full<< std::endl;
    std::cout << "ind_vec:" << ind_vec<< std::endl;
    std::cout << "extracted" << extract(full,ind_vec) << std::endl;
}

それはほとんどの場合にうまくいくはずです

編集:インデックスのスカラー型がソースおよびターゲットのスカラー型と異なる場合は、次のように動作します (すべての組み込み Eigen 型)。

template <typename T, typename T2>
Eigen::Matrix<typename T2::Scalar,T::RowsAtCompileTime,T::ColsAtCompileTime,T::Options> 
extract2(const Eigen::DenseBase<T2>& full, const Eigen::DenseBase<T>& ind)
{
    using target_t = Eigen::Matrix < T2::Scalar, T::RowsAtCompileTime, T::ColsAtCompileTime, T::Options > ;
    int num_indices = ind.innerSize();
    target_t target(num_indices);
    for (int i = 0; i < num_indices; i++)
    {
        target[i] = full[ind[i]];
    }
    return target;
} 

(これは、int のベクトルをインデックスとして使用し、double のベクトルをソースとして使用し、上記のように int のベクトルの代わりに返される double のベクトルを取得できるという点で、他のものとは異なりますextract())

于 2014-10-08T23:26:36.117 に答える