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 :

Utilisation d'un nom variable dans size


Sujet :

MATLAB

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 47
    Par défaut Utilisation d'un nom variable dans size
    Bonjour,

    J'ai importé un fichier texte qui s'est divisé en .data et .txtdata dans mon workbench.
    A présent, je souhaite lire la taille de mon .data. Donc en faisant size(Nom.data), cela fonctionne... Seulement, le nom de mon fichier peut être amené à changer. J'aimerais donc introduire une variable du genre size('%s'.data, Name), mais évidemment ça ne marche pas. Je ne sais même pas si c'est possible car je n'ai rien trouvé à ce sujet.
    Je me sers de size pour tracer un graphique 3D à l'aide de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [X Y] = meshgrid(0:1:(size(Name.data,1)),0:1:(size(Name.data.data,2));
    Donc, de même pour mon axe z j'ai besoin d'avoir un nom avec une variable... Je ne sais pas si c'est possible.
    J'ai vraiment du mal à utiliser tout ce qui est nom variable dans Matlab, je suis encore novice dans l'utilisation du logiciel.
    Merci d'avance...

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Par défaut
    Bonjour,

    tu peux utiliser getfield :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Z = getfield(Name,'data');
    [X Y] = meshgrid(0:size(Z,1),0:size(Z,2));
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 47
    Par défaut
    Merci beaucoup pour ta réponse. J'ai essayé comme tu m'as dit mais j'obtiens l'erreur suivante: Attempt to reference field of non-structure array.
    Mon "Name" est en fait stocké dans un tableau donc ce que j'ai tenté de faire c'était:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Z = getfield(A{n},'data');
    Je crois comprendre qu'il faut transformer ma cell en structure, j'ai essayé cell2struct mais ça m'affiche : Undefined function 'cell2struct' for input arguments of type 'char'.
    Une idée de comment faire?

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Par défaut
    Peux-tu nous montrer le code que tu utilises?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 47
    Par défaut
    Oui, le voici :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    [FileName,PathName] = uigetfile('*.txt','sélectionnez les fichiers texte', 'MultiSelect', 'on');
    FileName = cellstr(FileName);
    
    %Import des fichiers
    if numel(FileName) == 1
          suffix=num2str(FileName{1});
          varName=sprintf('%s',suffix);
          %Divide the name of the file
          [A,B] = strread(varName,'%s%s','delimiter','.');
          %Assign the data to the name
          assignin('base',A{1},importdata(FileName{1}));
          
    else 
         for n=1:length(FileName)
    
          suffix=num2str(FileName{n});
          varName=sprintf('%s',suffix);
          %Divide the name of the file
          [A,B] = strread(varName,'%s%s','delimiter','.');
          %Assign the data to the name
          assignin('base',A{1},importdata(FileName{n}));  
    
          %C'est l'endroit où je souhaite créer un graphe en utilisant les données du fichier que je viens d'importer. Les données sont comprises dans une structure, séparée en .data et .txtdata, qui porte le nom A{1}. Mon axe Z sera les données comprises dans le .data et j'ai besoin de la taille de ce .data aussi pour mon axe X et Y.
          Z = getfield(A{1},'data');
          [X Y] = meshgrid(0:(size(Z,2)-1),0:(size(Z,1)-1));
          surf(X,Y,Z);shading interp;colorbar
          axis equal
         
    
    
        end
    
    end

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Par défaut
    Je trouve que c'est une très mauvaise idée de vouloir donner le nom de ton fichier à ta variable, pourquoi chercher à faire cela?

    Tu peux faire plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [FileName,PathName] = uigetfile('*.xlsx','sélectionnez les fichiers texte', 'MultiSelect', 'on');
    FileName = cellstr(FileName);
     
    for n=1:length(FileName)
        A{n} = importdata(FileName{n});
        Z = getfield(A{1},'data');
        [X Y] = meshgrid(0:(size(Z,2)-1),0:(size(Z,1)-1));
        surf(X,Y,Z);shading interp;colorbar
        axis equal
    end
    Et si tu as besoin du nom du fichier, tu sais que A{n} est relié à FileName{n}.

    Petit détail : chaque surface va écraser la précédente sur ta figure puisque tu n'as pas mis de hold on dans le code.
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 47
    Par défaut
    Super! Merci beaucoup pour ton aide.
    Plutot que d'utiliser hold on (qui, si je comprends bien, superpose les graphs les uns sur les autres), je voulais plutôt utiliser subplot pour avoir chaque courbe à côté l'une de l'autre. J'ai donc utilisé un truc du genre à l'intérieur de ma boucle for:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    subplot(1,length(FileName),n);surf(X,Y,Z);shading interp;
    Ca marche bien pour le premier fichier, par contre pour le deuxième j'obtiens cette erreur : Function 'subsindex' is not defined for values of class 'cell'.
    C'est mon n qu'il ne semble pas apprécier...
    Une idée?

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Par défaut
    Peux-tu nous montrer le code complet ainsi que le message d'erreur complet?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 47
    Par défaut
    J'ai tout simplement repris ton code et ajouté subplot à surf:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [FileName,PathName] = uigetfile('*.xlsx','sélectionnez les fichiers texte', 'MultiSelect', 'on');
    FileName = cellstr(FileName);
     
    for n=1:length(FileName)
        A{n} = importdata(FileName{n});
        Z = getfield(A{1},'data');
        [X Y] = meshgrid(0:(size(Z,2)-1),0:(size(Z,1)-1));
        subplot(1,length(FileName),n);surf(X,Y,Z);shading interp;
        axis equal
    end
    Voici l'erreur:

    Error using subsindex
    Function 'subsindex' is not defined for values of class 'cell'.
    
    Error in Test (line 13)
        subplot(1,length(FileName),n);surf(X,Y,Z);shading interp;

  10. #10
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Par défaut
    Etrange cette erreur.

    Si tu ajoutes :
    avant de relancer ce code, tu obtiens toujours la même erreur?

    Ce serait possible que tu nous fournisses 2 ou 3 fichiers txt que tu traites (que tu pourrais mettre dans une archive zip et joindre à ton prochain message)?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 47
    Par défaut
    Oui j'obtiens toujours la même erreur...
    Voici deux fichiers .txt tout simples sur lesquels je m'exerce pour le moment.
    Files.zip

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 47
    Par défaut
    J'ai trouvé!
    En nommant en début de code Lgth = length(FileName) et en l'utilisant dans size, cela marche! Je ne sais pas pourquoi par contre.

    EDIT: je me suis réjouis trop vite, j'ai l'impression que j'obtiens deux fois le même graphe et pas un pour le premier fichier et un autre pour le second... Ce que je souhaite faire n'est pas possible?
    EDIT2: C'est bon, c'était une petite erreur dans mon code!

    Merci beaucoup en tout cas.

Discussions similaires

  1. [XL-2003] Utilisation d'une donnée variable dans une cellule
    Par Baluteaud dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 07/04/2015, 18h01
  2. Réponses: 3
    Dernier message: 17/04/2014, 10h26
  3. [save] utilisation avec un nom variable
    Par Invité dans le forum MATLAB
    Réponses: 7
    Dernier message: 07/02/2014, 11h31
  4. Réponses: 4
    Dernier message: 01/04/2010, 15h20
  5. Utilisation d'une même variable dans différents fonctions de Callback
    Par houjuventini dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 16/11/2007, 08h58

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