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 :

Index des valeurs les plus proches


Sujet :

MATLAB

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur en analyse décisionnelle
    Inscrit en
    Juin 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en analyse décisionnelle

    Informations forums :
    Inscription : Juin 2013
    Messages : 113
    Points : 133
    Points
    133
    Par défaut Index des valeurs les plus proches
    Bonjour,

    Je suis à la recherche d'une astuce pour trouver une liste d'index des valeurs les plus proches.

    Soit un vecteur ligne A contenant un très grand nombre de valeurs (par exemple 10 000).

    Soit un vecteur ligne B contenant un très grand nombre de valeurs (par exemple 50 000).

    Comment trouver les 10 000 index du vecteur B correspondant chacun à une des 50 000 valeurs du vecteur B les plus proches pour chacune des 10 000 valeurs du vecteur A.

    L'astuce la plus simple et évidente consiste à effectuer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [~,imin] = min(abs(A-B'));
    Mais cela implique la création d'une matrice 50 000 x 10 000. Cette astuce n'est donc pas appropriée à ces grands vecteurs.

    J'aimerais minimiser les itérations par boucles pour une meilleure rapidité d'exécution.

    Merci,

    Éric

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Bonjour,

    Je suis loin de pouvoir réellement t'aider mais bon je peux toutefois partager quelques idées : tu pourrais par exemple essayer de faire un code où A et B ont même taille. On peut imaginer que tu rajoutes des 0 à A, en l’occurrence 40000 zéros après les 10000 premières valeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A1=zeros(size(B,1),1);
    A1(1:size(A))=A;
    Ainsi A1 et B ont même taille : 50000. Tu peux ensuite récupérer les positions indicielles non nulles de A1 qui sont en fait les valeurs de A :

    Ensuite il faudrait essayer de réaliser une boucle sur i variant de 1 jusqu'à la taille de A3 et essayer de déterminer les positions que tu veux. Malheureusement, quelque chose comme ce qui suit ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    A4=[];
    for i=1:size(A3,1)
        A4=[A4;find(min(abs(B-A1(A3(i)))))];
    end
    Dans A4 on doit retrouver les indices qui t'intéresse mais cela ne marche pas avec la fonction find. Enfin bon, c'est à adapter en écrivant éventuellement une ou d'autres fonctions.

    J'ignore si cela t'aide un peu.

    EDIT:

    Ceci ne passe pas non plus chez moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A4=[];
    imin=[];
    for i=1:size(A3,1)
        [A4,imin]=min(abs(B-A1(A3(i)));
    end

  3. #3
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    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 318
    Points : 52 958
    Points
    52 958
    Par défaut
    Le code suivant ne prend "que" 1 seconde sur mon portable équipé d'un simple Intel Core i5 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    A = rand(1,10000);
    B = rand(1,50000);
     
    imin = zeros(1,10000);
    for n = 1:10000    
        [~,imin(n)] = min(abs(A(n)-B));    
    end

Discussions similaires

  1. Mise en forme cellules des valeurs les plus proches
    Par fherolvera dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/02/2012, 11h57
  2. [MySQL] Extraction valeur les plus proches MySQL
    Par lelectronique.com dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 03/07/2011, 19h07
  3. [XL-2003] MACRO pour rechercher les 2 valeurs les plus proches
    Par Tchibe dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/06/2010, 16h04
  4. [MySQL] Extraire les 50 valeurs les plus proches d'un entier
    Par denis.ws dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 19/01/2007, 09h42

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