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 :

vlookup problème de temps de calcul


Sujet :

MATLAB

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut vlookup problème de temps de calcul
    Bonjour à tous,

    Je viens vous demander votre avis,

    J'utilise la fonction vlookup (équivalent de excel) que j'ai trouvé sur internet.

    Le problème c'est qu'elle est très très très lente, il me faut plus de 24h pour faire la moitier de mon calcul.

    Alors ce que je cherche à faire est relativement simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    S1 = 
    Date1 ValeurS1
    Date2 ValeurS1 
    Date3 Valeur S1 
    Date4 ValeurS1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    S2 = 
    Date2 ValeurS2
    Date3 ValeurS2
    Date4 ValeurS2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    S3 = 
    Date4 ValeurS3
    Et obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    C= 
    Date1   ValeurS1        NaN              NaN 
    Date2   ValeurS1        ValeurS2       NaN 
    Date3   ValeurS1        ValeurS2       Nan
    Date4   ValeurS1        ValeurS2      ValeurS3
    Avec NaN ou 0 si il n'y a pas de valeur.

    Vlookup le fait relativement bien, mais c'est une perte de temps en calcul.

    Une idée ? Merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Pourrais-tu nous montrer ce que contiennent exactement S1, S2 et S3 (juste quelques lignes) ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Oui les S ressemble à ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    7534859 0.5 
    7534860 0.685 
    7534861 0.745
    7534862 0.58
    Voila dans la première colonne ce sont les dates au format matlab, et dans le second des nombres décimaux.

    Merci pour votre aide

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Essaie ceci :
    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
    S1 = [7534859 0.5
        7534860 0.685
        7534861 0.745
        7534862 0.58];
    S2 = [7534860 1.685
        7534861 1.745
        7534862 1.58];
    S3 = [7534862 2.58];
     
    udate = unique([S1(:,1) ; S2(:,1) ; S3(:,1)]);
     
    C = NaN(numel(udate), 4);
     
    C(:,1) = udate;
     
    idx = ismember(udate, S1(:,1));
    C(idx,2) = S1(:,2);
     
    idx = ismember(udate, S2(:,1));
    C(idx,3) = S2(:,2);
     
    idx = ismember(udate, S3(:,1));
    C(idx,4) = S3(:,2);
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Merci beaucoup j'ai âs précisé que ça ouvre en boucle les S, je ne les aient pas dans mon workspace j'ai essayé de modifier un peu ton code, mais je ne vois pas trop comment faire la partie finale, actuellement je ne peux pas le lancer car j'ai mon ancien code qui tourne depuis des heures et je voudrais être certain d'avoir quelque chose de plutôt fonctionel pour pas avoir à relancer mon vieux 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
    for i = 1:numel(list) %J'ai 2000 S à ouvrir, depuis un dossier, je mets pas tous le code pour l'ouvrir, mais admetons que pour chaque pas  de la boucle ça me donne un S puis  un autre S au second pas et ainsi de suite  S = [7534859 0.5
        7534860 0.685
        7534861 0.745
        7534862 0.58];
    
    udate = 0 %Initialisation 
    
    udate = unique([udate ; S(:,1)]);
    
    C = NaN(numel(udate), numel(list) );
    
    C(:,1) = udate;
    
    %là je ne vois pas comment gérrer ça dans une boucle ? 
    idx = ismember(udate, S1(:,1));
    C(idx,2) = S1(:,2);
    
    idx = ismember(udate, S2(:,1));
    C(idx,3) = S2(:,2);
    
    idx = ismember(udate, S3(:,1));
    C(idx,4) = S3(:,2);
    
    end

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Comme ceci ?

    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
    udate = [];
    
    for i = 1:...
    
        S = ...;
    
        udate = unique([udate ; S(:,1)]);
        
    end
    
    C = NaN(numel(udate), 4);
    C(:,1) = udate;
    
    for i = 1:...
            
        S = ...;  
             
        idx = ismember(udate, S(:,1));
        C(idx,i+1) = S(:,2);
        
    end
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Je viens d'essayer et ça me sort que des NaN dans toutes les colonnes, je sais pas si c'est moi qui ai mal adapté ton code au miens (qui est plutôt lourd) ou si c'est un bug.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    J'ai mis en rouge les bouts de cote intégrer

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    
    for k=1:numel(list_spread) %Nombre de ligne des spread pour une contrepartie
        
        
        chemin_spread = fullfile(repertoire_mother_spread, list_spread(k,1).name);%Chemin d'acc?s des spreads de chaque contrepartie
        list_total= dir(fullfile(chemin_spread)); %Liste total des spreads pour chaque contrepartie
        list_total( strncmp({list_total.name}, '.', 1) ) = [];  %enl?ve les 2 premi?res valeurs qui sont ds points
        o=0;
        
        for p=1:numel(list_total) %Boucle pour le nombre total de spread de chaque contrepartie
    
            if isempty(strfind(list_total(p,1).name,'SUB'))==1
            nom_spread_test = sscanf(list_total(p,1).name, '%3c.txt'); %Ne prend en compte que les spreads MAR
            
            
            if strcmp(nom_spread_test,'MAR')==1
                o=o+1; %Compte le nombre de fois o? un MAR est rencontr? pour une contrepartie don?e
                list_total2(p+q,1).name=list_total(p,1).name; %Cr?ation d'un list_total2 avec tous les spreads MAR pour toutes les contreparties
                
                chemin_spread2 = fullfile(repertoire_mother_spread, list_spread(k,1).name,list_total(p,1).name); %Chemin pour r?cuperer le fichier spread de la contrepartie
                
                fid=fopen(chemin_spread2,'r'); %ID du spread de la contrepartie consid?r?e
                
                M = textscan(fid,'%s %f','TreatAsEmpty','.','HeaderLines',1); %Ouvre le spread
                fclose(fid);
                J=datenum(M{1,1}); %convertie les dates string en format matlab
                Spread=[J,M{1,2}];  %correspond au S dans mon exemple du début, donc pour chaque pas on ouvre un S%Concatene en 1?re colonne les dates matlab, et en seconde les spreads
                udate = unique([udate ; Spread(:,1)]);
    
            end 
                
            end   
       
    
    
    C = NaN(numel(udate), 2000); %le problème va être de ne pas mettre 2000 mais le nombre exact, enfin il suffira que je face une variable qui compte dans la 1ème boucle 
    C(:,1) = udate;
    
    %  for p=1:numel(list_total) %Boucle pour le nombre total de spread de chaque contrepartie
            if isempty(strfind(list_total(p,1).name,'SUB'))==1
            nom_spread_test = sscanf(list_total(p,1).name, '%3c.txt'); %Ne prend en compte que les spreads MAR
            
            
            if strcmp(nom_spread_test,'MAR')==1
                o=o+1; %Compte le nombre de fois o? un MAR est rencontr? pour une contrepartie don?e
                list_total2(p+q,1).name=list_total(p,1).name; %Cr?ation d'un list_total2 avec tous les spreads MAR pour toutes les contreparties
                
                chemin_spread2 = fullfile(repertoire_mother_spread, list_spread(k,1).name,list_total(p,1).name); %Chemin pour r?cuperer le fichier spread de la contrepartie
                
                fid=fopen(chemin_spread2,'r'); %ID du spread de la contrepartie consid?r?e
                
                M = textscan(fid,'%s %f','TreatAsEmpty','.','HeaderLines',1); %Ouvre le spread
                fclose(fid);
                J=datenum(M{1,1}); %convertie les dates string en format matlab
                Spread=[J,M{1,2}]; %Concatene en 1?re colonne les dates matlab, et en seconde les spreads
                
                idx = ismember(udate, Spread(:,1));
                C(idx,2) = Spread(:,2);
        
    
            end 
    
            end

    Bon pour des pros comme vous ça doit vraiment être illisible, c'est un peu de la bidouille.

  9. #9
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Pour commencer, ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nom_spread_test = sscanf(list_total(p,1).name, '%3c.txt'); %Ne prend en compte que les spreads MAR
     
    if strcmp(nom_spread_test,'MAR')==1
    s'écrit plus simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if strncmp(list_total(p,1).name, 'MAR', 3)
    Pour le reste, si j'ai bien compris :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    for k = 1:numel(list_spread)
     
        chemin_spread = fullfile(repertoire_mother_spread, list_spread(k,1).name);
        list_total = dir(fullfile(chemin_spread));
        list_total( strncmp({list_total.name}, '.', 1) ) = [];
     
        o = 0;
        for p=1:numel(list_total)
            if isempty(strfind(list_total(p,1).name,'SUB'))
                if strncmp(list_total(p,1).name,'MAR',3)
     
                    chemin_spread2 = fullfile(repertoire_mother_spread, list_spread(k,1).name,list_total(p,1).name);
     
                    fid = fopen(chemin_spread2, 'r');
                    M = textscan(fid, '%s %*f', 'TreatAsEmpty', '.', 'HeaderLines', 1);
                    fclose(fid);
     
                    J = datenum(M{1});
     
                    udate = unique([udate ; J]);
     
                    o = o+1;
                end
            end
        end
     
        C = NaN(numel(udate), o+1);
        C(:,1) = udate;
     
        o = 1;
        for p = 1:numel(list_total)
            if isempty(strfind(list_total(p,1).name, 'SUB'))
                if strncmp(list_total(p,1).name, 'MAR', 3)
     
                    chemin_spread2 = fullfile(repertoire_mother_spread, list_spread(k,1).name,list_total(p,1).name);
     
                    fid = fopen(chemin_spread2, 'r');
                    M = textscan(fid, '%s %f', 'TreatAsEmpty', '.', 'HeaderLines', 1);
                    fclose(fid);
     
                    J = datenum(M{1,1});
     
                    idx = ismember(udate, J);
                    o = o+1;
                    C(idx,o) = M{1,2};
     
                end
            end
        end
     
    end
    J'ai enlevé le superflu pour y voir plus clair

    Sinon, il y avait une erreur dans mon précédent code (corrigée en rouge dans le message correspondant).
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Merci beaucoup dut, ça m'aide beaucoup, cependant, il reste cette erreur que je n'arrive pas à résoudre :


    Subscripted assignment dimension mismatch.

    Error in Import_spread_script (line 64)
    C(idx,o) = M{1,2};
    idx est de dimension 1101x1 et M{1,2} de dimension 1748x1

    Edit :


    Donc ça veut dire qu'il y'a 1748-1101 = 647 doublons dans les dates.

    Ce qui n'est pas possible, il ne dois pas y avoir de doublons dans le premier vecteur J, mais j'ai verifié avec excel, et j'ai bien 647 doublons, je pense que j'ai un problème pour le formatage des dates de excel à Matlab et que je ne dois pas utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
     J = datenum(M{1});
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (M{1}) = 
    '02/01/08'
    '03/01/08'
    '04/01/08'
    '07/01/08'
    '08/01/08'
    Dopnc j'ai modifié comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
      formatIn = 'dd/mm/yy';
     J = datenum(M{1},formatIn);
    et c'est bon je retrouve bien idx = 1748x1 mais j'ai toujours une erreur que je cherche à identifier.

    par contre quand je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    datestr(J,'dd/mm/yy')
    Il ne me ressort pas les vraies dates ...

    EDIT 2 :

    Donc Maintenant j'ai cette erreur :



    Subscripted assignment dimension mismatch.
    Error in Import_spread_script (line 65)
    C(idx,o) = M{1,2};
    Ce que je ne comprend pas c'est que j'ai les bonnes dimensions.

    EDIT 3 : Je pense que le code peut être simplifié au maximum de cette façon :

    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
    42
     
     
    for k = 1:numel(list_spread)
     
        chemin_spread = fullfile(repertoire_mother_spread, list_spread(k,1).name);
        list_total = dir(fullfile(chemin_spread));
        list_total( strncmp({list_total.name}, '.', 1) ) = [];
     
        o = 0;
        for p=1:numel(list_total)
            if isempty(strfind(list_total(p,1).name,'SUB'))
                if strncmp(list_total(p,1).name,'MAR',3)
     
                    chemin_spread2 = fullfile(repertoire_mother_spread, list_spread(k,1).name,list_total(p,1).name);
     
                    fid = fopen(chemin_spread2, 'r');
                    M = textscan(fid, '%s %*f', 'TreatAsEmpty', '.', 'HeaderLines', 1);
                    fclose(fid);
     
     
                    formatIn = 'dd/mm/yy';
                    J = datenum(M{1},formatIn);
                    udate = unique([udate; J]);
     
                    o = o+1;
     
        C = NaN(numel(udate), o+1);
        C(:,1) = udate;
     
     
        o = 1;
     
     
     
                    idx = ismember(udate, J);
                    o = o+1;
                    C(idx,o) = M{1,2};
     
                end 
            end 
        end
    end
    Mais j'ai toujours ce problème de dimension qui plante, au break point je vois que j'ai
    C = 1748 x 2
    avec en 1ère colonne des dates
    en seconde des NAN
    Que o = 2 donc c'est bon, on est parti pour remplir la seconde colonne
    que Idx = 1748 donc même nombre de ligne que C
    et que M{1,2} fait aussi 1748 lignes.

    Donc tout devrait être bon ?!

  11. #11
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Que renvoi ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    size(J)
    size(C)
    size(M{1,2})
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Bien vu, M ne me sort plus que les dates, il n'y a plus M{1,2}; je l'avais avant, je ne comprend pas je n'ai rien changé à ce niveau.

  13. #13
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Attention, au premier appel de textscan, je ne lis pas les valeurs numériques :

    Si tu veux les lire, il faut supprimer l'astérisque
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Parfait dut c'était ça merci beaucoup, sinon ça tourne là,

    j'espère que ça ira plus vite que le vlookup et que le resultat seront le bon, je reviens quand c'est fini.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Je fais tourner ce code, et je me retrouver avec une matrice C 1748x4986 et uniquement la dernière colonne comprend des valeurs, tous le reste ce sont des NaN.

    Je pense que dans le code que tu m'a donné faire 2 boucle n'est pas bon car dans la première boucle au final on va stocker uniquement la dernière valeur importée, qu'en penses tu ?

    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
      
    
    for k = 1:numel(list_spread)
        
        chemin_spread = fullfile(repertoire_mother_spread, list_spread(k,1).name);
        list_total = dir(fullfile(chemin_spread));
        list_total( strncmp({list_total.name}, '.', 1) ) = [];
        
        o = 0;
        
        for p=1:numel(list_total)
            if isempty(strfind(list_total(p,1).name,'SUB'))
                if strncmp(list_total(p,1).name,'MAR',3)
                    
                    chemin_spread2 = fullfile(repertoire_mother_spread, list_spread(k,1).name,list_total(p,1).name);
                    
                    fid = fopen(chemin_spread2, 'r');
                    M = textscan(fid, '%s %f', 'TreatAsEmpty', '.', 'HeaderLines', 1);
                    fclose(fid);
                    
                    
                    formatIn = 'dd/mm/yy';
                    J = datenum(M{1},formatIn);
                    udate = unique([udate; J]);
                    
                    o = o+1;
                    q=q+o; %permet de garder le décalage après chaque pas de k, si pour k=1 il y'a 5 importation, pour k=2 on commencera à remplir q=6 et non o=1 et donc on aura le bon décallage 
                    C = NaN(numel(udate), q);
                    C(:,1) = udate;
                    idx = ismember(udate, J);
                    
                    C(idx,q) = M{1,2};
                    
                end
            end
        end
    end

  16. #16
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Tu n'as pas compris la méthode que j'utilise. Il faut impérativement deux boucles.

    La première sert uniquement à créer le tableau C avec le bon nombre de lignes (et accessoirement à en remplir la première colonne).
    Le nombre de ligne étant donné par le nombre de dates uniques contenues dans les fichiers.

    La seconde boucle sert à remplir les colonnes 2:end de C
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Je n'avais pas converti le format de date dans la seconde boucle la boucle, j'ai relancé et pas d'erreur pour le moment.

    Ca à l'air de fonctionner hormis le fait que C devrait avoir 2000 colonne mais n'en à que 6.


    Je pense que le problème vient du o, je ne comprend pas pourquoi tu le réinitialise à 0 ?

  18. #18
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Je pense qu'on peut reprendre ton problème depuis le tout début

    Pour commencer, tu as des fichiers txt placés dans différents dossiers et sous-dossiers. Et si j'ai bien compris, tu souhaites traiter tous ces fichiers.

    Dans ce cas, tu dois commencer par faire la liste des fichiers qui contiennent des données utiles (test avec 'SUB' et 'MAR').
    Cela simplifiera le travail par la suite.

    Voila ce que je te propose :

    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
    num = 0;
    for k = 1:numel(list_spread)
     
        chemin_spread = fullfile(repertoire_mother_spread, list_spread(k).name, '*.txt');
        list_total = dir(chemin_spread);
     
        for p = 1:numel(list_total)
            if isempty(strfind(list_total(p).name,'SUB'))
                if strncmp(list_total(p).name,'MAR',3)                
                    num = num+1;
                    chemin_spread2{num} = fullfile(repertoire_mother_spread, list_spread(k).name,list_total(p).name);
                end
            end
        end
     
    end
    Le tableau de cellules chemin_spread2 contient-il au final les chemins vers tous les fichiers avec des données utiles ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Désolé j'ai edité entre temps ....

    Le code à l'air de joliement tourner car j'ai ma matrice C avec les dates en 1ère colonne, et 5 colonne avec des données qui correspondent.

    Mais le problème c'est que je devrais avoir 2000 colonnes, je pense que la boucle les écrases lorsque o est réinitalisé à 0, je regarde ça au breakpoint.

  20. #20
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Crois-moi, même si le code tourne, tu as tout à gagner à tout reprendre depuis le début.
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

Discussions similaires

  1. Réponses: 16
    Dernier message: 26/12/2013, 15h52
  2. Réponses: 2
    Dernier message: 05/07/2010, 14h12
  3. Réponses: 0
    Dernier message: 04/08/2008, 17h05
  4. Réponses: 5
    Dernier message: 09/05/2005, 12h24
  5. temps de calculs extremement long !!
    Par salseropom dans le forum C++
    Réponses: 9
    Dernier message: 19/01/2005, 20h12

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