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 :

optimisation code : vecteur de text ? [Débutant]


Sujet :

MATLAB

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut optimisation code : vecteur de text ?
    Salut tous,

    encore une fois, je viens demander vos lumières

    j'ai un code qui me trace plusieurs courbes "i" et pour chaque courbes je veux mettre des points associés à du texte.

    Voici mon bout de code actuellement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for i=1:1:length(X)
        numeroFigure=numeroFigure+1;
        figure (numeroFigure)
        plot(X{i}(:),Y{i}(:),'b',X{i}(max{i}},Y{i}(max{i}},'*r');
    	for k=1:length(max{i})
         str0 = num2str(k);
         text(X{i}(max{i}},Y{i}(max{i}},str0,'color','k')
    	end
    end
    ça marche nikel mais je voudrais savoir si il est possible d'éviter la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	for k=1:length(max{i})
         str0 = num2str(k);
         text(X{i}(max{i}},Y{i}(max{i}},str0,'color','k')
    	end
    et de mettre directement un vecteur de ce type ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    text(X{i}(max{i}},Y{i}(max{i}},[1:length(max{i})],'color','k')
    le soucis est que je ne sais pas trop comment mettre ce vecteur de string correctement....

    merci

    EDIT :

    en fait je me suis rendu compte que même mon code de départ n'est pas top car pour chaque max j'ai tous les chiffres qui se superposent ....

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

    Chose à éviter : nommer une variable du même nom qu'une fonction MATLAB (max dans ton cas)
    À lire attentivement.

    Ensuite la syntaxe que tu donnes est fausse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for i=1:1:length(X)
        numeroFigure=numeroFigure+1;
        figure (numeroFigure)
        plot(X{i}(:),Y{i}(:),'b',X{i}(max{i}),Y{i}(max{i}),'*r');
    	for k=1:length(max{i})
                str0 = num2str(k);
                text(X{i}(max{i}(k)),Y{i}(max{i}(k)),str0,'color','k')
    	end
    end
    Citation Envoyé par 21did21 Voir le message
    le soucis est que je ne sais pas trop comment mettre ce vecteur de string correctement....
    Simplement le faire passer comme tu faisais par la fonction num2str en faisant juste attention à lui faire passer un vecteur colonne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    str0 = num2str((1:length(max{i})).');
    text(X{i}(max{i}),Y{i}(max{i}),str0,'color','k');

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    merci Jerome d'avoir pris le temps de repondre !



    Citation Envoyé par Winjerome Voir le message
    Chose à éviter : nommer une variable du même nom qu'une fonction MATLAB (max dans ton cas)
    À lire attentivement.
    en fait c'est un erreur de mise en page sur le site seulement
    => ma variable à un nom un peut long et pour simplifié mon post j'ai changé le nom (et je n'avais pas fait attention à cela)

    Citation Envoyé par Winjerome Voir le message
    Ensuite la syntaxe que tu donnes est fausse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for i=1:1:length(X)
        numeroFigure=numeroFigure+1;
        figure (numeroFigure)
        plot(X{i}(:),Y{i}(:),'b',X{i}(max{i}),Y{i}(max{i}),'*r');
    	for k=1:length(max{i})
                str0 = num2str(k);
                text(X{i}(max{i}(k)),Y{i}(max{i}(k)),str0,'color','k')
    	end
    end
    là aussi il y a des petites erreur ds le passage code-> forum
    sinon pas trop de soucis de ce coté

    Citation Envoyé par Winjerome Voir le message
    Simplement le faire passer comme tu faisais par la fonction num2str en faisant juste attention à lui faire passer un vecteur colonne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    str0 = num2str((1:length(max{i})).');
    text(X{i}(max{i}),Y{i}(max{i}),str0,'color','k');

    SUPER !
    c'est exactement ce que je cherchais à faire !!!
    merci beaucoup !!!

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    j'ai une dernière question Jerome :

    => comment faire pour la mise en forme du texte ?

    j'ai essayé ceci mais je me fais jeter sauvagement (probleme d'assignation...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
         for p=1:1:length(str0)
             str0(p)=['\fontsize{12}' str0(p)];
         end
    j'ai donc essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
         for p=1:1:length(str0)
             str0(p,1)=['\fontsize{12}';str0(p,1)];
         end
    mais voici l'erreur à présent... du coup je ne vois plus trop comment faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ??? Assignment has more non-singleton rhs dimensions than non-singleton
    subscripts

  5. #5
    Invité
    Invité(e)
    Par défaut
    Je te rappelle qu'une chaine de caractères n'est rien d'autre qu'un simple tableau de char.
    À partir de là, str0(p) ou str0(p,1) représentent un seul caractère, alors quand tu veux mettre '\fontsize{12}' en plus de ce caractère, MATLAB n'est évidemment pas très content

    str0 étant je présume le résultat de str0 = num2str((1:length(max{i})).');, length(str0) suivant le nombre d'éléments de max{i} ne sera pas toujours juste.

    Dans un premier temps je te conseille de te familiariser avec les chaines de caractères, à différencier d'un tableau de cellules les contenant :
    • Regarder la différence entre str0(p) ou str0(p,1) et str0(p,:)
    • Regarder size(str0)


    Au final pour répondre à ta question, tu peux te servir directement de num2str

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    merci pour toute ton aide

    Citation Envoyé par Winjerome Voir le message
    Dans un premier temps je te conseille de te familiariser avec les chaines de caractères, à différencier d'un tableau de cellules les contenant :
    • Regarder la différence entre str0(p) ou str0(p,1)
    Citation Envoyé par Winjerome Voir le message
    ici, lorsque je fais N=size(str0)j'obtiens N(1)=14 N(2)=2
    donc en gros "str0" est une vecteur de 14 mots et dans mon cas chaque mots ont deux lettres. (bizarre, j'aurais pensé en avoir qu'un seul puisque ce n'est qu'un chiffre que j'ai stocké...)
    (à la fin du mot matlab enregistre un caractére "retour à la ligne je pense ?)

    du coup, ce que j'en couclu c'est que je devrais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        taille=size(str0);
        for p=1:1:length(taille(1))
            str0(p,:)=['\fontsize{12}' str0(p,:)];
        end
    mais voici ce que j'ai :
    ??? Subscripted assignment dimension mismatch.
    là je ne comprends plus trop...

    Citation Envoyé par Winjerome Voir le message
    Au final pour répondre à ta question, tu peux te servir directement de num2str
    je ne vois pas du tout ce que tu veux dire là....

    car si je fais un truc du genre :
    je risque de me faire jeter

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par 21did21 Voir le message
    donc en gros "str0" est une vecteur de 14 mots et dans mon cas chaque mots ont deux lettres. (bizarre, j'aurais pensé en avoir qu'un seul puisque ce n'est qu'un chiffre que j'ai stocké...)
    Citation Envoyé par Winjerome Voir le message
    Je te rappelle qu'une chaine de caractères n'est rien d'autre qu'un simple tableau de char.
    Prenons 14, tu as 2 char : '1' et '4'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >> str = '14';
    str(1)
     
    ans =
     
    1
     
    >> str(2)
     
    ans =
     
    4
     
    >>
    Citation Envoyé par 21did21 Voir le message
    du coup, ce que j'en couclu c'est que je devrais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str0(p,:)=['\fontsize{12}' str0(p,:)];
    Et moi j'en conclu que tu n'as pas assez pris le temps de te familiariser avec
    size(str0) = [14 2] ce qui donne size( str0(p,:) ) = [1 2]. Et crois-tu que
    size( ['\fontsize{12}' str0(p,:)] ) = size( '\fontsize{12}' ) + size( str0(p,:) ) == [1 2] ? Bah non
    Tu es en train de mettre 13 + 2 caractères là où tu ne peux en mettre que 2 !
    Citation Envoyé par 21did21 Voir le message
    car si je fais un truc du genre :
    Ais-je encore besoin de mentionner doc num2str ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    merci Jerome pour ces explications. Je vais essayer de tirer tout ceci au clair

    ps: j'ai regardé la doc de num2str mais je ne comprends pas vraiment ce que tu veux me dire. Je vais gardé la premiere méthode mais essayé de le faire proprement à l'aide de tes conseils.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par 21did21 Voir le message
    ps: j'ai regardé la doc de num2str mais je ne comprends pas vraiment ce que tu veux me dire.
    Connais-tu les fonctions sprintf et/ou fprintf ? Et bien c'est pareil

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Connais-tu les fonctions sprintf et/ou fprintf ? Et bien c'est pareil
    ah OK. Merci Jerome je comprends mieux je crois.

    A+ et encore merci

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

Discussions similaires

  1. [Optimisation] Tables avec champs textes
    Par sietjp dans le forum Administration
    Réponses: 4
    Dernier message: 10/01/2008, 21h21
  2. Optimiser code VBA
    Par willytito dans le forum VBA Access
    Réponses: 5
    Dernier message: 19/11/2007, 09h49
  3. interdire code dans formulaire texte
    Par ~Brouette~ dans le forum Langage
    Réponses: 2
    Dernier message: 02/04/2007, 11h52
  4. [EDI] Outil search/replace (ds code php - fichier texte)
    Par vandeyy dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 09/02/2007, 11h30
  5. Doute sur mon code, découpage de texte
    Par goblin dans le forum Langage
    Réponses: 3
    Dernier message: 16/10/2006, 20h26

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