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 averti 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
    Points : 341
    Points
    341
    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 !!!
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    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 186
    Points : 17 126
    Points
    17 126
    Par défaut
    std::transform sert à transformer un ensemble en un autre ensemble, terme par terme.

    Tu devrais plutot jeter un oeil à std::accumulate.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre averti 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
    Points : 341
    Points
    341
    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;
    }
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/03/2014, 19h59
  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, 08h45
  3. Réponses: 1
    Dernier message: 05/07/2007, 15h48
  4. Transformations sur des textures
    Par WarDrone dans le forum OpenGL
    Réponses: 4
    Dernier message: 22/08/2006, 13h00
  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, 11h40

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