8
votes

Utilisation d'une matrice Eigen-of-of-Tableaux pour les images RVB

J'essaie d'utiliser la bibliothèque Eigen pour un simple traitement d'image. J'utiliserais Array3F pour un triple RVB et un tableau pour contenir une image RVB. Cela semble fonctionner partiellement et je peux facilement faire des composants, la multiplication et la division des images. Mais certaines opérations (impliquant spécifiquement une soustraction ou une négation) semblent créer des erreurs de compilation. Voici un exemple minimal: xxx

Le code ci-dessus me donne trois erreurs: xxx


0 commentaires

3 Réponses :


0
votes

Je pense que Eigen n'était pas destiné à être utilisé de cette manière (avec des vecteurs comme des types "scalaires"). Je ne sais pas ce qui provoque certaines des expressions de compiler, mais pour celles qui ne le font pas, c'est parce que Eigen voit une opération + sur deux tableau S, avec Scalar = Array3F de gauche , SCALAR = FLOAT et le signale incompatible.


1 commentaires

Je ne comprends pas pourquoi cela devrait être un problème. Cette page explique les exigences relatives à l'utilisation de types scalaires personnalisés et d'une array3f elle-même semble satisfaire toutes ces exigences. Nommerez-vous 1) surcharge les opérateurs arithmétiques standard, 2) spécialise les numulations et 3) surchargent les fonctions mathématiques qui ont un sens. Notez que si je définis par sa propre classe Color3f, qui n'hérite pas d'Array3F, tout fonctionne bien. Aussi à noter, Array3F fonctionne bien pour ajouter, multiplier et diviser. Sous seulement soustraire et nier échec.



1
votes

Le problème est que Eigen utilise une évaluation paresseuse et que (- array3f (5.0f)) est en réalité une expression et non un tableau. Je ne suis pas sûr exactement ce qui manque et je n'ai pas assez de temps pour regarder ici maintenant. Avant de continuer, je dois dire qu'il n'y a pas de constructeur valide pour array3f (float) et poursuivra la réponse array3f (5.0f, 4.0f, 3.1f) . .

Le piratage rapide simple et rapide serait de forcer l'évaluation de la matrice annulée et d'utiliser une opération + . Pas idéal pour de nombreuses raisons, mais xxx

fonctionne. Avantage: rapidement implémenté. Inconvénient: Aucune évaluation paresseuse, en tant que eval () créera un nouveau réseau annulé. Rend également le code beaucoup plus laid.


2 commentaires

Notez que pour de telles petites matrices de taille fixe, une évaluation explicite n'est pas un problème car les valeurs restent dans des registres et aucune temporaire réelle n'est créée.


Cela semble être une solution de contournement insatisfaisante (même si elle est rapide). Pour le contexte: L'objectif était d'utiliser la classe Array d'Eigen en tant que conteneur pour les données de couleur dans un cadre qui sera remis aux étudiants universitaires dans le cadre d'une tâche des devoirs. Demander aux élèves d'appeler Eval () dans divers cas spéciaux suscitent probablement de nombreuses séances de confusion et de débogage frustrant.



2
votes

Si quelqu'un est intéressé: l'exemple ci-dessus compile et fonctionne bien avec Eigen 3.3RC1 (probablement quoi que ce soit depuis que Eigen 3.3-alpha est bien aussi).

Je considérerais toujours cette fonctionnalité comme expérimentale, car elle n'est ni documentée ni partie de la suite de tests (autant que je ne voie).


0 commentaires