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

Langage C++ Discussion :

Sous-matrice et std::reference_wrapper


Sujet :

Langage C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Points : 106
    Points
    106
    Par défaut Sous-matrice et std::reference_wrapper
    Bonjour à tous !

    Je suis en train de faire une classe template matrice (à la fois le type des valeurs stockées mais aussi la taille sont connus à la compilation), ce qui me donne la classe mat<T, N, M>.

    Jusque là tout va bien, les accesseurs fonctionnent.

    Maintenant je souhaite pouvoir extraire une sous-matrice. Donc pour rendre le comportement transparent sans changer l'interface ni dupliquer le code je me dis pourquoi pas stocker des std::reference_wrapper ! Problème c'est que mon algo de création de matrice à d'abord besoin d'initialiser une matrice qui sera le result, hors std::refrence_wrapper ne dispose pas de constructeur par défaut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // P et Q sont la taille de la sous matrice
    // M et N sont la taille de la matrice mère
    // sub est le nom de la fonction membre et i et j sont les indices de départs de la sous matrice
    template<size_t P, size_t Q>
    template<typename T, size_t N, size_t M>
    mat<std::reference_wrapper<T>, P, Q>
    mat<T, N, M>::sub(size_t i, size_t j)
    {
        mat<std::reference_wrapper<T>, P, Q> result; // error du ctr
     
        // some code
    }
    Avez-vous une idée pour me dépatouiller de cette situation ?

    Merci à tous !!

  2. #2
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Salut,

    Pour que reference_wrapper ait un constructeur par défaut il faudrait pouvoir assigner une valeur nulle à une référence. Or une référence possédant une valeur nulle est en fait la sémantique du pointeur. Donc tu dois passer par des pointeurs.

    Ou je viens de penser, tu pourrais toujours affecter une valeur trivial dans la liste d'initialisation et puis tous changer dans tes calculs. Ainsi la valeur nulle de ta référence devient la valeur nulle de T. C'est vrai que plus agréable de manipuler des références plutôt que des pointeurs. Je suis pas sûre d'être clair alors vite fait un petit exemple pour montrer ce que j'ai en tête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    T dummy;
    matrice<...> m = {dummy};
     
    // Modifier m...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Points : 106
    Points
    106
    Par défaut
    Merci pour la réponse !

    C'est actuellement la solution que j'essaye. Par contre je sais pas comment faire en sorte que le paramètre "dummy" se répète N*M fois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    T dummy;
     
    matrice<std::reference_wrapper<T>, N, M> m(dummy, dummy, dummy, /*... N*M fois */);
    Je pense que c'est possible à base de template mais là je sèche completement.
    Peut-être du côté de boost::mpl.

    Merci encore !

  4. #4
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Honnêtement j'en sais pas plus que toi à ce niveau là.

    Par contre je pense que ta technique n'est pas la meilleur, quoi qu'on en dise tu vas quand même créer N*M pointeurs via les références, ce qui n'est pas super.

    Je pense que tu ferais mieux de passer par une classe intermédiaire qui fournit une vue de ta matrice telle que :

    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
    class matrix_view
    {
      matrix& m;
      int i;
      int j;
     
    public:
      matrix_view(int i, int j): i(i), j(j){}
     
      // Remapping sur la matrice d'origine.
      T& operator[](int a, int b)
      {
        return m.at(..., ...);
      }
    };
    (Template et calcul non montré par paresse).

    T'auras 2, 3 opérations mathématiques en plus mais au moins tu sauvegarderas de la place vu que tu passes de N*M pointeurs à 1 pointeur vers la matrice d'origine. Et dans ta fonction sub tu retournes cette classe, à toi de te débrouiller pour qu'elle respecte plus ou moins la même interface qu'une matrice.

    PS: Je viens d'aller voir dans Boost et c'est comme ça qu'ils font : http://www.boost.org/doc/libs/1_54_0...#61Description
    Inspire toi en ou mieux, utilise les si tu peux

Discussions similaires

  1. [hard] sous-matrice nulle
    Par Nemerle dans le forum Langages fonctionnels
    Réponses: 9
    Dernier message: 07/03/2008, 07h58
  2. Calcul de transposées de sous-matrices
    Par hanane78 dans le forum MATLAB
    Réponses: 1
    Dernier message: 10/05/2007, 21h37
  3. Division d'une matrice en sous matrices
    Par hanane78 dans le forum MATLAB
    Réponses: 4
    Dernier message: 02/05/2007, 18h15
  4. Liste des sous-matrices carrées
    Par potimarara dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 12/10/2006, 18h30
  5. Sous matrice carrée d'une matrice carrée
    Par devils55 dans le forum C++
    Réponses: 2
    Dernier message: 13/11/2005, 19h07

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