IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Boost C++ Discussion :

std::transform sur des boost matrix


Sujet :

Boost C++

  1. #1
    Membre éclairé Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Par défaut 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 : 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 !!!

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    std::transform sert à transformer un ensemble en un autre ensemble, terme par terme.

    Tu devrais plutot jeter un oeil à std::accumulate.

  3. #3
    Membre éclairé Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Par défaut
    Merci

    J'avais jeté un coup d'oeil à accumulate. Il ne m'avait pas semblé correspondre à ce dont j'avais besoin, mais je vais re-vérifier En tout cas merci de ta réponse !

    En suivant les bons conseils récoltés par ailleurs, j'ai fini par opter pour la solution suivante. Je vais faire quelques tests pour voir si ça se comporte bien

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Matrix SubModelsAverager::AverageSubModelsOutputs(const std::vector<Matrix> & subsOut) const
    {
        assert(subsOut.empty() == false );
        int nbrOfMat = subsOut.size();
     
        Matrix pattern = subsOut[0];
        int size1 = pattern.size1();
        int size2 = pattern.size2();
        double aggtedData [size1][size2][nbrOfMat];
     
        for(int k = 0; k < nbrOfMat; k++)
        {
            Matrix mtemp = subsOut[k];
            for(int i = 0; i < size1; i++)
            {
                for(int j = 0; j < size2; j++)
                {
                    aggtedData[i][j][k] = mtemp(i, j);
                }
            }
        }
     
        Matrix result(size1, size2); // to iterate over, then to put computed means
     
        // iterate over the whole matrix
        for(int i = 0; i < size1; i++)
        {
            for(int j = 0; j < size2; j++)
            {
                std::vector<double> temp;
                for(int k = 0; k < nbrOfMat; k++)
                {
                    temp.push_back(aggtedData[i][j][k]);
                }
                result(i , j) = m_averagingMethod(temp);
            }
        }
        return result;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/03/2014, 18h59
  2. Transformée de fourrier sur des données de terrain
    Par Mikalab dans le forum Traitement du signal
    Réponses: 11
    Dernier message: 08/04/2013, 07h45
  3. Réponses: 1
    Dernier message: 05/07/2007, 14h48
  4. Transformations sur des textures
    Par WarDrone dans le forum OpenGL
    Réponses: 4
    Dernier message: 22/08/2006, 12h00
  5. Zoom sur des vecteurs ou lignes
    Par mat.M dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 25/11/2002, 10h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo