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 :

Script pour calcul de somme de valeurs avec règle [Débutant]


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2014
    Messages : 23
    Points : 7
    Points
    7
    Par défaut Script pour calcul de somme de valeurs avec règle
    Bonjour,

    J'ai une matrice de données remplie de 0 ou de 0.2. J'aimerai que matlab me sorte pour chaque colonne la somme des valeurs successives (delta) des 0.2. Exemple : col1 = 0 0.2 0.2 0 0 0.2 0.2 0.2 ; result_col1= 0.4 0.6 etc. J'ai écrit un script qui marche très bien qui me calcule ce que je veux sans problème (cf. dessous). Premier petit souci : comment faire en sorte que mon script passe à la colonne d'après et crée une seconde colonne correspondante dans mon fichier résultat (ici d) et ainsi de suite jusqu'à finir ma matrice ?

    Et ensuite, ce que j'aimerai c'est ajouter une règle disant que "si tu vois moins de cinq zéros successifs tu l'ignores, tu ne remets pas ton compteur à zéro pour le calcul du prochain delta". Dans le script ci-dessous, le calcul d'un delta s'arrête dès qu'il voit un 0 après un 0.2.

    Merci d'avance pour votre aide.

    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
     
    T = importdata('data.xls')   
    T= T.Feuil1;
     
    d(1,:) = zeros(1,size(T,2));   
    j=1;   
     
     
    for individu=1:size(T,2)        
     
        for i=1:size(T,1);             
            if T(i,individu)== 0.2 || any(T(1:i))==0    
                d(j,individu) = d(j,individu)+T(i,individu);
            elseif T(i)==0 && T(i-1)== 0.2     
                j= j+1;
                d(j,individu) = 0;
            end
        end
        j=1;
    end

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2014
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Je ne sais pas si je vais être lu et entendu mais je tente quand même. J'ai réécrit mon précédant script pour faire ce que je lui demande (cf. condition mentionnée dans le message précédant). Le voici :

    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
    clc; 
    T = importdata('data_jana.xls');
     result = cell(1, size(T,2));
     
    for col = 1:size(T,2)
        %// Get length-value pairs
        [lengths, values] = runLengthEncode(T(:,col));
        %// Compute all deltas
        deltas = 0.2*lengths(values == 0.2);
        %// Remove deltas following 5 zeros
        idxFiveZeros = find(lengths > 4 & values == 0, 1);
        if(isempty(idxFiveZeros))
            idxFiveZeros = numel(lengths);
        end
        deltas = deltas(1:sum(values(1:idxFiveZeros) == 0.2));
        %// Store result for column
        result{col} = deltas;
    end
    Avec ce code y'a pas de message d'erreur. Le problème est que dès qu'il trouve cinq 0 consécutifs, il stoppe le calcul des deltas de toute la colonne. Comment y remédier? Merci pour votre aide.

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Bonjour,

    qu'est-ce que tu entends par il stop le calcule? je ne vois pas de condition qui ferait sortir de ta boucle prématurément dans ton code.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2014
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Gooby Voir le message
    Bonjour,

    qu'est-ce que tu entends par il stop le calcule? je ne vois pas de condition qui ferait sortir de ta boucle prématurément dans ton code.
    La boucle est bonne puisqu'il check toutes les colonnes.
    En fait, lorsque je regarde les résultats une fois le script lancé, il n'y aucun calcul de deltas dans certaines colonnes alors que dans ces colonnes il y'a des valeurs entrecoupées de moins de 5 zéros. Par exemple: la colonne 1 elle débute par dix zéros puis y'a des 6 valeurs 0.2 qui se suivent puis deux zéros qui les séparent des précédentes. et si je regarde le résultat en lancant le script, il m'affiche pour cette colonne 0 alors qu'il y'a bien des valeurs qu'il doit additionner.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2014
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    Alors j'ai changé totalement mon code. Le voici:

    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
    T = importdata('data_jana.xls');
     
    result = cell(1, size(T,2));
    for icol = 1:size(T,2);
        nzeros = 0;
        delta = 0;
        deltas = [];
        for el = T(:, icol);
            if el==0
                nzeros = nzeros + 1;
                if nzeros==5
                    deltas = [deltas, delta];
                    delta = 0;
                end
            else
                delta = delta + el;
                nzeros = 0;
     
            end
        end
        if nzeros<5
            deltas = [deltas, delta];
            delta = 0;
        end
        disp(deltas);
        result{icol} = deltas;
    end
    Reste que maintenant il ne calcule pas les deltas... Je ne vois pas où est le pb avec ce script. Help!

  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 316
    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 316
    Points : 52 948
    Points
    52 948
    Par défaut
    Pourrais-tu nous fournir le fichier xls ?

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2014
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Dut Voir le message
    Pourrais-tu nous fournir le fichier xls ?
    Bien sûr. Le voici.
    Ce n'est qu'une partie du fichier. L'original est trop grand pour être uploadé.

    Merci
    Fichiers attachés Fichiers attachés

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    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 316
    Points : 52 948
    Points
    52 948
    Par défaut
    Voici un code qui te donnera le nombre de 0 et de 0.2 pour chaque colonne du fichier Excel :

    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
    T = importdata('data_jana.xls');
     
    allDeltas = cell(1,size(T,2));
     
    for n = 1:size(T,2)
     
        nonZerosSize = nonzeros2(T(:,n).');
        zerosSize = nonzeros2(~T(:,n).');
     
        allDeltas{n} = zeros(numel(nonZerosSize)+numel(zerosSize),1);
     
        if T(1,n)==0
            allDeltas{n}(1:2:end) = zerosSize;
            allDeltas{n}(2:2:end) = nonZerosSize;
        else
            allDeltas{n}(1:2:end) = nonZerosSize;
            allDeltas{n}(2:2:end) = zerosSize;
        end
     
    end
    Tu pourras récupérer la fonction nonzeros2 ici : Taille et nombre d'éléments non zéros dans un vecteur

    Pour la première colonne, tu obtiens :

    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
    >> allDeltas{1}
     
    ans =
     
             637
              10
             902
            1728
             230
             191
              38
             561
              94
             281
            2735
              21
             981
             363
             548
            1905
               1
             186
              11
              57
               5
              25
               4
              70
              46
               6
              44
               5
              37
             116
             291
             320
               1
            2839
             217
             258
            1005
             266
             197
               9
               2
              24
               2
               3
               5
             724
    Il y a donc 637 "0" suivis de 10 "0.2" puis 902 "0", puis 1728 "0.2"…

    En ajoutant un test pour savoir si la première valeur de la colonne est "0" ou "0.2", tu devrais pouvoir résoudre ton problème.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2014
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    Merci @Dut pour ton aide.

    J'ai trouvé plus simple ce matin en remplaçant la ligne 8 du code

    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for r = 1:numel(T(:, icol))
            el = T(r, icol);
    et ça fonctionne comme je le veux.

    Merci encore.

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

Discussions similaires

  1. [Débutant] Petit problème pour calcul de somme
    Par kriskikout dans le forum Ada
    Réponses: 4
    Dernier message: 04/11/2006, 06h47
  2. Réponses: 7
    Dernier message: 02/11/2006, 19h05
  3. Réponses: 3
    Dernier message: 24/08/2006, 11h56

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