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 :

Création d'une structure récursive automatique


Sujet :

MATLAB

  1. #1
    Futur Membre du Club Avatar de Montessusdeballore
    Femme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : Chili

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Création d'une structure récursive automatique
    Bonjour a tous,

    J'ai un petit soucis algorithmique que je n'arrive pas à résoudre proprement. Le problème est assez simple à énoncer, je voudrais construire une "structure" matlab fonctionnant comme tel à partir d'un ensemble de cellules de tailles différentes, de manière à ce que matlab reconnaisse les champs identique et construise une arborescence automatiquement. Ce sera plus clair avec ce bout de code exemple:

    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
    19
     
    A{1} = {'chp1' ; 'chp2' ; 'chp3' ; 'chp4'};
    A{2} = {'chp1' ; 'chp2' ; 'chp5'};
    A{3} = {'chp1' ; 'chp2' ; 'chp3' ; 'chp6' ; 'chp7' ; 'chp8'};
     
    S = struct ;
    for i=1:length(A)
        if size(A{i},1)==2  ;
            S.(A{i}{1}).(A{i}{2})='valeurquelconque' ;
        elseif size(A{i},1)==3  ;
            S.(A{i}{1}).(A{i}{2}).(A{i}{3})='valeurquelconque' ;
        elseif size(A{i},1)==4  ;
            S.(A{i}{1}).(A{i}{2}).(A{i}{3}).(A{i}{4})='valeurquelconque' ;
        elseif size(A{i},1)==5  ;
            S.(A{i}{1}).(A{i}{2}).(A{i}{3}).(A{i}{4}).(A{i}{5})='valeurquelconque' ;
        elseif size(A{i},1)==6  ;
            S.(A{i}{1}).(A{i}{2}).(A{i}{3}).(A{i}{4}).(A{i}{5}).(A{i}{6})='valeurquelconque' ;
        end
    end
    Ce code me permet de lire les infos de champ dans ma cellule A, puis créer une structure S contenant l'arborescence de ces même champs. Le problème que l'on voit clairement est qu'en plus d'être une solution particulièrement laide, si A{4} par exemple contient 26 champs, cette méthode brute devient ingérable....
    J'ai essayé un certain nombre de choses à base de "eval", "setfield", "getfield", et autres "subasgn", mais rien n'y fait, je n'arrive pas à incrémenter mon "nombre de couple père/fils" de manière automatique...

    Y-a-t-il une solution à ce problème, ou ceci correspond-t-il à une limitation "sémantique" de matlab...?
    Merci beaucoup de votre aide/opinion!

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    je ne connais pas matLab mais un truc dans ce genre là
    je te donne l'idée générale
    je pense que cela devrais faire l'affaire

    Bon concat => c'est pour concaténer des chaînes de caractère
    et le format c'est pour renseigner les %d par les valeur respective de i et j

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     For  i=1:length(A)
        st = 'S'
        for j=1:size(A{i},1)
          st = Concat(st,Format('.(A{%d}{%d})',[i,j])
        end
        st =Concat(st,'="valeurquelconque"');
        Eval(st)
     end
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  3. #3
    Futur Membre du Club Avatar de Montessusdeballore
    Femme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : Chili

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Salut Anapurna,

    Merci de me sortir de ma solitude ^^
    En effet c'est une solution que j'avais exploré, construire la chaîne de caractère type " chp1.chp.2.chp3 " et faire un "eval" de celle-ci, mais malheureusement c'est justement un cas ou la syntaxe de matlab ne reconnais pas le "." comme un fonctionnement en structure... Bref excellente idée mais dans l'absolue ne fonctionne pas...

    Il y a peut-être un lieu plus approprié pour ce poste, un forum plus matlab ou problèmes de syntaxe....

    Merci de ton aide en tout cas

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    il existe un forum Mathlab ... regarde sous le menue EDI
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 054
    Points : 9 394
    Points
    9 394
    Par défaut
    @ anapurna

    Apparemment, tu as compris la question, tu pourrais la reformuler en langage clair ?
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    @ anapurna

    Apparemment, tu as compris la question, tu pourrais la reformuler en langage clair ?


    il veut pouvoir construire (creer) une structure de façon itérative
    si j'ai bien tout compris cela devrais ressembler à une matrice creuse ou un arbre

    dans son exemple
    si tu prend la premiere declaration de son tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A{1} = {'chp1' ; 'chp2' ; 'chp3' ; 'chp4'};
    il veut donc construire une structure(arbre ou matrice creuse)
    sous cette Forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      S.(A{1}{1}).(A{1}{2}).(A{1}{3}).(A{1}{4})= 'valeurquelconque'
    je lui est donc proposé de construire ses ligne avec deux itération et de faire un eval du résultat
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  7. #7
    Futur Membre du Club Avatar de Montessusdeballore
    Femme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : Chili

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    @anapurna
    C'est ça ^^

    Construire une arborescence complexe à partir de cellules contenant les données "père/fils", typiquement ce que fait la fonction "XMLread" de matlab lorsqu'elle a à faire à un fichier xml.
    Finalement c'est un peu comme essayer de reconstruire un fichier xml à partir de données non-organisées...

  8. #8
    Membre confirmé
    Homme Profil pro
    Éternel universitaire
    Inscrit en
    Avril 2012
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éternel universitaire

    Informations forums :
    Inscription : Avril 2012
    Messages : 421
    Points : 639
    Points
    639
    Par défaut
    Salut,

    C'est une question que je m'étais également posé. J'avais toujours fini par trouvé une alternative mais j'ai trouvé cette fois ci une réponse en fouillant un peu sur le net.

    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
    function s = setsubfield(s, fields, val)
     
    if ischar(fields)
        fields = regexp(fields, '\.', 'split'); % split into cell array of sub-fields
    end
     
    if length(fields) == 1
        s.(fields{1}) = val;
    else
        try
            subfield = s.(fields{1}); % see if subfield already exists
        catch
            subfield = struct(); % if not, create it
        end
        s.(fields{1}) = setsubfield(subfield, fields(2:end), val);
    end
    end
    qui s'utilise très simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A{1} = {'chp1' ; 'chp2' ; 'chp3' ; 'chp4'};
     s = struct();
     s = setsubfield(s, A{1}, 'obladi oblada');
    Donc cette méthode fonctionne bien, mais je ne sais pas si ça "devrait être fait". Si ta structure est compliquée à construire, ça veut également dire que les données qu'elle contient seront difficile à extraire.

  9. #9
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    en y reflechissant un peu mathlab utilise des matrice est pas des arbre
    donc tu auras forcement une matrice du type
    MAT[n,m]
    le plus simple ne serait il pas de construire ta matrice maximum et ensuite renseigner
    les éléments qui t’intéresse
    pour la création de matrice creuse il existe une fonction du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    AC = sparse(1000,2000)
    AC = All zero sparse: 1000-by-2000
    Il est ensuite possible de mettre des valeurs aux positions souhaitées. On remarquera que le résultat
    affiché comporte à la fois la position et la valeur des éléments non nuls :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        AC(23,54)=1
        AC = (23,54) 1
    dans ton cas je verrais donc un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    j =0;
    for  i=1:length(A)
        if  j > size(A{i},1)
            j  =  size(A{i},1)
        end
    end
     
    AC = sparse(length(A),j)
    for  i=1:length(A)
        AC(i,size(A{i},1)) = MaValeur
    end
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  10. #10
    Futur Membre du Club Avatar de Montessusdeballore
    Femme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : Chili

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    @thecrazydonut

    Excellent!! Merci bien, c'est exactement ce que je désespérais de pouvoir trouver!!

    @Anapurna

    Interressant ^^. Le fonctionnement en structure de matlab reste assez pratique pour travailler avec des arbres de données, un peu plus qu'en passsant par des matrices.

    Merci à vous deux
    ; )

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 26/07/2011, 14h20
  2. [MySQL] Requête SQL pour charger une structure récursive
    Par FMaz dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 19/07/2009, 05h00
  3. Création d'une structure dynamique
    Par jbat dans le forum API, COM et SDKs
    Réponses: 17
    Dernier message: 14/04/2008, 15h55
  4. création d'une requete récursive
    Par alex.daval dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/03/2008, 11h50
  5. Réponses: 20
    Dernier message: 11/07/2006, 17h11

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