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

Interfaces Graphiques Discussion :

Afficher de resultat d'un "whos"


Sujet :

Interfaces Graphiques

  1. #1
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Points : 102
    Points
    102
    Par défaut Afficher de resultat d'un "whos"
    Bonjour,

    je travaille sur une interface GUI. Je propose a l'utilisateur de loader une variable matlab. Pour cela il choisit dans les repertoires le fichier Matlab, et donne le nom de la variable en question.
    Ce que j'aimerai faire c'est qu'a chaque fois qu'il choisit un fichier matlab, s'affiche dans un certain champ le résultat que Matlab aurait donné lors d'un whos('-file', 'monfichier.mat').

    J'ai reussit a faire afficher le resultat si je fais un simple 'who' (et donc je n'ai que le nom des variables) mais j'aimerai avoir aussi les données bytes, class et size.
    donc j'ai fait 4 champs texte, pour y faire apparaitre les 4 champs du whos.
    Ca ne marche que dans le cas ou il n'y a qu'une seule variable dans le fichier .mat, et dans ce cas pour le champ size, chaque dimension est sur une nouvelle ligne.

    Comment puis-je faire ca mieux? (et surtout plus simplement, juste afficher le whos dans une grand champ text ou edit).



    voici le bout de code important, celui ou l'utilisateur appuie pour selectionner son fichier:
    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
    20
    21
    22
    23
    % --- Executes on button press in browsefile.
    function browsefile_Callback(hObject, eventdata, handles)
    % hObject    handle to browsefile (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Browse matlab file 
    start_path = get(handles.filename,'String');
     
    [filename,pathname] = uigetfile({'*.mat';'*.*'},'File Selector',start_path); 
    editmat = fullfile(pathname,filename);
    set(handles.filename, 'String', editmat);
     
     
     
    list_var = whos('-file', editmat)
    set(handles.editname, 'String', list_var.name);
    set(handles.textsize, 'String', list_var.size);
    set(handles.textbytes, 'String', list_var.bytes);
    set(handles.textclass, 'String', list_var.class);
     
     
    guidata(hObject,handles);
    Matlab version R2006b et R2007a, sous Linux ou Windows

  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 302
    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 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    list_var = whos('-file', editmat);
     
    set(handles.editname, 'String', char(list_var.name));
    set(handles.textsize, 'String', num2str(reshape([list_var.size],[],2)));
    set(handles.textbytes, 'String', num2str([list_var.bytes].'));
    set(handles.textclass, 'String', char(list_var.class));
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Points : 102
    Points
    102
    Par défaut
    Yes merci beaucoup, tu es mon héros!
    par contre pour le champ size, quand il n'y a qu'une seule variable il y a le detail des dimensions (par exemple 120 160 20 20), mais si il y a plusieurs variables il n'y a que le nombre de dimensions c'est ca? (style 1 4 pour 4D).
    Matlab version R2006b et R2007a, sous Linux ou Windows

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Citation Envoyé par coolzy
    si il y a plusieurs variables il n'y a que le nombre de dimensions c'est ca? (style 1 4 pour 4D).
    Je ne crois pas... enfin j'ai jamais trop fait ça. Tu pourras toujours mettre une condition sur la taille de list_var si ça pose problème.
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  5. #5
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Points : 102
    Points
    102
    Par défaut
    ok merci beaucoup!
    Matlab version R2006b et R2007a, sous Linux ou Windows

  6. #6
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Points : 102
    Points
    102
    Par défaut
    j'ai un cas particulier ou il y a un bug, je ne sais pas pourquoi. Il y a une variable dans le fichier qui pose des problemes quand il s'agit d'afficher la taille.
    si je fais un whos normal dans matlab cela ma donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >> whos
      Name        Size                   Bytes  Class     Attributes
     
      a         256x256x63            33030144  double
    alors que d'habitude je n'ai pas le detail des dimensions, et du coup l'affichage de size donne l'erreur suivante:
    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
    ??? Error using ==> reshape
    Product of known dimensions, 2, not divisible into total number of elements, 3.
     
    Error in ==> loadmatlabfile>browsefile_Callback at 101
    set(handles.textsize, 'String', num2str(reshape([list_var.size],[],2)));
     
    Error in ==> gui_mainfcn at 95
            feval(varargin{:});
     
    Error in ==> loadmatlabfile at 46
        gui_mainfcn(gui_State, varargin{:});
     
    ??? Error using ==> loadmatlabfile('browsefile_Callback',gcbo,[],guidata(gcbo))
    Error using ==> reshape
    Product of known dimensions, 2, not divisible into total number of elements, 3.
     
    ??? Error using ==> waitfor
    Error while evaluating uicontrol Callback
    J'ai testé differents trucs du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set(handles.textsize, 'String', num2str(reshape([list_var.size],[],2)));
    set(handles.textsize, 'String', num2str(reshape([list_var.size],[],3)));
    set(handles.textsize, 'String', num2str(reshape([list_var.size],[],4)));
    mais en fait il calcule le nombre total d'element dans le champ size (par exemple si il y a une variable 2dim et une variable 3dim, le nombre total est 5) et va repartir regulierement ces 5 elements sur chaque ligne.
    donc en fait il faudrait parcourir list_var.size variable par variable. comment on peut faire ca?
    Matlab version R2006b et R2007a, sous Linux ou Windows

  7. #7
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Je n'ai pas très bien compris le pourquoi du reshape de Dut.
    Essayes en faisant juste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set(handles.textsize, 'String', num2str(list_var.size));
    Et pour voir la tête qu'aura chaque champ, il vaut mieux faire :
    L'affichage n'est pas tout à fait le même...(en particulier pour size)
    Règles du Forum

    Adepte de la maïeutique

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Citation Envoyé par caro95470
    Je n'ai pas très bien compris le pourquoi du reshape de Dut.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    S(1).size=[1 2];
    S(2).size=[1 3];
     
    num2str(S.size)
    ans =

    ''
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  9. #9
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Points : 102
    Points
    102
    Par défaut
    un simple str2num renvoie l'erreure:
    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
    ??? Error using ==> num2str
    Too many input arguments.
     
    Error in ==> loadmatlabfile>browsefile_Callback at 103
    set(handles.textsize, 'String', num2str([list_var.size].'));
     
    Error in ==> gui_mainfcn at 95
            feval(varargin{:});
     
    Error in ==> loadmatlabfile at 46
        gui_mainfcn(gui_State, varargin{:});
     
    ??? Error using ==> loadmatlabfile('browsefile_Callback',gcbo,[],guidata(gcbo))
    Error using ==> num2str
    Too many input arguments.
     
    ??? Error using ==> waitfor
    Error while evaluating uicontrol Callback
    le reshape marchait bien, tant que dans 'size' il y avait a chaque fois deux elements, pas plus pas moins.

    je vais tester variable par variable...
    Matlab version R2006b et R2007a, sous Linux ou Windows

  10. #10
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    désolée.

    Pour me rattraper (en ayant tester cette fois-ci) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    %récupération des size en cellule :
    C={list_var(:).size};
    %Transformation en string de chaque élément :
    str=cellfun(@(x)num2str(x),C,'uni',false);
    %Et voilà
    set(handles.textsize, 'String',str);
    Règles du Forum

    Adepte de la maïeutique

  11. #11
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Points : 102
    Points
    102
    Par défaut
    yeah merci beaucoup! merci a tous les deux!
    Matlab version R2006b et R2007a, sous Linux ou Windows

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

Discussions similaires

  1. Script shell : afficher le contenu des variables entre simple quote
    Par mualki dans le forum Shell et commandes GNU
    Réponses: 10
    Dernier message: 23/01/2010, 00h14

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