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

Simulink Discussion :

Traitement de chaînes de caractères avec des MATLAB Embeded Function


Sujet :

Simulink

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Traitement de chaînes de caractères avec des MATLAB Embeded Function
    Bonjour,

    Je dois traiter des chaines de caractère qui m'arrivent en entrée dans simulink afin de récupérer certaines infos. Les chaînes qui m'arrivent sont de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maChaine = uint8('1#123#1;2#456#3;3#789#1;')
    Afin de récupérer chaque morceau séparé par un point virgule, j'ai utilisé une fonction Matlab embarquée qui utilise la fonction findstr(';', maChaine);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function sousChaine = fcn(maChaine)
    % This block supports the Embedded MATLAB subset.
    % See the help menu for details. 
     
    tmp = findstr(';', maChaine);
    sousChaine = maChaine(1:tmp(1));

    Cependant lors de l'exécution j'obtiens plusieurs erreurs (qui n'apparaissent pas lorsque j'utilise ce code avec matlab) :

    Embedded MATLAB Interface Error: Error using ==> findstr
    Input strings must have one row.
    Block Embedded MATLAB Function (#510)
    While executing: none.
    lorsque je ne fait que findstr

    ou


    Subscripting into an mxArray is not supported.
    
    Function 'Embedded MATLAB Function' (#509.198.204), line 7, column 25:
    "tmp(1)"
    lorsque j'essai de découper ma chaîne avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sousChaine = maChaine(1:tmp(1));

    Sauriez vous d'où vient ce problème, si peut le résoudre et sinon quelles autres solutions existe t'il pour traiter des chaines de caractère avec simulink

    Merci de votre aide

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    Dans un premier temps, je pense que le plus simple serait de mettre un point d'arrêt dans ta fonction pour voir ce qu'il se passe...

    Ensuite, si tu fais maChaine = uint8('1#123#1;2#456#3;3#789#1;'), la variable maChaine doit être un un vecteur et plus une chaine de caractères, non? (La transformation inverse se fait avec CHAR).

    Duf

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

    En mettant ce point d'arrêt, vérifie en même temps que maChaine est un vecteur ligne et non colonne, ce que semble souligner ta première erreur.
    Et le cas échéant il te suffira de la transposer avec d'utiliser la fonction findstr.
    Pour ce qui est de ta deuxième erreur, c'est un problème de taille de tmp non définie explicitement. tmp aura t-il toujours la même longueur ? À savoir n#nnn#n => 7 ?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Bonjour et merci pour vos réponses.

    Je ne sais pas si j'ai trouvé la meilleur solution mais j'en ai au moins trouvé une.

    - Tout d'abord, en ce qui concerne le point d’arrêt, je ne pouvais pas m'en servir vu que le programme ne compilait même pas.

    - Avec uint8() la chaine devient effectivement un vecteur, cependant findstr() le traite comme une chaine, et de plus j'ai eu des soucis avec les char avec simulink c'est pourquoi je me sert de uint8

    - J'avais également un problème avec ma chaine d'entrée qui était un vecteur colonne (je ne sais pas trop pourquoi...)

    - Et effectivement venait de ma variable tmp qui doit être un tableau de double mais dont la taille m'est inconnue. findstr() me renvoi un tableau de double contenant les positions de ma sous-chaine dans ma chaine, ici :
    findstr(';', '1#123#1;2#456#3;3#789#1;') ==> [8 16 24]
    donc je ne peux pas connaitre sa taille vu qu'elle dépend du nombre de xx#xx#xx;

    De plus la création de tableau dynamiquement avec une taille fournie par une variable n'est pas possible sous simulink

    Du coup je n'utilise pas findstr() mais je compte les ';' en parcourant ma chaîne et je crée des vecteurs statique de 256 (la taille maxi de mes chaine d'entrée)

    Voilà, je mets le code d'une de mes fonctions si ça intéresse quelqu'un

    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
    34
    35
    36
    37
    38
     
    function session = getSession(sessionsList, pos)
    % This block supports the Embedded MATLAB subset.
    % See the help menu for details. 
     
    position = zeros(1, 256, 'double');
    chaine = zeros(1, 256, 'uint8');
    session = zeros(1, 256, 'uint8');
    tmp = zeros(1, 256, 'double');
     
    nb = double(1);
    total = double(1);
    total = max(size(char(sessionsList)));
     
    nb = 0;
    for i=1:total
        c = sessionsList(i);
        chaine(i) = c;
        if (c == ';')
            nb = nb+1;
            tmp(nb) = i;
        end
    end
     
    for i=1:nb
        position(i) = tmp(i);
    end
     
    fin=double(1);
    fin=position(pos);
    if (pos>1)
        debut = position(pos-1) +1;
    else
        debut = 1;
    end
    for i=1:(fin-debut+1)
        session(i) = chaine(i+debut-1);
    end

Discussions similaires

  1. Convertir un entier en caractère avec des 0 devant
    Par Oluha dans le forum Développement
    Réponses: 12
    Dernier message: 28/08/2017, 13h37
  2. [Turbo Pascal] Remplir une chaîne de caractères avec des chiffres et des lettres majuscules
    Par MoNdEtYnOtEcK dans le forum Turbo Pascal
    Réponses: 8
    Dernier message: 03/03/2013, 14h02
  3. Utilisation de M-file dans des MATLAB Embedded Functions
    Par amaury972 dans le forum Simulink
    Réponses: 6
    Dernier message: 23/05/2012, 13h16
  4. [RegEx] chaîne de caractères avec caractères spéciaux
    Par Kerod dans le forum Langage
    Réponses: 9
    Dernier message: 25/12/2005, 01h40
  5. Réponses: 2
    Dernier message: 06/12/2002, 07h50

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