Bonjour à toutes et à tous !
Je cherche à reduire un vecteur de matrice en une seule matrice, utilisant pour les cumuler avec un foncteur (par exemple une moyenne arithmétique, mais pas que).
En gros j'ai ces deux matrices :
et je veux :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 1 ; 2 3 ; 4 4 ; 3 2 ; 1
J'ai cherché un algo tout fait, j'ai pas trouvé, donc j'ai bricolé, donc ça marche pas, en plus d'être sans doute très peu efficace : classique and "so me".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 2.5 ; 2.5 2.5 ; 2.5
Le foncteur à appliquer à la collection de matrice accepte comme entrée un vecteur de double. Donc j'ai voulu ré-associer les valeurs en montant petit à petit une matrice de vecteurs (tempMat par la suite) qui contient toutes les valeurs que le foncteur doit moyenner.
Et je voulais ainsi utiliser l'algorithme std::transform pour faire un :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 (1 ; 4) (2 ; 3) (3 ; 2) (4 ; 1)
Mais ça ne marche pas. Quelqu'un peut me dire ce qui cloche dans le code suivant ? J'ai l'impression que le compilateur se plaint d'un typage un peu trop compliqué. Je suis censé le simplifier ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::transform(tempMat.data().begin(), tempMat.data().end(), result.data().begin(), m_averagingMethod);
Le message d'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 /home/arnaudb/Documents/SpatialCoalescent/cpp/coalescent/src/SubModelsAverager.cpp|106|error: no matching function for call to transform(boost::numeric::ublas::unbounded_array<std::vector<double>, std::allocator<std::vector<double> > >::iterator, boost::numeric::ublas::unbounded_array<std::vector<double>, std::allocator<std::vector<double> > >::iterator, boost::numeric::ublas::unbounded_array<double, std::allocator<double> >::iterator, IDimensionReductionFunction&)| /usr/include/c++/4.8/bits/stl_algo.h|4915|note: template argument deduction/substitution failed:|où m_averaging method est un attribut de la classe SubModelsAverager, et de type abstrait IDimensionReductionFunction, par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 typedef boost::numeric::ublas::matrix<double> Matrix; Matrix SubModelsAverager::AverageSubModelsOutputs(const std::vector<Matrix> & subsOut) const { assert(subsOut.empty() == false ); Matrix pattern = subsOut[0]; int size1 = pattern.size1(); int size2 = pattern.size2(); boost::numeric::ublas::matrix< std::vector<double> > tempMat(size1, size2); // to stock values waiting for means computing // iterate over the vector of matrix for(Matrix mat : subsOut) { // iterate over the whole matrix for(int i = 0; i <= size1; i++){ for(int j = 0; i <= size2; j++){ tempMat(i,j).push_back(mat(i,j)); } } } Matrix result(size1, size2); std::transform(tempMat.data().begin(), tempMat.data().end(), result.data().begin(), m_averagingMethod); return result; }
Un grand merci d'avance !!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 class WeightedArithmeticMean : public IDimensionReductionFunction { public: WeightedArithmeticMean(); WeightedArithmeticMean(const std::vector<double> & weights); virtual ~WeightedArithmeticMean(); double operator()(const std::vector<double> &x) const; protected: private: };![]()
Partager