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 :

initialisation et rotation de matrice 2D


Sujet :

Boost C++

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Par défaut initialisation et rotation de matrice 2D
    Bonjour,

    Je viens de découvrir boost, je l'ai téléchargé et je compile un hello word,
    un hello matrix plus exactement.

    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
     
    #include <boost/numeric/ublas/matrix.hpp>
    #include <boost/numeric/ublas/io.hpp>
     
    int main () {
     
        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;
     
     
        std::cout << m << std::endl;
     
    }
    Je voudrais juste faire la rotation d'une matrice 2D. Je patauge tellement que je me demande si j'ai bien compris à quoi sert cette librairie.

    Est ce que boost permet de faire ce type de rotation comme on pourrait le faire avec une image?

    Je veux insérer cette rotation dans une chaine de calculs. Mes données sont stockées dans un double pointeur que je réserve comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int height = 100;
    int width = 200;
    long int newSurface = height * width;
     
    float ** ppOutputFlt = new float*[height];
    ppOutputFlt[0] = new float[newSurface];
    for (int index = 1 ; index < height ; ++index) ppOutputFlt[index] = ppOutputFlt[index-1] + width;
    float *pOutputFlt = ppOutputFlt[0];
    Je peux ainsi atteindre les données par la position (ppOutputFl[yIndex][xIndex]) ou parcourir le tableau d'une traite (pOutputFlt[index])

    Afin d'optimiser le temps de traitement, (calculs itératifs), est il possible d'initialiser une matrix boost en passant directement mon pointeur de float sans faire une copie élément par élément de mon tableau?

    Merci de m'aider à démarrer avec cette librairie

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par winzzz Voir le message
    Afin d'optimiser le temps de traitement, (calculs itératifs), est il possible d'initialiser une matrix boost en passant directement mon pointeur de float sans faire une copie élément par élément de mon tableau?
    Je n'ai qu'un très lointain (et mauvais) souvenir des matrices de boost... à l'époque elles étaient certes pratiques, certes portables, mais mauvaises en tout... Je veux dire par là, très lentes (trop?) pour des petites matrices (<10x10), pas du tout optimisées pour de grosses matrices à trous (> 100x100), en bref, elle n'étaient qu'une aide au développement.

    Du coup, on avait fait une classe matrix3x3 qui *utilisait* une matrice boost pour pouvoir avancer, et qu'on a remplacé par quelque chose de plus adapté par la suite (positionnement 2D)...


    Pour en revenir à ton problême... tu parles
    Je voudrais juste faire la rotation d'une matrice 2D.
    Ai-je bien compris ? tu parles de vouloir échanger les colonnes et les lignes quoi ? Dans ce cas il suffit d'utiliser les indices (X,Y), (Y,n-X-1), (n-X-1,n-Y-1) ou (n-Y-1,X) ... Il n'y a pas beaucoup de rotations de matrices possible...

    Si boost stocke les valeurs dans un sens, il n'y a pas beaucoup d'optimisations possibles....

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Par défaut
    Je suis un peu surpris par ta réponse car je croyais que boost était une librairie destinée à devenir un standard super optimisé.

    Si on oublie l'histoire de l'initialisation, je veux effectivement faire une rotation de x degrés du contenu de ma matrice.

    Je suis parti tête baissée à la recherche d'une méthode du type rotate(float angle) dans boost mais je ne crois pas que ça marche comme ça.

    J'ai de vagues souvenir de maths où il était question de faire le produit d'une matrice du type (trouvé sur wykipedia):

    1 0 0
    0 cos -sin
    0 sin cos

    par la matrice source. Comment ça fonctionne sous boost?

    Si la librairie boost n'est pas optimisée pour faire ce genre de calcul, peux tu m'en conseiller une autre.

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Ce que je voulais dire, c'est que faire une rotation de matrice n'a pas vraiment de sens, le résultat n'étant une matrice que pour des rotations de 90, 180 et 270 degrés !
    Et pour ces rotations, la symétrie est ton amie.

    Par contre, l'exemple de matrice que tu donne est une matrice de rotation... Ca n'a rien à voir...

    V1/V2 étant des vecteurs, V2 = M x R x V1 ... MxR n'est pas une matrice dont les éléments on tournés, mais dont les élements incluent la rotation R...

    Pour le positionnement 2D, en général on utilise les vecteurs V1 = (x,y,0) ou les points (x,y,1) en combinaison avec des matrices 3x3.

    Ensuite tout dépend si tu utilises une notation de vecteur "par ligne" ou "par colonne"... Je preferes la notation par ligne qui est plus "naturelle":
    Dans ce cas: V2 = V1 x M

    Une rotation s'exprime alors par:
    cos(a) -sin(a) 0
    sin(a) cos(a) 0
    0 0 1

    Une translation par:
    1 0 0
    0 1 0
    dx dy 1

    etc...

  5. #5
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Il y'a blitz++ qui est spécialisé dans les matrices

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Boost.uBlas c'est pour faire de l'algèbre linéaire, c'est à dire des opérations sur des vecteurs et des matrices.
    Il n'y a pas de notion d'espace ou d'angle. Ça n'a pas de sens. Si tu veux faire une rotation au niveau algèbre linéaire, ça se représente par une multiplication par une matrice particulière.

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Par défaut
    Merci pour vos réponses, ce petit rappel de maths m'a rafraichi la mémoire.

    je m'en sors en "convertisant" les indexes de ma matrice courante en une position cartésienne. J'applique la rotation sur cette position puis retour à un espace "image" (centré en top left).

    J'obtiens ainsi pour un index x,y donné la position correspondante -theta- degrés plus loin.

    Enfin si le nouvel indexe est valide, je copie le contenu de la source vers la destination.

    Merci aussi pour l'info blitz++, je mets de coté. Je travaille avec Qt et je vais m'en sortir avec QMatrix.

Discussions similaires

  1. Rotation de matrice (tableaux)
    Par Aure7780 dans le forum Algorithmes et structures de données
    Réponses: 19
    Dernier message: 12/01/2012, 11h00
  2. Decomposition matrice de rotation
    Par harsh dans le forum Mathématiques
    Réponses: 5
    Dernier message: 24/09/2010, 15h16
  3. Rotations et matrices
    Par Jimalexp dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 20/01/2009, 20h27
  4. [Débutant]maths et matrices de rotation ...
    Par ptidrone dans le forum DirectX
    Réponses: 7
    Dernier message: 21/07/2004, 17h00
  5. matrice et rotation
    Par charly dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 07/12/2002, 17h59

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