J'ai lu dans les documents Eigen (http://eigen.tuxfamily.org/index.php?title=Pit_Falls#Ternary_operator) que Eigen ne joue pas bien avec les opérations ternaires; c'est certainement mon expérience. Ce que j'essaie de faire est de construire un tableau basé sur plusieurs drapeaux booléens, les drapeaux use_XXX
dans mon extrait ci-dessous. Je sais qu'au moins un des drapeaux est vrai d'une vérification avant, mais je ne peux pas obtenir ce bloc pour compiler. Voici d'autres options que j'ai essayé qui ne fonctionnent pas:Mélange des opérations ternaires et des rangées Eigen
Construct les 2^4 = 16 possibilités logiques pour
umat
en utilisant quelque chose comme des masques de bits - le code finit par bavard et difficile à maintenir; beurk ...Initialiser
umat
à zéro, puis boucle sur les conditionals, en faisant la soustraction inplace - c'est tout à fait un peu plus lent que la somme unique lorsque je commente manuellement termes
Une autre idée Était d'essayer de multiplier l'expression par le drapeau, dans l'espoir qu'Eigen utiliserait sa magie de modèle pour comprendre quoi faire, mais cela n'a pas fonctionné non plus, puisque dans mon cas je n'initialise pas le tableau si je fais ne l'utilisez pas (code très performant dans cette boucle)
umat = (
(use_gauss_delta ? -coeffs.eta*delta_minus_epsilon.square() : 0)
+
(use_delta_ld ? -coeffs.cd*delta_to_ld : 0)
+
(use_gauss_tau ? -coeffs.beta*tau_minus_gamma.square() : 0)
+
(use_tau_lt ? -coeffs.ct*tau_to_lt : 0)
)
);
EDIT
J'ai aussi essayé la fonction select
qui fonctionne, mais qui est très lent. Chacun des mask_XXX sont Eigen::ArrayXi
, et tous les autres sont Eigen::ArrayXd
umat = (
mask_gauss_delta.select(-coeffs.eta*delta_minus_epsilon.square(),0)
+
mask_delta_ld.select(-coeffs.cd*delta_to_ld,0)
+
mask_gauss_tau.select(-coeffs.beta*tau_minus_gamma.square(),0)
+
mask_tau_lt.select(-coeffs.ct*tau_to_lt,0)
);
Dans la déclaration ternaire '(: )', 'la fois ' et '' doivent avoir le même type. Ce n'est pas seulement une curiosité d'Eigen. Par exemple '(quoi? 1.0:" abc ")' ne fonctionnerait pas non plus avec l'erreur 'types d'opérandes incompatibles ('double' et 'const char *')'. –
Malheureusement, dans votre cas, il est impossible de dire quels types ont les opérandes puisque vous n'avez pas réussi à publier [Exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve). –
Oui, désolé je connais les joies des exemples non-MVE. À la fin, je suis allé pour la solution choisie. Il s'est avéré ne pas être beaucoup plus lent, grâce à la magie interne d'Eigen. – ibell