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

Qt Discussion :

Comment utiliser QGenericMatrix::data ()


Sujet :

Qt

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 88
    Points : 64
    Points
    64
    Par défaut Comment utiliser QGenericMatrix::data ()
    eh salut, encore une question débile
    La fonction data() de QGenericMatrix est censé me renvoyer un pointeur vers le début des données

    T * QGenericMatrix::data ()

    Returns a pointer to the raw data of this matrix.
    Or quand je pointe un tableau sur cette adresse il arrive pas qu'à récupérer les données .
    Petite illustration avec un bout de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    QGenericMatrix<3,151,double>  matData;
    //Remplissage de la matrixGenerique
    for (int i = 0 ; i < 151 ; i++)
    	{
    		matData.fill(mat[i][0]);
    		matData.fill(mat[i][1]);
    		matData.fill(mat[i][2]);
    	}
    //déclaration d'un tableau 
    double *mat = (double*)malloc(151*3*sizeof(double));
    mat = matData.data();
    Une idée ? merci d'avance

    Rq : Aucun dépassement n'est signalé lors de la compilation.donc du coté de l'allocation dynamique aucun souci

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QGenericMatrix<3,151,double>  matData;
    Tu déclares et initialises ici ta matrice : Ok

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (int i = 0 ; i < 151 ; i++)
    {
    	matData.fill(mat[i][0]);
    	matData.fill(mat[i][1]);
    	matData.fill(mat[i][2]);
    }
    Ici, tu utilises la function "fill" qui remplit toute la matrice avec une valeur. Donc appeler 3 fois cette fois ne sert à rien : ton premier et ton second remplissage seront "écrasé" par le troisième.

    De plus, tu essaies de remplir avec une valeur provenant de ta variable "mat"... qui sera définit à la ligne suivante ! Donc ça risque de ne pas marcher.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double *mat = (double*)malloc(151*3*sizeof(double));
    Ici, tu déclares ta variable "mat" (utilisée à la ligne précédante) et tu l'initialise en affectant un nouveau bloc mémoire créé avec malloc. Première remarque : tu oublies vite malloc ! C'est du C et pas du C++ et ce n'est pas très sur (surtout si tu ne maitrise pas : en l'occurrence, tu as une fuite mémoire ici). Deuxième remarque : tu créés "mat" pour récupérer tes données (càd pour lui donner l'adresse du premier élément de la matrice). Pourquoi lui affecter des données avant ?

    Là, ça va. Mais...

    Pourquoi veux tu accéder aux données de la matrice directement avec data() (avec les problèmes que cela comporte, en particulier la nécessité de jouer avec les pointeurs pour accéder aux données) ?
    Tu peux utiliser directement les opérateurs () :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    matData(x,y) = 50.0;
    cout << matData(x,y);

    EDIT : un peu de code pour montrer comment lire et écrire :
    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 <iostream>
    #include <QGenericMatrix>
     
    int main(int argc, char *argv[])
    {
        QGenericMatrix<3,3,double>  matData;
     
        for(int i=0; i<3; ++i)
            for(int j=0; j<3; ++j)
                matData(i,j) = i+3*j;
     
        for(int i=0; i<3; ++i)
        {
            for(int j=0; j<3; ++j)
                std::cout << matData(i,j) << " ";
            std::cout << std::endl;
        }
    }

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 88
    Points : 64
    Points
    64
    Par défaut
    pour fill() au temps pour moi !! ->

    et pour :
    De plus, tu essaies de remplir avec une valeur provenant de ta variable "mat"... qui sera définit à la ligne suivante ! Donc ça risque de ne pas marcher.

    Code :

    double *mat = (double*)malloc(151*3*sizeof(double));

    Ici, tu déclares ta variable "mat" (utilisée à la ligne précédante) et tu l'initialise en affectant un nouveau bloc mémoire créé avec malloc. Première remarque : tu oublies vite malloc ! C'est du C et pas du C++ et ce n'est pas très sur (surtout si tu ne maitrise pas : en l'occurrence, tu as une fuite mémoire ici). Deuxième remarque : tu créés "mat" pour récupérer tes données (càd pour lui donner l'adresse du premier élément de la matrice). Pourquoi lui affecter des données avant ?
    ==>
    C'est mat2 et non pas mat que je voulais écrire (c'est juste une erreur de frappe)
    et sinon pour répondre à ta question :

    Pourquoi veux tu accéder aux données de la matrice directement avec data() (avec les problèmes que cela comporte, en particulier la nécessité de jouer avec les pointeurs pour accéder aux données) ?
    ben au faite comme QGenericMatrix ne dispose pas de fonction qui permet de donner l'inverse d'une matrice (supé à 4 ) alors j'ai décidé de récupérer les données .Leurs appliqué un traitement pour avoir la matrice inverse ensuite remettre tout ça dans un QGenericMatrix .
    S'il ya une autre solution je suis preneur !
    Cela dit j'ai une question : alors comment fait-on pour remplir une matrice avec des données !

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    S'il ya une autre solution je suis preneur !
    Tu dois accéder avec l'opérateur (x,y) (cf EDIT de mon post précédant).

    Il te faudra aussi ajouter le calcul du déterminant.

    Petite remarque : si tu veux inverser une matrice, ne prend pas une matrice 3*151 comme dans ton exemple... il faut une matrice carrée.

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 88
    Points : 64
    Points
    64
    Par défaut
    Ok d'accord merci .l'accés est OK
    cela dit j'ai pas vraiment le choix je dispose pas de matrice carrée !!
    Tu peux expliquer
    Il te faudra aussi ajouter le calcul du déterminant.

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    Ok, c'est un peu ce que je craignais : tu ne connais pas le calcul matriciel, non ? (et tu débutes aussi en C++/Qt ?)

    Que souhaites tu faire avec des matrices ?

    Si tu débutes, ne pars-tu pas dans un "bidule" trop compliqué ?

    Le mieux est encore d'utiliser une lib existante qui fait déjà de l'inversion de matrice.

    Sinon, regarde sur internet avec "c++ matrice inversion" et "gsl matrix inversion" par exemple pour avoir du code.

    PS : pour info, une matrice est inversible uniquement si elle est carrée (en autre), càd du type n*n.

  7. #7
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 88
    Points : 64
    Points
    64
    Par défaut
    Je peux pas dire que je connais pas puisque j'ai passé das tas d'exams dessus .Sauf que je retiens jamais !!!
    pour les lib j'ai déja essayé et c'est un peu compliquer avec tout ces templates .
    sinon wé justement j'ai du code .. donc ça devrait le faire !

    PS : pour info, une matrice est inversible uniquement si elle est carrée (en autre), càd du type n*n.
    Faudra que je vois ça avec mon prof !!
    encore merci

  8. #8
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 88
    Points : 64
    Points
    64
    Par défaut
    Une dernière chose .
    Si tu déclares un pointeur sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QGenericMAtrix<50,50,double> *Ex ;
    , comment accédera-tu en lecture et en écriture aux données !!!

    ps : Effectivement la matrice doit être carrée pour avoir son inverse

Discussions similaires

  1. Comment utiliser SQL Developper Data Modler sans workspace ?
    Par Nadinette dans le forum Sql Developer
    Réponses: 0
    Dernier message: 12/12/2012, 10h34
  2. Comment utiliser le data environement
    Par haddouda dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 01/06/2010, 12h08
  3. Réponses: 2
    Dernier message: 15/06/2009, 08h59
  4. Comment utiliser les Data Modelers
    Par mqsi dans le forum Rational
    Réponses: 2
    Dernier message: 18/10/2005, 12h28
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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