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 :

De la bonne utilisation de la valeur "eps"


Sujet :

MATLAB

  1. #1
    Membre expert
    Avatar de Clotho
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2011
    Messages
    1 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 524
    Points : 3 383
    Points
    3 383
    Par défaut De la bonne utilisation de la valeur "eps"
    Salut tout le monde!

    Depuis quelques temps je cherche à optimiser mon utilisation de Matlab, et j'ai vu qu'en temps de calcul je pouvais remplacer quelque chose du type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    If variable1>critère1 && variable2<critère2
    ratio=variable1./variable2
    end
    par un calcul plus efficace en temps machine, du type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ratio=(variable1>critère1).*(variable2<critère2).*variable1./(variable2+eps)
    Dans les codes précédents, "variable" est typiquement une matrice de grande dimension, et les critères de tests peuvent être nuls. Du coup j'ai eu quelques sorties de type NaN.

    J'ai envisagé dans un premier temps de faire un test de type avec quelque chose similaire à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ratio(isnan(ratio),1)=0;
    mais je me suis souvenu que la variable epsilon était aussi employable.

    Si mes souvenirs et ma compréhension de l'aide Matlab sont corrects, epsilon est censé être le plus petit quantième discernable par Matlab (du 10^-beaucoup) et donc ne pas influer sur mes résultats, qui sont de l'ordre de grandeur de l'unité.

    Mais ma question porte sur deux points:

    • Le calcul "en ligne" est-il préférable à la boucle conditionnelle?
    • L'utilisation de "eps" peut-il être préjudiciable?


    Je n'ai pas trouvé de moment ou l'epsilon semblait me mettre dans les choux, mes données entrantes sont quantifiées, je n'ai pas de divergences, mais les valeurs nulles sont possibles.

    J'aimerai donc un retour d'expérience d'utilisateurs plus chevronnés que moi. Merci.
    Un message vous a aidé? Votez pour moi! J'aime qu'on me dise qu'on m'aime.

    Si la question a obtenu sa réponse, passez le sujet en résolu.

    "Citer les pensées des autres, c'est regretter de ne pas les avoir trouvées soi-même" S.Guitry

  2. #2
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour,

    L'utilisation classique d'eps est la comparaison de floats (pour lesquels == ne convient pas toujours).

    j'ai un peu de mal à comprendre ton exemple. Si le dénominateur est indiscernable de 0, autant le savoir et passer par isnan il me semble. Ta solution va renvoyer des entiers "énormes" à la place de renvoyer des nan ou des inf. Pourquoi un tel choix ? Pourquoi pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    idx= variable1>critère1 && variable2<critère2
    ratio= variable1(idx)./variable2(idx)
    Un petit bémol en ce qui concerne la comparaison de floats: à quand un langage qui associera à ses numériques la précision à laquelle il est calculé ??? Quand on fait des sommes/produits de quantités à eps près, l'incertitude sur le produit est plus grand que eps (et on sait l'exprimer au niveau mathématique). Un exemple ? La comparaison de dates au dessous de la seconde, pour laquelle il est nécessaire de comparer séparément les parties entières et fractionnaires (l'erreur relative sur la date elle même étant trop importante).

  3. #3
    Membre expert
    Avatar de Clotho
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2011
    Messages
    1 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 524
    Points : 3 383
    Points
    3 383
    Par défaut
    J'exprime en fait un vecteur en fonction de la valeur maximum qu'il contient, je fais une normalisation. Quand je n'ai que des valeurs nulles, au lieu de faire 0/0 et obtenir Nan, j'avais pris pour parti de faire "0/(0+eps)", ce qui me sortait bien un 0 comme résultat, ce qui d'un point de vue physique est régulier.

    si on prend un exemple simple la ligne suivante:

    me donne
    sachant que j'en ai quelques centaines de milliers.

    Si le vecteur entré était nul, il faut que ça reste un vecteur nul.

    Si je ne me trompe pas, ta solution avec les indices va me fournir une matrice de ratio d'une taille différente de ma matrice d'entrée, ce que je ne souhaite pas.

    Si par contre le eps est employé à mauvais escient et peut être source d'erreurs (un exemple même simplifié?) je peux tout à fait passer par une ligne de "chasse" aux NaN et les remplacer par la valeur qui me convient, c'est justement sur cette bonne ou mauvaise pratique que je m'interroge.
    Un message vous a aidé? Votez pour moi! J'aime qu'on me dise qu'on m'aime.

    Si la question a obtenu sa réponse, passez le sujet en résolu.

    "Citer les pensées des autres, c'est regretter de ne pas les avoir trouvées soi-même" S.Guitry

  4. #4
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    une matrice de ratio d'une taille différente
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    % normalisation des lignes d'une matrice X, avec (0,...,0) et tailles conservés
    ratio= zeros(size(X));
    isnon0 = sum(X,2) > eps; % celui la a du sens 
    ratio(isnon0 ,:)= bsxfun(@times,X,1./sum(X,2));
    Cette solution est a priori rapide car vectorisée. Difficile à battre en terme de performances. (Si le bsxfun explose la mémoire, on peut toujours le changer en boucle.)
    un exemple même simplifié?
    pas facile, car pour des quantités de l'ordre de 1 et un nombre limité d'opérations, le eps risque de pas changer grand chose

    c'est justement sur cette bonne ou mauvaise pratique
    Mauvaise en terme de lisibilité du code (ce qui n'est de tt facon pas le fort de Matlab). En comparaison, mon approche sépare au niveau du code et en 3 lignes distinctes la valeur par défaut, les lignes posant problème, et le traitement générique.
    En terme robustesse pas génial non plus (s'il y a des valeurs négatives dans tes données).

    d'un point de vue physique est régulier
    D'un autre coté, tu va peut être finir par faire des traitements conditionnels au fait de ne pas avoir une somme nulle (un histogramme ou un modèle quelconque), en quel cas tu finira par filtrer ces lignes.

  5. #5
    Membre expert
    Avatar de Clotho
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2011
    Messages
    1 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 524
    Points : 3 383
    Points
    3 383
    Par défaut
    Pour le moment l'occupation mémoire n'est pas réellement un soucis, et vu que ça s'insère dans une suite de traitement d'image, j'ai un peu de bouteille là dessus bien que je ne sois pas informaticien.

    Merci pour le code type, je regarderai ça (mais pas sûr que je le fasse tout de suite, je me le garde dans un coin en TODO, faudra attendre pour un éventuel retour.)

    Ok pour la mauvaise pratique, je vais me pencher dessus quand l'ensemble sera fonctionnel (ce qui intéresse en premier lieu notre client) pour rendre l'ensemble plus rigoureux.

    Et enfin, oui, il y aura sans doute un seuillage à la fin de l'ensemble des calculs ou celui là est inséré, avant de passer au coeur du traitement, qui lui tourne déjà, et est mon goulot d'étranglement en terme de performance. gros morceau en perspective.

    En attendant, je passe le sujet en résolu, et te remercie pour tes explications claires.
    Un message vous a aidé? Votez pour moi! J'aime qu'on me dise qu'on m'aime.

    Si la question a obtenu sa réponse, passez le sujet en résolu.

    "Citer les pensées des autres, c'est regretter de ne pas les avoir trouvées soi-même" S.Guitry

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

Discussions similaires

  1. [C#] La bonne utilisation des WinForms (ouverture-Fermeture)
    Par Harry dans le forum Windows Forms
    Réponses: 28
    Dernier message: 03/08/2005, 11h39
  2. La bonne utilisation de TIBTransaction
    Par jibe74 dans le forum Connexion aux bases de données
    Réponses: 15
    Dernier message: 29/01/2005, 16h18
  3. [Tomcat][sleep]De la bonne utilisation du sleep??
    Par Titom dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 11/01/2005, 10h25

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