std::transform sur des boost matrix
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 :
Code:
1 2 3 4 5
| 1 ; 2
3 ; 4
4 ; 3
2 ; 1 |
et je veux :
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". :mouarf:
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.
Code:
1 2
| (1 ; 4) (2 ; 3)
(3 ; 2) (4 ; 1) |
Et je voulais ainsi utiliser l'algorithme std::transform pour faire un :
Code:
std::transform(tempMat.data().begin(), tempMat.data().end(), result.data().begin(), m_averagingMethod);
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 ?
Le message d'erreur :
Code:
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:| |
Code:
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;
} |
où m_averaging method est un attribut de la classe SubModelsAverager, et de type abstrait IDimensionReductionFunction, par exemple :
Code:
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:
}; |
Un grand merci d'avance !!! :)