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 :

Problème de précision


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 45
    Points : 31
    Points
    31
    Par défaut Problème de précision
    Bonjour à tous,

    Je veux créer une matrice de nombres de l'ordre de 1*10^9. Le problème est que matlab me les convertit automatiquement en écriture scientifique et ne m'affiche pas tous les chiffres après la virgule. J'ai utilisé la fonction "format long" pour obtenir l'affichage de jusqu'à 15 décimales. Le problème est maintenant que matlab me renvoie des nombres, toujours en écriture scientifique, cette fois avec jusqu'à 5 chiffres après la virgule, puis complète avec des zéros jusqu'à 15 décimales.
    Y-a-t-il un moyen de remédier à ça afin qu'il me renvoie mon nombre dans sa totalité (et si possible pas en écriture scientifique)?

    Merci d'avance!

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    salut, tu peux utiliser qqch du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fprintf('%1.15e|n',mon_nombre)

  3. #3
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    Je pense qu'il y a une petite faute de frappe
    Citation Envoyé par salseropom Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fprintf('%1.15e\n',mon_nombre)
    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 45
    Points : 31
    Points
    31
    Par défaut
    Je suis désolée je ne comprends pas très bien les différents éléments de la ligne de code, pourriez-vous les expliciter un peu svp? (désolée, vraiment très nulle en matlab...).
    Et je peux utiliser fprintf sans utiliser avant fopen?

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Points : 58
    Points
    58
    Par défaut
    %1.15e correspond au format sur lequel les données doivent etre ecrites (ici 15 chiffres apres la virgule et écriture expo)

    \n passer à la ligne suivante

    mon_nombre : le nom de la variable que tu veux écrire



    En effet cette ligne de code te permet d'écrire dans un fichier les valeurs de ta matrice par exempe donc tu dois utiiser fopen d'abord

    Ce n'est pas ce que tu voulais?

  6. #6
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 45
    Points : 31
    Points
    31
    Par défaut
    En fait je voulais éviter l'écriture expo (je dois juste enlever le "e" de la ligne de code?), et si, je veux récupérer les nombres présents dans ma matrice, mais cette matrice n'est pas dans un fichier à part, le programme me la fournit directement la ligne juste avant.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Points : 58
    Points
    58
    Par défaut
    Pour a première partie de ta question il faut que tu remplaces le e par f.

    Pour la deuxième partie je t'avoue que j'ai du mal à saisir ce que tu demandes tu peux reformuler?

  8. #8
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 45
    Points : 31
    Points
    31
    Par défaut
    Merci pour la première partie.

    Alors, je tente la reformulation: en fait je commence mon programme par importer un fichier .txt. Je mets le contenu de ce fichier dans une matrice à 10 colonnes. Je souhaite ensuite créer un vecteur dont chaque ligne est formée par l'une des colonnes précédentes (ex pour 5: si j'avais [1 1 1 1 1], je veux avoir dans mon vecteur le nombre [11111]). J'ai le raisonnement pour faire tout ça, le problème est que dans ce nouveau vecteur (noté Mh), les nombres présents sur chaque ligne (composés chacun de 10 chiffres) sont trop gros pour Matlab. Il me les écrit en écriture scientifique et me renvoie des arrondis, ce qui ne me va pas du tout.

    Je ne sais pas si c'est beaucoup plus clair? Je joins mes lignes de code pour faire tout ça:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    % Importation des donnes
     
    filename = ['/r1/people/matthias_ongyerth/work/SweepScreen/MLTABLES/CA_fromFastas/hg18/chr22.fa'];
    fid = fopen(filename);
    a = fscanf(fid, '%s');
     
    for n = 1
        fgetl(fid);
    end
    st = fclose(fid);
     
    genh = zeros(size(a));
    genh(a=='A')=1;
    genh(a=='T')=2;
    genh(a=='G')=3;
    genh(a=='C')=4;
    genh(a=='N')=0;
    genh(a=='a')=0;
    genh(a=='t')=0;
    genh(a=='g')=0;
    genh(a=='c')=0;
    genh(a=='n')=0;
     
    genh;
     
    % Recenser tous les motifs de la seq dans une matrice motifsh
     
    k = 1;
    motifsh = zeros(length(genh)-(10-1), 10);
     
     
    for i = 1:length(genh)-(10-1)
     
        motifsh(k,: ) = genh (k:k+9);
        k = k+1;
     
    end
     
    % Optimisation: Transformation de motifs en vecteur colonne Mh
     
    Mh = zeros(length(motifsh(:,1)), 1);
    for i = 1:length(motifsh(:,1))
        Mh(i) = motifsh(i,1)*10^9 + motifsh(i,2)*10^8 + motifsh(i,3)*10^7 + motifsh(i,4)*10^6 + motifsh(i,5)*10^5 + motifsh(i,6)*10^4 + motifsh(i,7)*10^3 + motifsh(i,8)*10^2 + motifsh(i,9)*10^1 + motifsh(i,10)*10^0;
    end
    Mh;

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Points : 58
    Points
    58
    Par défaut
    En fait tu ne cherches pas à créer un fichier .txt de sortie avec ta matrice Mh si?

    Ne t'en fais pas Matlab ne fait pas d'arrondis tout seul c'est juste une question d'affichage à l'écran. Chaque valeur de ta matrice même si elle te parait arrondie est en fait stockée complètement, sans arrondi. Donc si tu veux écrire un fichier .txt de sortie tu peux l'écrire sur le format que tu veux

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Points : 58
    Points
    58
    Par défaut
    Regarde cette FAQ ::

    http://matlab.developpez.com/faq/?pa...eurs_tronquees

    Pourquoi Matlab affiche-t-il des valeurs tronquées?

  11. #11
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 45
    Points : 31
    Points
    31
    Par défaut
    Non le fichier .txt n'est pas indispensable, je pensais traiter les données sous excel mais les vecteurs sont vraiment trop longs.

    Matlab ne fait pas d'arrondis, mais il arrive à stocker des nombres de cette taille? Parce que dans la suite du programme j'utilise la fonction tabulate sur mon vecteur, et alors je me retrouve avec un nombre en écriture scientifique dont seuls les 5 premiers chiffres après la virgule apparaissent, et les autres sont remplacés par des zéros (quand je rentre au préalable la commande "format long"), du coup ça me paraissait bizarre.

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Points : 58
    Points
    58
    Par défaut
    Tabulate te sert à compter le nombre de fois qu'apparait une valeur dans un vecteur c'est bien ca?

    Si tu regardes le programme tabulate.m (ligne 66) il a été conçu pour que les valeurs et le nombre d'évènements soient sous la forme %5d soit des décimales à 5 chiffres. C'est pour ca que tu n'as que 5 chiffres après la virgule en utilisant tabulate!

  13. #13
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 45
    Points : 31
    Points
    31
    Par défaut
    Ah ça explique tout!
    Comment je peux avoir accès au fichier tabulate.m? Je peux m'en servir pour créer une nouvelle fonction qui fasse la même chose mais avec plus de décimales non?
    Sinon je n'aurais pas ce problème si le vecteur auquel j'applique la fonction tabluate n'était composé que d'entiers..mais là nouveau problème, quand on rentre des entiers dans tabulate, la fonction s'applique non seulement aux entiers présents initialement dans le vecteur, mais aussi à tous les entiers compris entre les deux extrêmes du vecteur...

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Points : 58
    Points
    58
    Par défaut
    C'est à vérifier mais je pense que tu peux même changer directement e fichier tabulate.m en remplaçant %5d pas %15d. Sinon comme tu dis tu peux créer une nouvelle fonction..

    Pour trouver ton fichier tabulate.m fais une recherche dans le dossier où tu as installé matlab.

  15. #15
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 45
    Points : 31
    Points
    31
    Par défaut
    Bon malgré mes modifications du code de la fonction tabulate, je récupère toujours le même résultat, je comprends pas pourquoi.

  16. #16
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Points : 58
    Points
    58
    Par défaut
    Je me suis jamais posé la question de savoir si on pouvait modifier à notre guise les fonctions déjà proposées par matlab..

    Quelqu'un a-t-il a réponse??

    Sinon as tu essayé de copier le programme tabulate et créer une nouvelle fonction en changeant ce qui t'intéresse?

  17. #17
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 45
    Points : 31
    Points
    31
    Par défaut
    Les fonctions prédéfinies dans matlab ne sont disponibles que pour la lecture, donc impossible de les modifier. J'ai donc créé une nouvelle fonction notée tabulate2 qui reprend exactement la fonction tabulate, à l'exception près de ce problème de précision. Je ne comprends pas tout le code de la fonction donc il y a quelque chose que je dois oublier de changer, parce que ma nouvelle fonction me pose le même problème que la précédente...

  18. #18
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Points : 58
    Points
    58
    Par défaut
    OK merci pour 'info!!

    Peux tu nous mettre le code de a fonction tabulate 2??

  19. #19
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 45
    Points : 31
    Points
    31
    Par défaut
    Bien sûr, le voilà!

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    function table = tabulate2(x)
     
    isnum = isnumeric(x);
    if isnum
       if min(size(x)) > 1,
          error('stats:tabulate:InvalidData','Requires a vector input.');
       end
     
       y = x(~isnan(x));
    else
       y = x;
    end
     
    if ~isnum || any(y ~= round(y)) || any(y < 1);
       docell = true;
       [y,yn] = grp2idx(y);
       maxlevels = length(yn);
    else
       docell = false;
       maxlevels = max(y);
       %yn = cellstr(num2str((1:maxlevels)'));
    end
     
    [counts values] = hist(y,(1:maxlevels));
     
    total = sum(counts);
    percents = 100*counts./total;
     
    if nargout == 0
       if docell
          width = max(cellfun('length',yn));
          width = max(5, min(50, width));
       else
          width = 5;
       end
     
       % Create format strings similar to:   '  %5s    %15d    %6.2f%%\n'
       fmt1 = sprintf('  %%%ds    %%15d    %%6.2f%%%%\n',width);
       fmt2 = sprintf('  %%%ds    %%5s   %%6s\n',width);
       fprintf(1,fmt2,'Value','Count','Percent');
       if docell
          for j=1:maxlevels
             fprintf(1,fmt1,yn{j},counts(j),percents(j));
          end
       else
          fprintf(1,'  %15d    %15d    %6.2f%%\n',[values' counts' percents']');
       end
    else
       if ~docell
          table = [values' counts' percents'];
       elseif isnum
          table = [str2num(char(yn{:})) counts' percents'];
       else
          table = [yn num2cell([counts' percents'])];
       end
    end

  20. #20
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Points : 58
    Points
    58
    Par défaut
    OK c'est moi qui me suis trompé je pense c'est pas %15d qu'il faut.. Je n'ai plus accès à matlab là donc il faut que tu regardes dans l'aide "fprintf" ce qui est expliqué sur le format il faut que tu fasses qqch du genre %X.15f..

    A toi de voir quoi mettre à a place de X avec l'aide

Discussions similaires

  1. Problème de précision dans une requête
    Par Le Pharaon dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 09/08/2006, 14h16
  2. Réponses: 5
    Dernier message: 11/05/2006, 08h51
  3. Problème de précision avec FloatToStr
    Par Clorish dans le forum Langage
    Réponses: 9
    Dernier message: 06/12/2005, 15h38
  4. Réponses: 4
    Dernier message: 26/10/2005, 20h38
  5. [FLASH MX] Problème de "précision"
    Par will-scs dans le forum Flash
    Réponses: 2
    Dernier message: 03/07/2005, 00h31

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