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

MATLAB Discussion :

Remplir une matrice creuse [MEX]


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Mai 2006
    Messages : 70
    Points : 39
    Points
    39
    Par défaut Remplir une matrice creuse
    J'ai un petit souci dans un MEX ou je remplis une matrice creuse. Voici le code, en C
    Code c : 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
     
    double *mxRES = NULL ; // sortie Matlab
    mwIndex *ir = NULL ;
    mwIndex *jc = NULL ;
    mwIndex entry_counter = 0 ;  // position dans la matrice
     
    [...]
     
    // creation d'une matrice creuse lmax x kmax
    plhs[0] = mxCreateSparse(lmax,kmax,Nelts, mxREAL) ;
     
    mxRES = mxGetPr(plhs[0]) ;
    ir = mxGetIr(plhs[0]) ;
    jc = mxGetJc(plhs[0]) ;
     
    for (k=0 ; k<kmax ; k++){
     
        jc[(mwIndex)(k)] = entry_counter ;   // position du 1er élément de la colonne k
     
        for (l = 0 ; l<lmax; l++){
     
            j = some_function( l,k ) ;
     
            // 'some_function' est une fonction qui renvoit un entier entre  0 et lmax-1, de telle sorte que j reste dans le bon intervalle
     
            mxRES[entry_counter] = f(l) ;   // valeur qui depend de l
            ir[entry_counter] = (mwIndex)(j) ;   //  position dans la matrice du j-eme element de la colonne k.
            entry_counter++ ;
     
        }
    }
     
    jc[ (mwIndex)(kmax) ] = entry_counter ;


    Mon problème est que la fonction 'some_function' n'est pas croissante : pour un k donnée, il se peut que j = some_function( l,k ) soit plus petit que j' = some_function( l-1,k ). Du coup la matrice H (sur laquelle pointe prhs[0], la sortie) a des propriété étrange, comme [H'*H]' =/= H'*H

    Je ne peux pas rendre 'some_function' croissante.

    Est-il possible de remplir la matrice dans un ordre de ligne non croissant ?

    Merci beaucoup

    PS j'ai posté le même message sur Mathwork

    EDIT - je crois que ma question est mal formulée. Reformulation : si, à k fixé (indice de colonne), les indices de lignes j ne sont pas croissants, est-il quand même possible de remplir une matrice creuse (avec une autre fonction peut-être...) ?

    EDIT2 - correction dans le code :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    mxRES[entry_counter] = f(l) ;   // valeur qui depend de l

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 318
    Points : 52 958
    Points
    52 958
    Par défaut
    Pourquoi ne pas faire simplement ceci ?
    • Stocker les "j" dans un tableau
    • Trier le tableau des "j"
    • Copier le tableau trié dans le tableau ir


    Grosso modo :

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for (k=0; k<kmax; k++){
     
        for (l=0; l<lmax; l++)
            j[l] = some_function(l, k);
     
        /* Tri de j ici */
     
        for (l=0; l<lmax; l++) {
            ir[entry_counter] = (mwIndex)(j[l]);
            entry_counter++;
        }
     
    }

    Ou alors j'ai mal compris ton problème.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Mai 2006
    Messages : 70
    Points : 39
    Points
    39
    Par défaut
    Salut Dut,

    D'accord avec toi là dessus : c'est un problème de tri. Cependant il faut garder en mémoire la positions des j avant triage (le rang de chaque j). Sais-tu quelle fonction C de base (dans algorithm.h par exemple) fait ce travail ?

    edit -
    je vois en quoi mon problème n'était pas clair : les valeurs que je veux mettre dans la matrice dépendent de l. Je vais corriger ça

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Tu peux utiliser une structure contenant à la fois tes valeurs à trier et tes indices.
    Tu tries alors avec qsort un tableau de cette structure en utilisant une fonction qui compare tes valeurs.
    Dernière modification par Invité ; 17/11/2013 à 20h18.

  5. #5
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 318
    Points : 52 958
    Points
    52 958
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Tu tries alors avec qsort un tableau de cette structure en utilisant une fonction qui compare tes valeurs.
    Effectivement, voir ici : Du bon usage de qsort()

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Mai 2006
    Messages : 70
    Points : 39
    Points
    39
    Par défaut
    Merci je vais tenter qsort

    j'ai implémenté mon propre algo de triage mais il a l'air de ramer... Je ne suis pas une brute en C !

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Mai 2006
    Messages : 70
    Points : 39
    Points
    39
    Par défaut
    Bon en mettant les indices de lignes j avec les valeurs f(l) dans une structure, et en triant cette structure par rapport a j, ça a l'air de marcher.

    j'ai créé une structure :

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct cone_value_idx_type
    {
        double value;
        mwIndex vol_index;
    } ;

    j'ai créé un vecteur du même type que cette structure, avec un nombre d’éléments égal au nombre d'indice j de ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<cone_value_idx_type> cone(lmax);
    je remplis le vecteur de structure

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (l = 0 ; l<lmax; l++){
        j = some_funtion(l,k)
        cone[n_cone].vol_index = j ;
        cone[n_cone].value = f(l) ;
    }
    (j'utilise un vecteur car la taille lmax varie tout le temps)

    je trie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::sort(cone.begin(), cone.end(), compare_function);
    ('compare_function' compare la partie 'value' de la structure)
    et je remplis
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (l = 0 ; l<lmax; l++){
        mxSYST[entry_counter] = cone[l].value ;
        ir[entry_counter] = cone[l].vol_index ;
        entry_counter++ ;
    }

    En gros, lorsque l'on rempli une matrice creuse avec mxCreateSparse il faut bien faire attention à remplir dans le même ordre que les indices.

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

Discussions similaires

  1. Comment remplir une matrice aléatoirement ?
    Par Hamza dans le forum Langage
    Réponses: 21
    Dernier message: 08/12/2007, 20h59
  2. Reshape d'une matrice creuse
    Par levit dans le forum MATLAB
    Réponses: 4
    Dernier message: 11/07/2007, 14h46
  3. Réponses: 2
    Dernier message: 26/06/2007, 16h40
  4. Remplir une matrice et afficher son contenu
    Par annoussa dans le forum Pascal
    Réponses: 2
    Dernier message: 08/11/2006, 12h48
  5. Remplir une matrice de variance/covariance
    Par ToTo13 dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 31/07/2006, 18h55

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