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 :

chaine de caractère et nom de variables


Sujet :

MATLAB

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 209
    Points : 78
    Points
    78
    Par défaut chaine de caractère et nom de variables
    bonsoir

    est ce que vous savez comment faire, sous matlab, pour transformer une chaine de caractère en un nom de variable à laquelle on donnera une valeur ?

    exemple: j'ai une variable a ='Vector'. a est une chaine de caractère. Est ce qu'il y a moyen de créer une variable Vector =3 ? Je sais pas si je suis clair, mais j'aimerai transformer les chaines de caractère en nom de variables..


    voila, merci beaucoup

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    Bonjour.
    Help str2num

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 209
    Points : 78
    Points
    78
    Par défaut
    bonjour,
    désolé mais je crois qu'on s'est pas très bien compris.

    j'ai une variable x égale à 'vect', qui est une chaine de caractère.

    j'aimerai pouvoir créer une variable nommée vect (le contenu de x) et lui donner la valeur 3 par exemple. donc je cherche une fonction f qui fait ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    >>x='vect'
    >>f(x)=3;
    maintenant, si je fais vect dans la commande window de matlab, je dois obtenir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>vect
     
    vect =
     
               3
    >>
    voilà, est ce que c'est possible ?

    merci beaucoup

  4. #4
    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 828
    Points
    14 828
    Par défaut
    Quel est l'intérêt de faire ceci ?
    Une des FAQ qui ne correspond certes pas à ton besoin explique pourquoi la solution pour faire exactement ce que tu veux est mauvaise (utiliser EVAL)

    Une solution, suivant ton besoin, pourrait être d'utiliser une structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    s.nom = 'vect';
    s.valeur = 3;

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 209
    Points : 78
    Points
    78
    Par défaut
    bonjour,

    merci beaucoup pour la réponse.

    En fait, l'interet de faire cela, c'est pour pouvoir lire lire un fichier excel. En effet, il se trouve que xlsread, import wizard ou tout autre moyen interfaçant excel et simulink ne crée que des vecteurs à partir des colonnes, alors que j'ai besoin de matrices.

    je m'explique, vous savez très bien que les blocs from workspace de simulink ne peuvent lire que des matrices de deux colones (temps, vect). Or sous simulink, si je définis une colone temps, et une autre colonne vecteur, la fonction xlsread va créer un vecteur temps et un autre vecteur vect, ce qui ne sera pas lu par simulink. C'est pour cette raison que j'aimerai pouvoir constuire une matrice nommée vect et qui contient la valeur [temps, vect].

    Est ce qu'il ne vous est jamais arrivé ce genre de problèmes ?

    merci

  6. #6
    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 828
    Points
    14 828
    Par défaut
    Je n'arrive pas bien à voir le rapport avec le fait que le nom soit stocké dans une chaine de caractères.

    Ton problème semble plutôt être la concaténation des données récupérées.

    Peux-tu nous montrer un exemple des valeurs récupérées, et un exemple de ce que tu veux injecter dans Simulink ?

  7. #7
    Membre habitué
    Avatar de mr_langelot
    Profil pro
    Inscrit en
    Août 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 113
    Points : 150
    Points
    150
    Par défaut
    Bonjour,

    rien ne t'interdit, après l'usage de xlsread, de mettre les données telles qu'elles doivent être utilisés dans simulink...

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 209
    Points : 78
    Points
    78
    Par défaut
    voici un exemple:

    j'ai un modèle simulink simple qui contient un bloc "from workspace" nommée vect.

    j'ai un fichier excel composé de deux colonnes.
    une colonne temps, qui determine les valeurs du temps, et une autre colonnes vect.

    avec xlsread j'ai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>[num, txt]=xlsread('val.xls')
    dans la commande window de matlab, j'obtiens:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>num
     
    num =       0      0
                     1      0
                     4      0
                     6      1
                     7      1
                     8      1
                    10     1
     
    >>txt
     
    txt= 'temps'  'vect'

    le problème c'est que, pour pouvoir lancer la simulation, il faut avoir dans le workspace, une variable nommée vect (remarquez que c'est le même nom du block from workspace), de dimension 2, défini de la manière suivante:

    la fonction xlsread, ne crée pas cette matrice qui sera utilisé par le block from workspace.
    Est ce que vous voyez ce que je veux ?
    si c'est pas clair, s'il vous plait dites le moi.

    merci

  9. #9
    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 828
    Points
    14 828
    Par défaut
    Donc en fait c'est la variable num que tu veux injecter dans Simulink, non ?
    Le fait que la variable doive s'appeler vect vient surtout du bloc From Workspace.

    Donc il suffit de faire :
    A moins que tu ne veuilles aller chercher le nom dans le bloc From Workspace ?

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 209
    Points : 78
    Points
    78
    Par défaut
    le problème c'est que j'aimerai faire un script, pour automatiser la tâche. C'est à dire, je cherche une fonction qui fait ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>nom_de_la_cellule_excel=num
    j'éspère que mon problème est devenu clair pour vous.
    merci

  11. #11
    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 828
    Points
    14 828
    Par défaut
    La réponse est dans la FAQ que j'ai donnée depuis le début (EVAL).

    Mais je ne comprends toujours pas pourquoi c'est le nom d'Excel qui est important.
    Si tu souhaites automatiser ce qui est important c'est que le nom de ta variable soit le même dans le workspace et dans Simulink.

    Donc ce nom peut être ce que tu veux toi sans avoir à récupérer le nom qui vient d'Excel.


    NB :
    Tu as peut-être l'impression que je t'ennuies avec des considérations qui n'ont pas grand-chose à voir avec ton problème mais je t'assure que ce qui est important c'est de bien réfléchir à la façon de faire les choses proprement sans vouloir aller trop vite.

    C'est pour cela que j'essaye de bien cerner ton besoin et non pas de répondre directement à ta question, car la réponse amène une mauvaise façon de coder.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 209
    Points : 78
    Points
    78
    Par défaut
    oui, merci beaucoup, je vois ce que tu veux dire.

    revenons à notre fichier excel. En fait, j'ai un modèle simulink, dont je dois définir les inputs dans ce fichier excel.

    Donc, l'association des blocks from workspace avec ces noms viendra après. C'est le fichier excel qui determine tout.

    par contre, je ne vois pas du tout comment utiliser la fonction eval pour céer la variable nom_cellule_excel. Normlement, eval sert à executer un string qui est une fonction matlab. Je ne vois pas donc comment faire le rapport avec mon problème.

    Pouvez vous me donner un exemple ?

  13. #13
    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 828
    Points
    14 828
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nom = 'vect';
    valeur = 3;
    eval(sprintf('%s=%d',nom,valeur));
    Aaaaaaaaaah c'est moche !!

    Et je reste persuadée que tu peux (dois) l'éviter.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 209
    Points : 78
    Points
    78
    Par défaut
    d'accord, merci caroline.

    j'ai essayé ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var = 'vect';
    t = [0 1 2 3 4 5];
    b=[2 2 2 2 2 2];
    C=(cat(1,t,b))';
    eval(sprintf('%s=%d',var,C));
    mais il ne marche pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Warning: The argument for the %s format specifier must be of type char (a string).
    > In read at 31
    ??? Error: Missing variable or function.
     
    Error in ==> read at 31
    eval(sprintf('%s=%d',var,C));
    Je pense que c'est parce que C est une matrice, et qu'il faut remplaceer %d par autre chose.

    Qu'est ce vous en pensez ?

    PS: le code a marché pour C=3.

    merci

  15. #15
    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 828
    Points
    14 828
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(sprintf(%s=%s),var,'C');

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 209
    Points : 78
    Points
    78
    Par défaut
    parfait, ça marche.

Discussions similaires

  1. Réponses: 5
    Dernier message: 21/09/2011, 11h43
  2. Réponses: 1
    Dernier message: 03/03/2010, 03h41
  3. Convertir une chaine de caractère en nom de controle
    Par craesys dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/08/2008, 18h57
  4. Réponses: 1
    Dernier message: 13/06/2007, 13h14
  5. Réponses: 7
    Dernier message: 20/04/2007, 16h42

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