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 :

Somme cumulée avec conditions


Sujet :

MATLAB

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Master Enérgie
    Inscrit en
    Juin 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Master Enérgie

    Informations forums :
    Inscription : Juin 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Somme cumulée avec conditions
    Bonjour,

    J'ai un vecteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    X=[ 5 2 -4 -6 -2 1 4 2 -3 -6 -1 8 9 5 -6 -11]
    L'objectif est de réaliser une somme cumulée des chiffres négatifs et positifs tant que la somme est inférieure à zero.

    Je suis censé obtenir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Y=[ 0 0 -4 -10 -12 -11 -7 -5 -8 -14 -15 -7 0 0 -6 -17]
    Les conditions à respecter sont :
    -Somme cumulée sur les chiffres négatifs et positifs tant que la somme est inférieure à zero
    -Dès lors que la somme est supérieure à zero, la somme cumulée n'est plus effectuée jusqu'à la prochaine valeur négative.
    -Lorsque la somme est supérieure à zero, la valeur affichée est 0.

    J'ai déjà essayé ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    X = [ 5 2 -4 -6 -2 1 4 2 -3 -6 -1 8 9 5 -6 -11];
     indx = find(X<0);
     Y = [zeros(1,indx(1)-1) cumsum(X(indx(1):end))];
     Y(Y>0) = 0;
    mais le problème est que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Y =
     
      Columns 1 through 15
     
         0     0    -4   -10   -12   -11    -7    -5    -8   -14   -15    -7     0     0     0
     
      Column 16
     
       -10
    Merci de votre aide.

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut Somme cumulée avec conditions
    Bonjour,

    Avec une boucle hélas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    X = [ 5 2 -4 -6 -2 1 4 2 -3 -6 -1 8 9 5 -6 -11];
    X(X(1)>0)=0;
    Y=X;
     for n=2:length(X)
         if sum(Y(n-1:n)) > 0
             Y(n)=0;
         else
             Y(n)=sum(Y(n-1:n));
         end
     end
     Y

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Master Enérgie
    Inscrit en
    Juin 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Master Enérgie

    Informations forums :
    Inscription : Juin 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    Cela fonctionne parfaitement.
    Merci!

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Master Enérgie
    Inscrit en
    Juin 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Master Enérgie

    Informations forums :
    Inscription : Juin 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Re-bonjour,

    Une condition m'avait échappée...
    A chaque nombre positif, il faut appliquer un coefficient de 0.75.

    J'ai essayé :
    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
    a1(a1(1)>0)=0;
    Y=a1;
    eff=0.75;
     
    for m=1:length(a1)
         if Y(m) > 0
             Y(m)=a1(1)*eff;
         end
     for n=2:length(a1)
         if sum(Y(n-1:n)) > 0
             Y(n)=0;
            else
             Y(n)=sum(Y(n-1:n));
         end
     end
     end
    mais ça bloque quelque part.

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    Bonjour,
    Peut-être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    clear
    X = [ 5 2 -4 -6 -2 1 4 2 -3 -6 -1 8 9 5 -6 -11];
    id=find(X>0);
    X(id)=X(id)*0.75;
    X(X(1)>0)=0;
    Y=X;
    for n=2:length(X)
        if sum(Y(n-1:n)) > 0
            Y(n)=0;
        else
            Y(n)=sum(Y(n-1:n));
        end
    end
    Y

Discussions similaires

  1. [XL-2003] Fonction somme cumulée avec condition
    Par roidurif dans le forum Excel
    Réponses: 6
    Dernier message: 27/03/2017, 15h13
  2. [XL-2003] Faire un cumul avec condition.
    Par probexcel dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/06/2009, 09h52
  3. Réponses: 8
    Dernier message: 23/02/2008, 09h49
  4. EXCEL SOMME.SI avec condition sur des dates
    Par cfhal dans le forum Excel
    Réponses: 7
    Dernier message: 15/10/2007, 08h21
  5. Somme.si avec condition sur le debut du texte
    Par Eric80 dans le forum Excel
    Réponses: 11
    Dernier message: 08/07/2007, 14h18

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