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 :

Boost.uBlas et sous-vecteur de matrice


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    Avril 2008
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : Avril 2008
    Messages : 190
    Par défaut Boost.uBlas et sous-vecteur de matrice
    Bonjour à tous !

    Je cherche à accéder à un sous-vecteur d'une matrice en utilisant uBlas de Boost et je ne m'en sors pas avec les matrix_vector_range. Pour montrer mon problème, prenons un exemple simple :

    Soit la matrice suivante :

    | 0 1 2 |
    | 3 4 5 | = M
    | 6 7 8 |

    Je cherche à obtenir le sous-vecteur de la deuxième colonne, de la ligne 2 à la ligne 3, c'est-à-dire :

    v = (4 ; 7)

    Il me semble que ce qui est approprié pour ce faire est la structure matrix_vector_range. J'ai donc fait le code suivant :

    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
     
    #include <boost/numeric/ublas/matrix.hpp>
    #include <boost/numeric/ublas/matrix_proxy.hpp>
    #include <boost/numeric/ublas/io.hpp>
     
    int main (int argc, char **argv) {
      using namespace boost::numeric::ublas;
     
      matrix<double> M (3, 3);
      for (unsigned i = 0; i < M.size1(); ++i)
        for (unsigned j = 0; j < M.size2(); ++ j)
          M(i, j) = 3 * i + j;
     
      matrix_vector_range<matrix<double> > v (M, range (1, 3), range (1, 1));
      std::cout << v << std::endl;
     
      return 0;
    }  // main
    Tout compile sans problème. Par contre, j'obtiens le résultat suivant à l'exécution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Assertion failed in file /usr/include/boost/numeric/ublas/matrix_proxy.hpp at line 970:
    size1 == size2
    Donc, visiblement, je m'emmêle les pinceaux dans l'utilisation de range. Le seul truc, c'est que je n'arrive pas à comprendre comment je devrais m'y prendre normalement. Est-ce que quelqu'un à une idée ?

    À bientôt.

    Le Farfadet Spatial

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Telles que je comprends les choses, range (1, 1) est un range vide...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre éclairé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    Avril 2008
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : Avril 2008
    Messages : 190
    Par défaut
    Salut à tous !

    En effet, range (1, 1) est un range vide. Cependant, en fait, ce n'est pas le code que j'avais tapé, toutes mes excuses. Voici donc le code corrigé :

    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
     
    #include <boost/numeric/ublas/matrix.hpp>
    #include <boost/numeric/ublas/matrix_proxy.hpp>
    #include <boost/numeric/ublas/io.hpp>
     
    int main (int argc, char **argv) {
      using namespace boost::numeric::ublas;
     
      matrix<double> M (3, 3);
      for (unsigned i = 0; i < M.size1(); ++i)
        for (unsigned j = 0; j < M.size2(); ++ j)
          M(i, j) = 3 * i + j;
     
      matrix_vector_range<matrix<double> > v (M, range (1, 3), range (1, 2));
      std::cout << v << std::endl;
     
      return 0;
    }  // main
    Enfin, « corrigé » est un bien grand mot, vu qu'il produit la trace d'exécution donnée dans mon premier message.

    À bientôt.

    Le Farfadet Spatial

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Après quelques tests, il semblerait que le vecteur qu'il essaye d'extraire est le vecteur diagonal de la sous matrice définie, qui doit donc du coup être carrée, ce qui n'est pas ton cas.

    Pour ce que tu veux, je partirais plus vers soit un matrix_range de dimention 1*n, soit un vector_range issu d'un matrix_row.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre éclairé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    Avril 2008
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : Avril 2008
    Messages : 190
    Par défaut
    Salut à tous !

    Oups ! Toutes mes excuses pour n'avoir pas posté dans la bonne section.

    Citation Envoyé par JolyLoic Voir le message
    Pour ce que tu veux, je partirais plus vers soit un matrix_range de dimention 1*n, soit un vector_range issu d'un matrix_row.
    Très bien, mauvais choix de ma part. Au niveau performances, que me conseillerais-tu entre un matrix_range et un vector_range issu d'un matrix_row ?

    À bientôt.

    Le Farfadet Spatial

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Aucune idée, je n'ai pas une expérience pratique de cette bibliothèque...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 05/10/2011, 08h59
  2. Réponses: 8
    Dernier message: 18/05/2007, 17h33
  3. [BOOST] utilisation de boost uBLAS non compile avec visual c++
    Par le_voisin dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 06/09/2006, 22h03
  4. Boost et Jamfile sous Eclipse
    Par afec++ dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 04/07/2006, 14h25
  5. probleme boost::ublas
    Par p_moiret dans le forum Bibliothèques
    Réponses: 4
    Dernier message: 19/12/2005, 16h10

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