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 :

Soustraction entre valeur d'un vecteur


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 27
    Points : 23
    Points
    23
    Par défaut Soustraction entre valeur d'un vecteur
    Bonsoir;
    Voilà, j'ai un problème que j'arrive pas résoudre. J'ai galéré toute la journée.
    J'explique :
    J'ai un vecteur ligne qui comporte des valeurs, j'utilise la fonction "unique" qui renvoie les résultats uniques triés par ordre croissant plutôt que par ordre d'apparition. Voilà mon vecteur
    V=[10 10 11 11 12 12 12 13 13 14 14 14 15 15 16 16 17 17 18 18 18 19 20 20 20 21 22 22 23 23 23 24]

    Je cherche à faire la soustraction entre la 2ieme valeur et la première puis entre la 3ieme et la première puis entre la 4ieme et la première ... ainsi de suite jusqu'à se que l'écart soit égale à 3 se qui veut dire l'écart entre la 8ieme et la première valeur et de localiser la position de cette valeur (8ieme), puis recommencer mais cette fois ci en commençant à la 8ieme valeur en faisant la soustraction entre la 9ieme et la 8ieme puis la 10ieme et la 8iem jusqu'à se que l'écart soit égale à 3 et de localiser cette valeur, ainsi de suite jusqu'à la fin.

    Je vous remercie

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Une solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    V=[10 10 11 11 12 12 12 13 13 14 14 14 15 15 16 16 17 17 18 18 18 19 20 20 20 21 22 22 23 23 23 24];
     
    L = length(V);
    k = 2;
    last = V(1);
    positions = [];
    while k<=L
       if (V(k) - last == 3)
          positions = [positions k];
          last = V(k);
       end
       k = k+1;
    end
    positions

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 27
    Points : 23
    Points
    23
    Par défaut
    Effectivement, c'est la solution et ça marche, merci infiniment .
    Sinon et si c'est possible,si vous pouvez m'expliquer le programme parce que je n'ai pas compris

  4. #4
    Invité
    Invité(e)
    Par défaut
    Quelle partie n'as-tu pas comprise ? Est-ce la syntaxe qui te pose problème ?

    Le code commenté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    V=[10 10 11 11 12 12 12 13 13 14 14 14 15 15 16 16 17 17 18 18 18 19 20 20 20 21 22 22 23 23 23 24];
     
    L = length(V);  % Nombre de valeurs
    k = 2;          % On commence par effectuer la soustraction avec la 2ème valeur
    last = V(1);    % dernière valeur à soustraire => première valeur pour commencer
    positions = []; % vecteur où seront stockées les positions (vide au début)
    while k<=L      % Tant que nous n'avons pas atteint la fin
       if (V(k) - last == 3)   % Si l'écart est de 3 : 
          positions = [positions k];   % On ajoute la position au vecteur
          last = V(k);                 % On met à jour la dernière valeur à soustraire
       end
       k = k+1;     % Valeur suivante
    end
    positions

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Salut, intéressant problème.

    Je me suis posé alors la question en prenant un vecteur V un peu plus grand (10000 éléments).

    Sans vouloir vexer Winjerome, j'aimerai proposer une petite amélioration à son code, amélioration qui vise à stopper la boucle dès que l'écart est supérieur à 3 (le vecteur V étant trié et si j'ai bien compris le pb, ...) donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    while k<=L      % Tant que nous n'avons pas atteint la fin
       Tmp = V(k) - last;
       if ( Tmp >= 3)   % Si l'écart est supérieur ou egal 3 :
          if ( Tmp == 3 )
             positions_2 = [positions_2 k];   % On ajoute la position au vecteur
             last = V(k);                 % On met à jour la dernière valeur à soustraire
          else
             break
          end
       end
       k = k+1;     % Valeur suivante
    end
    Après je me suis posé donc la question pour les vecteurs de grande taille. Cette solution n'utilise pas la force de Matlab qui est de travailler vectoriellement. Je vous propose donc cette version un peu tordue pour la solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Pas = 3;
    % Recherche des uniques et seul premiere occurrence
    [ VUniq, IndV ] = unique( V, 'first' );
    % Recherche des indices des elements dont la diff avec le 1er element est multiple de "Pas"
    IndV = IndV( mod( VUniq - VUniq(1) , Pas ) == 0 );
    % Restriction à une diff egale à "Pas"
    Tmp = ( diff( V(IndV) - V(1) ) > Pas );
    % On s'arrete des la premiere difference supérieur à pas
    positions_3 = IndV( 2 : find( Tmp, 1, 'first' ) );
    J'ai testé avec quelques tic/toc pour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    VElmtNb = 10000;
    VElmtPlage = 2000;
    V=sort( round( VElmtPlage * rand(1,VElmtNb) ) );
    Quelques avis ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 27
    Points : 23
    Points
    23
    Par défaut
    Bonjour,
    Le code que je chercher c'est celui proposer par Winjérome et je me permet de te remercier encore une fois pour l'explication.
    Le code que vous avez proposez FDvlpmt, s’arrête à la première, donc pas se que je chercher a faire .
    Moi j'avais des valeurs réelles et non pas des entiers donc il à fallut que je change juste cette ligne :
    if (V(k) - last >= 3)
    Se qui fait que, dés l'écart est supérieur ou égal 3. De cette façon il est plus générale.
    Si non je vous remercie aussi

  7. #7
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    En effet, le code écrit recherche une différence stricte égale à 3 (Pas) comme cela était expliqué dans le problème initial.
    Ce que je comprends avec votre dernière intervention, c'est que l'on cherche une différence supérieur ou égale à 3 et non juste égale à 3. Là, le code fourni, ne pourra en effet répondre à votre besoin.
    Pas grave.

    Cela dit, mon intervention était aussi pour rappeler qu'il faut de préférence éviter les boucles sur les vecteurs surtout quand ceux-ci sont de grande taille.

    A un prochain problème alors.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 27
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    Effectivement oui à cause du temps.
    Si la différence rechercher été fixe, il serait plus judicieux de travailler avec le code que vous avez proposer.

    Salutations.

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

Discussions similaires

  1. [Débutant] permutation entre 2 valeurs dans un vecteur
    Par Riham Darine dans le forum MATLAB
    Réponses: 4
    Dernier message: 22/04/2011, 00h48
  2. select d'une soustraction entre 2 valeurs puis insert
    Par vinch999 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/04/2011, 16h23
  3. Réponses: 2
    Dernier message: 22/01/2006, 01h11
  4. Soustraction entre deux dates
    Par franculo_caoulene dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 20/01/2006, 10h59
  5. Soustraction entre 2 tables...
    Par Mathouxxx dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/10/2005, 22h38

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