|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Étudiant Inscription : décembre 2012 Messages : 3 ![]() |
Salut !
Je travaille pour mon projet avec un type FMatrix pour utiliser la fonction très pratique 'svd' qui décompose la matrice par la méthode SVD. Ce type est un template FMatrix<type_element, int N, int M> avec M et N les dimensions de la matrice. Dans mon programme, je fais pas mal de calculs pour obtenir un certain vecteur et ensuite je dois faire une matrice de type FMatrix<float, vecteur.size(), vecteur.size()> Le problème c'est que les éléments M et N doivent être constant dans la définition je crois, ça affiche <error-constant> et "argument template non valide pour 'Imagine::FMatrix', expression constante évaluée au moment de la compilation attendue" J'ai essayé un : const int K= v.size() mais ça marche pas plus : "'K' une variable locale ne peut pas être utilisée comme argument sans type" Comment transformer v.size() en constant ? Si vous avez une autre idée je suis preneuse aussi. Merci d'avance |
|
|
00
|
|
|
#2 | ||||
|
Membre éprouvé
![]() Étudiant Inscription : juin 2012 Messages : 266 ![]() |
Les templates sont évalués à la compilation, alors que vector.size() est évalué à l'exécution.
Tu peux t'en sortir en faisant la "traduction" à la main Code :
Code :
|
||||
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Étudiant Inscription : décembre 2012 Messages : 3 ![]() |
Je ne peux pas toucher au template puisque c'est une librairie déjà créée : Imagine.
Pour l'autre solution ça pourrait marcher mais à la main, 700 switch c'est pas gérable. Je vais voir avec les classes dont tu parles mais c'est ce que je craignais on est obligé de faire un truc compliqué... En tout cas merci |
|
|
00
|
|
|
#4 |
![]() ![]() Florian BlanchetEtudiant en Optique Inscription : août 2004 Messages : 1 061 ![]() |
Est-ce que la taille du vecteur au final est réellement déterminé à l’exécution où il l'est à la compilation ? Je ne parle pas de son remplissage, mais bien de sa tailler lorsque tu dois l'utiliser avec ta bibliothèque.
__________________
"We can solve any problem by introducing an extra level of indirection" Butler Lampson "N'importe quel problème peut être résolu en introduisant un niveau d'indirection supplémentaire" Butler Lampson (traduction libre) |
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Étudiant Inscription : décembre 2012 Messages : 3 ![]() |
Je pense effectivement qu'il est déterminé à l'exécution puisque je le construit avec le type std::vector comme ça :
vector<Match> BestMatches; for (int i=0; i<M.size();i++) { FVector<float,3> V1(M[i].x1,M[i].y1); FVector<float,3> V2(M[i].x2,M[i].y2); float distance=V1*(F*V2); if (distance<0.001) BestMatches.push_back(M[i]); } si la distance est suffisamment petite j'intègre un couple de point dans mon vecteur. Mais ensuite je crée une FMatrix<float,N,M> dont les dimensions sont là déterminées à la compilation puisqu'elles sont fixées dans le template : FMatrix<float, BestMatches.size() ,BestMatches.size()> A ; FMatrix<float,BestMatches.size(),BestMatches.size()> U; FVector<float,BestMatches.size()> S; FMatrix<float,9,9> Vt; Et c'est cette matrice à laquelle j'applique ma fonction svd: svd(A,U,S,Vt); |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com