Sembra come sarebbe facile per scrivere se è solo per i vettori:
#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;
}
che dovrebbe funzionare per la maggior parte dei casi
edit: nei casi in cui il tipo di indice scalare è diverso rispetto al tipo scalare di origine e di destinazione funzionerà quanto segue (per tutti i tipi Eigen incorporati).
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;
}
(questo è diverso da l'altro in che è possibile utilizzare un vettore di interi come indici e un vettore di raddoppia come fonte e ottenere un vettore di doppie restituito al posto di un vettore di int come extract()
sopra farebbe do)
C'è qualcosa di più semplice che specificare direttamente gli indici? Hai gli elementi e i loro indici. Cos'altro vuoi? – CroCo