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 :

fonction appliquee aux elements d'une matrice


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bonjour a tous,
    j'utilise dans une simulation numerique une fonction que j'applique a tous les elements d'une matrice, et qui renvoie pour un element x de la matrice:
    sigma(x)= (1-exp(-abs(x)))/(abs(x)) si x different de 0
    et sigma(x)=1 si x=0

    Actuellement, j'utilise une methode tres naive, a savoir je parcours tous les elements de la matrice un a uns et applique le calcul sigma suivant qu'ils sont nuls ou non nuls..
    Y a t'il moyen de proceder plus rapidement? j'ai remarque qu'en appliquant le calcul directement sur la matrice, cad (1-exp(abs(A)))./(abs(A)) c'est beaucoup plus rapide, mais il y a un probleme pour les elements nuls de A (renvoie NaN...).

    Voyez vous une methode de proceder plus rapide que ma methode naive?

    Merci de toute indication

    Voila mon code pour etre plus clair:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function [sigma]=sigma(v)
    [k l]=size(v);
    sig=zeros(k,l);
    for i=1:k
        for j=1:l
            if (v(i,j)==0) 
                sig(i,j)=1;
            else sig(i,j)=(1-exp(-abs(v(i,j))))/(abs(v(i,j)));
            end
        end
    end
    sigma=sig;

  2. #2
    Membre habitué
    Avatar de mr_langelot
    Profil pro
    Inscrit en
    Août 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 113
    Points : 150
    Points
    150
    Par défaut
    Bonjour,

    Tu enlèves les NaN en utilisant la fonction isNaN.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a = [ 1 NaN 2 ]
    a(~isnan(a))

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Merci de ta reponse.

    En fait, je ne voudrais pas retirer les NaN mais les remplacer par 1(Les NaN viennent lorsqu'on applique (1-exp(-|x|))/(|x|) a 0).
    Y a t'il un moyen de les remplacer par 1?

  4. #4
    Membre habitué
    Avatar de mr_langelot
    Profil pro
    Inscrit en
    Août 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 113
    Points : 150
    Points
    150
    Par défaut
    oui, bien sûr,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a(isnan(a))=ones(size(a(isnan(a))))
    je sais, ça fait de la parenthèse

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Salut,
    Citation Envoyé par mr_langelot Voir le message
    oui, bien sûr,

    a(isnan(a))=ones(size(a(isnan(a))))

    je sais, ça fait de la parenthèse
    Avec moins de parenthèse :
    non?

  6. #6
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Merci a tous les deux pour vos reponses. Effectivement la deuxieme solution (avec moins de parentheses ) semble a premiere vue fonctionner egalement.

  7. #7
    Membre habitué
    Avatar de mr_langelot
    Profil pro
    Inscrit en
    Août 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 113
    Points : 150
    Points
    150
    Par défaut
    si

  8. #8
    Nouveau membre du Club
    Inscrit en
    Juillet 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 37
    Points : 32
    Points
    32
    Par défaut
    Méfies toi quand même des formes indéterminées, Matlab les traites assez librement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >> 0/0
     
    ans =
     
       NaN
     
    >> 1/0
     
    ans =
     
       Inf
    Normalement dans ton cas ça ne doit pas arriver, mais dans le doute mieux vaut vérifier la valeur soit finie (ni NaN, ni Inf) :


  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
    Et sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function [sigma]=sigma(v)
    sigma = (1-exp(-abs(v)))./abs(v);
    sigma(~isfinite(sigma))=1;

  10. #10
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    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 304
    Points : 52 882
    Points
    52 882
    Par défaut
    Citation Envoyé par 65days Voir le message
    Méfies toi quand même des formes indéterminées, Matlab les traites assez librement :


    Je ne suis pas un spécialiste mais je crois savoir que tout ceci est normalisé : http://steve.hollasch.net/cgindex/co...tml#operations

    Voir aussi : What Every Computer Scientist Should Know About Floating-Point Arithmetic et plus spécifique à MATLAB : http://www.mathworks.com/company/new...all96Cleve.pdf

    Citation Envoyé par Caro-Line Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function [sigma]=sigma(v)
    Il serait judicieux de modifier le nom de la variable identique à celui de la fonction

  11. #11
    Membre actif
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Points : 213
    Points
    213
    Par défaut
    Citation Envoyé par 65days Voir le message
    Méfies toi quand même des formes indéterminées, Matlab les traites assez librement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >> 0/0
     
    ans =
     
       NaN
     
    >> 1/0
     
    ans =
     
       Inf
    Ces exemples donnent des résultats tout à fait normaux

  12. #12
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    merci de vos commentaires...
    En fait j'ai remarque qu'un petit probleme se pose pour des valeurs tres proches de 0:
    par exemple pour
    x=1.0e-15, sigma(x)=1.007175649130114
    x=1.0e-16, sigma(x)=1.060184893821172
    x=1.0e-17, sigma(x)=1.766974823035287
    x=1.0e-18, sigma(x)=0
    alors qu'en fait pour ces valeurs de x, on devrait en theorie obtenir une valeur de sigma (tres) proche de 1, mais en tous les cas < ou =1.
    J'ai donc pense a utiliser B(find(B>1))=1; pour rectifier ces valeurs qui sont superieures a 1, mais dans le cas de x=1.0e-18, le probleme reste entier (parce que la valeur 0 est aussi atteinte pour des tres grandes valeures de x).

    Ou alors peut etre pourrais-je initialiser la matrice B des le debut:
    B(find(B<1.0e-14))=0; et ensuite appliquer sigma.
    Ca devrait resoudre le probleme non?

    De toutes facons, a priori de telles valeurs n'apparaissent pas dans mon algorithme mais bon...

  13. #13
    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
    C'est bizarre je n'obtiens pas du tout les mêmes valeurs que toi :
    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=[1.0e-15 1.0e-16 1.0e-17 1.0e-18]
    sig = (1-exp(-abs(v)))./abs(v);
    sig(~isfinite(sigma))=1
     
    v =
     
      1.0e-015 *
     
        1.0000    0.1000    0.0100    0.0010
     
     
    sig =
     
        0.9992    1.1102         0         0
    Note : j'obtiens la même chose avec ton code initial du 1er post.

    Aurais-tu changé ta formule ?

  14. #14
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    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 304
    Points : 52 882
    Points
    52 882
    Par défaut
    Citation Envoyé par nico888 Voir le message
    En fait j'ai remarque qu'un petit probleme se pose pour des valeurs tres proches de 0:

    Ceci est encore une fois lié aux limites du calcul avec des nombres réels en informatique.


    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
    >> eps
     
    ans =
     
       2.2204e-16
     
    >> sprintf('%.20f',exp(eps))
     
    ans =
     
    1.00000000000000022204
     
    >> sprintf('%.20f',exp(eps/2))
     
    ans =
     
    1.00000000000000000000
    Voir l'article de Cleve Moler dans le lien que j'ai donné précédemment

  15. #15
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Caro-Line Voir le message
    C'est bizarre je n'obtiens pas du tout les mêmes valeurs que toi :
    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=[1.0e-15 1.0e-16 1.0e-17 1.0e-18]
    sig = (1-exp(-abs(v)))./abs(v);
    sig(~isfinite(sigma))=1
     
    v =
     
      1.0e-015 *
     
        1.0000    0.1000    0.0100    0.0010
     
     
    sig =
     
        0.9992    1.1102         0         0
    Note : j'obtiens la même chose avec ton code initial du 1er post.

    Aurais-tu changé ta formule ?
    oui pardon, c'est parce qu'en fait dans mon code, la fonction sigma est plus precisement:
    sigma(v)=(1-exp(-2*pi*abs(v)))./(2*pi*abs(v))
    changement mineur que j'ai oublie de signaler, mais qui ne change rien au probleme. Toujours est il que j'ai resolu les qq problemes en utilisant
    avant d'appliquer sigma a la matrice B...

  16. #16
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    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 304
    Points : 52 882
    Points
    52 882
    Par défaut
    Citation Envoyé par nico888 Voir le message
    Pas besoin de FIND ici :

    Voir la : Qu'est-ce que l'indexage logique ?

  17. #17
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    OK, merci pour ces precisions et le lien.

Discussions similaires

  1. [Image HSV] Accès aux elements d'une matrice
    Par arkeya dans le forum OpenCV
    Réponses: 5
    Dernier message: 25/06/2012, 17h16
  2. Réponses: 2
    Dernier message: 15/02/2011, 10h34
  3. Ajout elements d'une matrice 2*2
    Par mihaispr dans le forum Simulink
    Réponses: 7
    Dernier message: 09/05/2009, 20h37
  4. elements d'une matrice transposée
    Par Christinita dans le forum MATLAB
    Réponses: 1
    Dernier message: 07/02/2009, 14h35
  5. Evenements associés aux elements d'une JLIST.
    Par gregb34 dans le forum Composants
    Réponses: 1
    Dernier message: 03/05/2006, 01h21

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