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 :

Calculer la somme des éléments positifs d'une matrice par 2 méthodes


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 19
    Points : 11
    Points
    11
    Par défaut Calculer la somme des éléments positifs d'une matrice par 2 méthodes
    Bonjour à tous

    Je me casse beaucoup la tête à essayer de résoudre le problème suivant:

    Écrire une fonction qui calcule la somme des éléments positifs d’un vecteur en utilisant deux méthodes
    différentes.

    Comme préconditions, on a la donnée suivante:

    Lors de l’appel de la fonction le paramètre d’entrée est un vecteur.

    Le traitement est le suivant:

    Le nom du fichier fonction est: possum.
    Première ligne de la fonction: function SP=possum(x).
    La fonction utilise d’abord des boucles et des conditions afin de déterminer la somme des éléments
    positifs du vecteur x.
    La fonction utilise ensuite la commande find.
    La structure switch est utilisée pour passer d’une méthode de solution à l’autre.
    La somme est assignée dans SP, le paramètre de sortie de la fonction.

    Les post-conditions sont les suivantes:

    Lors de l’exécution de la fonction le paramètre de sortie de la fonction est la somme des
    éléments positifs du vecteur d’entrée. Il ne doit y avoir aucun autre affichage provenant
    de l’exécution de la fonction.

    En guise d'exemple, pour vérifier si la fonction marche, l'enseignant nous demande de vérifier nos affaires avec un autre fichier script, dans lequel on va rentrer un vecteur et on l'écrit de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    somme=possum([15 -6 0 8 -2 5 4 -10 0.5 3])

  2. #2
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 19
    Points : 11
    Points
    11
    Par défaut Ce que j'ai de fait à date
    Étant donné que je n'arrives pas à la bonne réponse par la première méthode, je n'ai pas encore utilisé la fonction «Switch».

    J'ai juste créé, dans le script «possum» la boucle qui calcule la somme et ça ne marche pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function SP=possum(x)
    n=length(x);
    for k=1:n
        if x(k)>0
            SP=sum(x);        
        elseif x(k)<0
            SP=0;     
        end
    end

    On est supposé, en écrivant dans un autre script la chose suivante ,arriver à une réponse de 35.500 et j'arrives à 17.500:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    somme=possum([15 -6 0 8 -2 5 4 -10 0.5 3])

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 134
    Points : 129
    Points
    129
    Par défaut
    Essaie ceci, ou X est ton vecteur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >> sum(find(X<0));
    >> sum(fin(X>=0));
    Au taf : Quad Core/8Go de RAM sous Win Seven 64 - Matlab 2009b 64bit.
    Perso : Core 2 Duo/8Go de RAM Mac OS X 10.6 - Matlab 2009b 64bit

  4. #4
    Membre éclairé Avatar de tubaas
    Homme Profil pro
    Acousticien
    Inscrit en
    Août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Points : 825
    Points
    825
    Par défaut
    salut
    tu aurais du te rendre compte par toi-même que tu obtenais la somme totale du vecteur, ce qui est logique puisque ton dernier élément est positif. tu aurais obtenu 0 s'il avait été négatif.
    il faut essayer de voir d'où vient le problème (en essayant divers cas) et de le comprendre pour le résoudre

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Salut à tous

    Oui, j'ai remarqué que la fonction faisait la somme de tous les éléments. Je n'ai pas compris pourquoi et là je viens de comprendre grâce à tubaas.

    J'ai essayé avec sum(x>0) et j'arrives déjà beaucoup plus près de la réponse, sauf qu'au lieu d'arriver à 35.500 j'arrives à 37

  6. #6
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function SP=possum(x)
    n=length(x);
    for k=1:n
        if x(k)>0
            SP=sum(x);        
        elseif x(k)<0
            SP=0;     
        end
    end
    Mais plutot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function SP=possum(x)
    n=length(x);
    sm = 0 ;
    for k=1:n
        if x(k)>0
            sm=sm + x(k);        
        end
    end
    SP=sm ;
    et pour l'autre solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    >> sum(x(find(x>0)))
     
    ans =
     
       35.5000
    Au final tu auras 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
    >> x=[15 -6 0 8 -2 5 4 -10 0.5 3] ;
    >> 
    >> n=length(x);
    sm = 0 ;
    for k=1:n
        if x(k)>0
            sm=sm + x(k);       
        end
    end
    SP=sm 
     
    SP =
     
       35.5000
     
    >> 
    >> sum(x(find(x>0)))
     
    ans =
     
       35.5000
     
    >>
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  7. #7
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 19
    Points : 11
    Points
    11
    Par défaut Merci énormément
    Merci beaucoup. Je viens de comprendre pourquoi j'étais complètement dans le champ.

    Il ne me reste qu'à plugger la commande "switch" et je vous redonne des nouvelles dès que ça va être fait puisque je ne l'ai pas encore essayé.

  8. #8
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 19
    Points : 11
    Points
    11
    Par défaut Découragement
    Plus ça avance, plus je me rends compte que j'ai de la misère avec ce logiciel.

    Présentement, je suis un cours à l'Université qui nous initie au logiciel et ayant manqué 2 cours qui portaient sur la programmation (les boucles et tout le kit), je ne peux pas comprendre tout, malgrès que mon livre est quand même bien fait.

    Regardez, par exemple comment que j'ai inséré la commande switch dans mon problème (en essayant de suivre un exemple du livre) :

    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
    function SP=possum(x)
    n=length(x);
    Methode='1';
    sm=0;
    for k=1:n
        switch Methode
            case'1'
        if x(k)>0
            sm=sm+x(k); 
              SP=sm;
        end
        Methode='2';
            case'2'
                SP=sum(x(find(x>0)));
        end
     
    end
    SP=sm;


    Je vois tout de suite qu'il y a de quoi de vraiment louche dans mon script mais ne comprenant pas comment la commande marche, j'ai simplement bloqué. Le résultat qui s'affiche dans la fenêtre de commandes et 15. Je soupçonnes donc une erreur au niveau de «Methode='1'».


    De plus, si je me fies à la définition de la commande switch, il faudrait que je termine par «Otherwise» et un groupe de commandes. Je suis complètement perdu.

  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 830
    Points
    14 830
    Par défaut
    Argh !

    Déjà tu devrais indenter proprement ton code, tu aurais visuellement quelques informations (CTRL+A puis CTRL+I dans l'éditeur de MATLAB)

    Ce que fais ton code c'est :
    - au 1er tour méthode ='1' il rentre dans le 1er case et tu mets alors Methode à '2'
    - tous les tours suivants il rentre dans le 2ème case

    Je ne pense pas que ce soit ce que tu veux.
    D'ailleurs je ne comprends pas ce que tu veux

    A mon avis l'objectif est plutôt de choisir la méthode au début (avant les boucles) et de s'y tenir jusqu'à la fin et de changer dans le code.

    Je ne comprends pas pourquoi tu utilises des chaines de caractères (même si ça fonctionne), tu peux faire plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Methode=1; % a modifier en 2 pour changer de methode
    switch Methode
    case 1
       %bla1
    case 2
       %bla2
    end
    Le OTHERWISE est facultatif.

    Je pense que c'est dommage que LA solution avec SUM t'ait été donnée dès le départ.

    Pour moi il faut commencer d'abord par la méthode cumulative.
    pseudo-code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    somme = 0
    pour i=1 a taille(x)
       si x(i)>0
          somme = somme+x(i)
       finsi
    finpour
    La méthode avec FIND qui permet de trouver les éléments positifs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    somme = 0
    idx = find(x>0)
    xpos = x(idx)
    pour i=1 a taille(xpos)
       somme = somme+xpos(i)
    finpour
    Règles du Forum

    Adepte de la maïeutique

  10. #10
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Problème résolu. Je viens de comprendre

  11. #11
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Merci à tous

  12. #12
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Tu voulais plusieurs façon de calculer la somme, alors en voici une autre; une autre méthode comme je l'ai proposé précédemment mais en utilisant une boucle et la commande sum :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function SP=possum(x)
    n=length(x);
    xp=0 ;
    for k=1:n
        if x(k)>0
            xp=[xpsm x(k)];        
        end
    end
    SP=sum(xp) ;
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

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

Discussions similaires

  1. calculer la somme des éléments d'un vecteur
    Par Chefcou dans le forum Général Python
    Réponses: 9
    Dernier message: 30/05/2012, 13h54
  2. [Turbo Pascal] Déterminant d'une matrice par la méthode des mineurs principaux
    Par afmimra dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 18/12/2009, 22h17
  3. Réponses: 2
    Dernier message: 11/08/2009, 13h48
  4. somme des éléments d'une matrice
    Par virginie999 dans le forum MATLAB
    Réponses: 3
    Dernier message: 13/06/2008, 21h14
  5. 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