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 : Sélectionner tout - Visualiser dans une fenêtre à part
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".

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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
(1 ; 4) (2 ; 3)
(3 ; 2) (4 ; 1)
Et je voulais ainsi utiliser l'algorithme std::transform pour faire un :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
 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 : 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:|
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;
}
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
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 !!!