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: Le code ci-dessus me donne trois erreurs: p>
3 Réponses :
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 + code> sur deux
tableau code> S, avec Scalar =
Array3F de gauche CODE>, SCALAR =
FLOAT CODE> et le signale incompatible. P>
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.
Le problème est que Eigen utilise une évaluation paresseuse et que Le piratage rapide simple et rapide serait de forcer l'évaluation de la matrice annulée et d'utiliser une opération fonctionne. Avantage: rapidement implémenté. Inconvénient: Aucune évaluation paresseuse, en tant que (- array3f (5.0f)) code> 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) code> et poursuivra la réponse
array3f (5.0f, 4.0f, 3.1f) code>. .
+ code>. Pas idéal pour de nombreuses raisons, mais p>
eval () code> créera un nouveau réseau annulé. Rend également le code beaucoup plus laid. p> p>
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.
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). P>
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). p>