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.
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.
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)
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.
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