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 :

aide pour réduire un batch [Débutant]


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 5
    Points
    5
    Par défaut aide pour réduire un batch
    bonjour,

    j'ai un petit souci je dois analyser un tableau de ce type :

    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
    Type	                  Temps
    Croix de fixation	     1
    actif	                     2
    Delai2	                     3
    Oui	                     4
    Croix de fixation	     5
    actif	                     6
    Delai2	                     7
    Oui	                     8
    Croix de fixation	     9
    actif	                    10
    Delai1	                    11
    Oui	                    12
    Croix de fixation       13
    actif	                    14
    Delai0	                    15
    non	                    16
    un essais va donc de croix de fixation jusqu'à 1 réponse (oui ou non)
    je dois classer les essais et temps associés en fonction du délai,et de la réponse.
    J'ai déjà réussi a les classer,cependant,je cherche une piste afin de le réaliser de façon plus propre de façon à ce que si j'ajoute plus de types de délais,ou autre chose que actif,le code ne soit pas si lourd :

    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
    39
    %on commence par créer les matrices qui vont contenir les tout les temps de
    %chaque essais en fonction de la réponse et du délais
    %le nombre de lignes dans le fichier log (multiples de 4) donné par la
    %fonction:
    n=length(NUM);
    %création de matrice vides qui vont contenir les temps de tout les essais
    %pour chaque conditions
    mat1=[];
    mat2=[];
    mat3=[];
    mat4=[];
    mat5=[];
    mat6=[];
     
    for i=1:n
        %on ennonce les condition nessecaire pour remplir les matrices afin que
        %les temps aillent dans les bonnes matrices 
     
                  if strcmp(TXT(i,1),'actif')==1 & strcmp(TXT(i+1),'Delai0')==1 & strcmp(TXT(i+2),'Oui')==1;
                             g=[NUM(i-1) NUM(i) NUM(i+1) NUM(i+2)];
                                    mat1=[mat1;g];
                   elseif strcmp(TXT(i,1),'actif')==1 & strcmp(TXT(i+1),'Delai0')==1 & strcmp(TXT(i+2),'non')==1;
                            g=[NUM(i-1) NUM(i) NUM(i+1) NUM(i+2)];
                                    mat2=[mat2;g];
                  elseif strcmp(TXT(i,1),'actif')==1 & strcmp(TXT(i+1),'Delai1')==1 & strcmp(TXT(i+2),'Oui')==1;
                              g=[NUM(i-1) NUM(i) NUM(i+1) NUM(i+2)];
                                     mat3=[mat3;g];
        elseif strcmp(TXT(i,1),'actif')==1 & strcmp(TXT(i+1),'Delai1')==1 & strcmp(TXT(i+2),'non')==1;
            g=[NUM(i-1) NUM(i) NUM(i+1) NUM(i+2)];
                mat4=[mat4; g];
        elseif strcmp(TXT(i,1),'actif')==1 & strcmp(TXT(i+1),'Delai2')==1 & strcmp(TXT(i+2),'Oui')==1;
            actifdelai2oui=[NUM(i-1) NUM(i) NUM(i+1) NUM(i+2)];
                mat5=[mat5;g];
        elseif strcmp(TXT(i,1),'actif')==1 & strcmp(TXT(i+1),'Delai2')==1 & strcmp(TXT(i+2),'non')==1;
            g=[NUM(i-1) NUM(i) NUM(i+1) NUM(i+2)];
                mat6=[mat6;g];
        else;
        end;
     end;
    ici je poste une de mes autres piste de réflexion, mais, je bloque au niveau de la boucle,de plus,je doute que ce soit tellement moins court
    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
    %  trier les conditions
    debutessai = find(((strcmp(TXT(:,1),'Croix de fixation'))==1));
    condition = find(((strcmp(TXT(:,1),'actif'))==1));
    delai = find(((strcmp(TXT(:,1),'Delai0'))==1)|((strcmp(TXT(:,1),'Delai1'))==1)|((strcmp(TXT(:,1),'Delai2'))==1)); 
    reponse1 = find(((strcmp(TXT(:,1),'Oui'))==1)|((strcmp(TXT(:,1),'non'))==1));
    TrialsB = NUM(debutessai,1);
    TrialsE = NUM(reponse1,1);
    delais(find((strcmp(TXT(delai,1),'Delai0'))==1),1)=1;
    delais(find((strcmp(TXT(delai,1),'Delai1'))==1),1)=2;
    delais(find((strcmp(TXT(delai,1),'Delai2'))==1),1)=3;
    rep1(find((strcmp(TXT(reponse1,1),'Oui'))==1))=1;
    rep1(find((strcmp(TXT(reponse1,1),'non'))==1))=2;
    delays=['delai0';'delai1';'delai2'];
    reps=['detecte';'nondete']
     
    for delay = 1:3;
        for rep = 1:2;
     
     
    end;
    end;
    on m'a fourni quelques pistes pour la boucle utilisant la fonction eval, ceci dit d'après ce que j'ai lu de cette fonction sur le forum,elle est à priori à éviter(de plus,j'ai du mal à saisir sa véritable utilité, ou la façon dont elle fonctionnne)

    Merci en espérant que mon sujet soit assez clair
    et que ma façon de programmer ne rende pas aveugle un utilisateur de matlab expérimenté

  2. #2
    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
    J'avoue je n'ai pas très bien compris le résultat que tu veux au final
    Tu pourrais nous montrer ?

    Et aussi comment est construit TXT exactement (c'est quoi un tableau de celulles, de caractères ?)
    Dans NUM c'est le Temps (de 1 à16) ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    (le fichier de données de base est un fichier exel)

    la partie TXT({}16x3cell) étant à gauche et qui correspond aux évènements survenu au temps (NUM à droite dans le tableau) j'ai supprimé la 1ere ligne qui ne sert a rien (type et temps)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    % ouvrir le fichier log
        [NUM,TXT]=xlsread(['essaisactifpassif.xls']);
    % retirer les titres du log
        TXT(1,:)=[];
    pour classer les données en regroupant par type d'essais

    avoir d'un coté tout les essais avec leur temps associés où le délai était de 0 et la réponse oui
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    delai0oui	to	t1	t2	t3
                     1      2       3      4
    (là ce sont des temps factices utilisés uniquement sur ce fichier exel d'essai,mais il y aura beaucoup plus de lignes,les temps ne seront pas que des pas de1 etc...)
    et ainsi de suite pour tout les combinaison de delais et de oui et non


    (PS:désolé pour les balises code, je les oublierais plus )

  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
    Tu dois pouvoir aussi enlever la 2ème colonne de TXT qui ne contient plus que du vide une fois la 1ère ligne enlevée :
    Pour information TXT est donc bien un tableau de cellules.

    Dans ton fichier exemple il y a toujours ces 2 lignes identiques :
    Croix de fixation
    actif
    => il peut y avoir d'autre valeur en vrai ?

    Après ça a l'air compliqué ton truc, faut que je réfléchisse un peu à tout ça

    [EDIT]Si tu pouvais éventuellement faire un pseudo-code pour éclaircir l'algo ce serait bien

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    En vrai,il y aura d'autres valeurs que actif,en revanche
    Un essais commence toujours par croix de fixation ça restera donc toujours fixe

    Le 1er script marche et me donne des résultats que je peux utiliser.
    Étant biologiste de formation, je suis encore un novice en programmation, je voulais donc savoir si il existait une alternative à mes boucles conditionnelles pour rendre mon script plus propre et éventuellement limiter les plantage, car les fichiers de données seront assez conséquents.

    Merci à toi de m'avoir répondu si vite
    de mon coté,je continue a tester les fonctionnalités de matlab pou tenter d'améliorer un peu dans la mesure de mes connaissances

  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
    Une piste si tu es sur du format de ton fichier c'est qu'au lieu de boucler de i=1 à n
    tu pourrais boucler de i=2 à n avec un pas de 4 (c'est-à-dire qu'on ne regarde que les lignes où il y a actif).

    Tu gagneras déjà pas mal de temps

    Ensuite pour tes STRCMP tu n'es pas obligé de mettre ==1 à chaque fois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if strcmp(var,'a')
    %est pareil que
    if strcmp(var,'a')==1

  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 828
    Points
    14 828
    Par défaut
    Première amélioration de ton code :
    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
    39
    40
    41
    %on commence par créer les matrices qui vont contenir les tout les temps de
    %chaque essais en fonction de la réponse et du délais
    %le nombre de lignes dans le fichier log (multiples de 4) donné par la
    %fonction:
    n=length(NUM);
     
    %création de matrice vides qui vont contenir les temps de tout les essais
    %pour chaque conditions
    matactifdelai0oui=[];
    matactifdelai0non=[];
    matactifdelai1oui=[];
    matactifdelai1non=[];
    matactifdelai2oui=[];
    matactifdelai2non=[];
     
    for i=2:4:n
       %la ligne est 'actif'
       if strcmp(TXT(i),'actif')
           %quel type de delai
           switch TXT(i+1)
              case 'Delai0'
                  if strcmp(TXT(i+2),'Oui')
                     matactifdelai0oui=[matactifdelai0oui;NUM(i-1) NUM(i) NUM(i+1) NUM(i+2)];
                  else %c'est non
                     matactifdelai0non=[matactifdelai0non;NUM(i-1) NUM(i) NUM(i+1) NUM(i+2)];
                  end
              case 'Delai1'
                  if strcmp(TXT(i+2),'Oui')
                     matactifdelai1oui=[matactifdelai0oui;NUM(i-1) NUM(i) NUM(i+1) NUM(i+2)];
                  else %c'est non
                     matactifdelai1non=[matactifdelai0non;NUM(i-1) NUM(i) NUM(i+1) NUM(i+2)];
                  end
              case 'Delai2'
                  if strcmp(TXT(i+2),'Oui')
                     matactifdelai2oui=[matactifdelai0oui;NUM(i-1) NUM(i) NUM(i+1) NUM(i+2)];
                  else %c'est non
                     matactifdelai2non=[matactifdelai0non;NUM(i-1) NUM(i) NUM(i+1) NUM(i+2)];
                  end
           end
       end
    end
    Plutôt que de refaire plusieurs fois le même test il vaut mieux imbriquer les IF.
    Et quand tu as plus de 2 tests l'utilisation du SWITCH permet aussi d'y voir plus clair.


    Je continue mais n'hésite pas à regarder de ton côté

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Oui, je m'en étais pas rendu compte ,et puis aussi j'avais créé 6 variables qui servaient à rien...

    merci encore(je commence à voir les automatismes qu'il me faudrait récupérer)

  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
    Et en plus condensé (non testé il peut y avoir des trucs où je suis pas complètement sure) :
    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
    %on commence par créer les matrices qui vont contenir les tout les temps de
    %chaque essais en fonction de la réponse et du délais
    %le nombre de lignes dans le fichier log (multiples de 4) donné par la
    %fonction:
    n=length(NUM);
     
    %On va faire une seule matrice la ligne i correspondra à delai[i-1] et colonne 1 = oui, colonne 2=non
    MatRes = cell(3,2);
     
    for i=2:4:n
       %la ligne est 'actif'
       if strcmp(TXT(i),'actif')
           %quel type de delai
           numLig = textscan(TXT(i+1),'Delai%d'); %doit normalement récupérer le numéro
           numCol = strmatch(TXT(i+2),{'Oui','non'}); %numCol=1 si Oui, 2 si non
           MatRes{numLig,numCol} = [MatRes{numLig,numCol};NUM(i-1) NUM(i) NUM(i+1) NUM(i+2)];
       end
    end
    %On accède donc à la matrice résultat par exemple pour delai1 et Oui :
    MatRes{2,1}
    %ATTENTION : la casse est prise en compte dans les comparaisons de chaines de caractères

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Merci de toute ces pistes que je vais tester sans attendre

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

Discussions similaires

  1. Aide pour traduire un Batch en Shell (explication du batch)
    Par clémsdos dans le forum Shell et commandes POSIX
    Réponses: 7
    Dernier message: 03/09/2014, 23h26
  2. [AppleScript] Aide pour traduire un Batch en AppleScript (explication du batch)
    Par clémsdos dans le forum AppleScript
    Réponses: 2
    Dernier message: 28/08/2014, 21h37
  3. [XCode] Aide pour traduire un Batch en Xcode (explication du batch)
    Par clémsdos dans le forum XCode
    Réponses: 1
    Dernier message: 26/08/2014, 00h43
  4. Réponses: 5
    Dernier message: 24/03/2011, 16h56
  5. Réponses: 8
    Dernier message: 18/09/2007, 11h00

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