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 :

Remplacer "ismember" pour plus rapide


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénierie en automatisation et systèmes intelligents
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénierie en automatisation et systèmes intelligents
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 38
    Points
    38
    Par défaut Remplacer "ismember" pour plus rapide
    Bonjour,

    Je cherche à remplacer "ismember" par une technique plus rapide. Supposons que j'aie un vecteur de N valeurs et un vecteur de M valeurs, je veux connaître les indices de N où il y a une des valeurs de M.

    Autrement dit :

    Cependant, voilà que pour N = 100 valeurs et M = 10 valeurs, je peux faire beaucoup plus rapide :

    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
    clear all;
    close all;
    clc;
     
    n = 100;
    a = randperm(n);
    b = ceil(rand(1,ceil(n/10))*n);
    na = numel(a);
    nb = numel(b);
     
    all(logical((sum(ones(nb,1) * a == b' * ones(1,na),1))) == ismember(a,b))
     
    pause(1);
     
    tic;
    for i=1:1e5
        logical(sum(ones(nb,1) * a == b' * ones(1,na),1));
    end
    toc;
     
    pause(1);
     
    tic;
    for i=1:1e5
        ismember(a,b);
    end
    toc;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Elapsed time is 1.049054 seconds.
    Elapsed time is 5.080566 seconds.
    Cependant, cela reste vrai pour N et M plus petits que 100. Autrement, la multiplication que j'effectue devient trop lourde (NB : Cette multiplication est plus rapide que "repmat"). En fait, si N = 100 et M = 100, "ismember" devient un peu plus rapide, mais si N = 100 et M = 50, je suis tout de même encore pratiquement deux fois plus rapide que "ismember".

    N'y a-t-il pas moyen de faire simple et rapide, du style N(N==M) ? Ce qui ne fonctionne pas puisque M n'est ni un scalaire, ni de même dimension que N et s'il l'était, ça ne fonctionnerait pas plus puisque c'est une comparaison élément par élément.

    Bref, je fais la guerre aux boucles "for". "ismember" contient d'ailleurs une boucle "for".

    Merci,

    Éric

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

    Je te suggère la fonction bsxfun, ainsi que la fonction non documentée ismembc.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénierie en automatisation et systèmes intelligents
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénierie en automatisation et systèmes intelligents
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    Je n'ai pas trouvé de façon d'utiliser "bsxfun", peut-être auriez-vous une idée ?

    Autrement, j'ai essayé "ismembc" et malgré les quelques étapes de plus et la nécessité d'utiliser "sort", cette fonction s'avère plus rapide.

    Bref, merci pour cette découverte.

    Si vous avez d'autres idées, je vous en serais reconnaissant.

    Éric

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