Sous-matrices et indices utilisant Eigen

je travaille actuellement sur un projet MATLAB et j'aimerais ré-implémenter les pièces les plus computationnelles en utilisant C++ et Eigen. J'aimerais savoir s'il y a un moyen d'effectuer l'opération suivante (syntaxe MATLAB):

B = A(A < 3);

pour ceux qui ne sont pas familiers avec MATLAB, la commande mentionnée ci-dessus initialise une matrice B faite des cellules dans A dont les valeurs sont inférieures à 3.

j'ai vu partir un post sur le eigen forum qu'il est possible de obtenir les indices d'intérêt en utilisant:

MatrixXi indices = (A.array() < 3).cast<int>();

Ce que j'aimerais avoir, c'est quelque chose comme:

MatrixXd B = A(A.array() < 3);

Merci.

15
demandé sur m7913d 2012-11-24 13:57:32

4 réponses

il y a actuellement un requête de fonctionnalité pour la sélection de sous-matrices par indexation déposée au système BugTracker D'Eigen. Par conséquent, je doute que ce soit possible de cette façon.

La seule solution que je pouvais penser est de copier les données manuellement. Pas très agréable.

5
répondu Thilo 2012-11-24 10:46:30

libigl a beaucoup d'emballages pour Eigen pour le faire se sentir plus comme MATLAB. En particulier, il y a un slice fonction de sorte que vous pouvez appeler:

igl::slice(A,indices,B);

qui est l'équivalent de MATLAB's

B = A(indices)
10
répondu Alec Jacobson 2013-09-14 21:21:19

vous pouvez effectuer des opérations sur des éléments sélectionnés seulement avec select(), qui est l'équivalent pour le ternaire ?: opérateur. Ce n'est pas exactement ce que tu voulais, mais devrait fonctionner dans de nombreux cas.

MatrixXd B = (A.array() < 3).select(operation_on(A), MatrixXd::Zero(A.rows(), A.cols()));

ceci remplira B avec des zéros si A<3 et le résultat de n'importe quelle opération requise sur A autrement.

4
répondu Sameer 2014-05-12 19:44:49

le dernier développement disponible sur la branche principale d'Eigen permet de travailler avec des indices numériques.

Ici est une requête similaire, qui montre un exemple d'indexation numérique

0
répondu Guillaume Jacquenot 2018-09-16 21:35:03