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 :

Ranger une matrice


Sujet :

MATLAB

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Points : 56
    Points
    56
    Par défaut Ranger une matrice
    Bonjour,

    Je souhaite réarranger une matrice tout en respectant la lecture de gauche a droite et de haut en bas. J'ai un fichier de sortie qui me donne une matrice avec des colonnes pas entièrement pleine. Du coup MATLAB est pas content quand je veux les manipuler. J'aimerai en tirer une matrice propre.

    J'ai un fichier d'entrée : resultat.txt
    il contient :
    23 24 25 26
    33 34 35
    43 44 45 46 47
    53 54
    Les colonnes 3,4,5 sont incomplètes.

    J'aimerais obtenir un nouveau fichier avec par exemple 3 colonnes (chiffre que je choisis) :
    23 24 25
    26 33 34
    35 43 44
    45 46 47
    53 54 0
    Et je complète les dernières cases par 0 pour que la matrice soit manipulable.

    donc pour commencer je charge mon fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A=load('resultat.txt');
    et là je suis direct coincé sur l'algo. Il faudrait que tous les A(:,j+4) je commence une nouvelle ligne.

    Si quelqu'un a une brillante idée ?

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

    Le nombre de colonnes n'étant pas contant, tu devrais avoir une erreur en utilisant la fonction LOAD...
    Une solution:
    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
    monFichier = 'resultat.txt';
    NbCol = 3;
     
    % Lecture du fichier
    fid = fopen(monFichier,'rt');
    A = fscanf(fid,'%d');
    fclose(fid);
     
    % Ajout des zéros
    if rem(numel(A),NbCol)~=0
        A(NbCol*ceil(numel(A)/NbCol)) = 0;
    end
     
    % Écriture
    fmt = repmat('%d ',1,NbCol);
    fid = fopen(['new_' monFichier],'wt');
    fprintf(fid,[fmt(1:end-1) '\n'],A);
    fclose(fid);
     
    reshape(A,NbCol,[]).'

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Points : 56
    Points
    56
    Par défaut
    Merci beaucoup pour ton aide Winjerome.

    Mais j'ai teste sur mon exemple ci-dessus, et ca n'a rien fait, le fichier reste inchange.

    Je ne sais pas si mes explications etaient clairs en haut, je souhaite transforme une matrice au nombre de colonne non constant en une matrice au nombre de colonne constant, tout en gardant l'ordre de lecture (de gauche a droite et de haut en bas) et en ajoutant des zeros sur la derniere ligne si necessaire (pour avoir un nombre de colonne constant).

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par DJEcalcul Voir le message
    le fichier reste inchange.
    Normal:
    Citation Envoyé par DJEcalcul Voir le message
    J'aimerais obtenir un nouveau fichier
    Le fichier se nomme new_resultat.txt:
    Citation Envoyé par Winjerome Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fid = fopen(['new_' monFichier],'wt');
    Maintenant rien ne t'empêche de changer la ligne citée ci-dessus pour rester sur le même fichier.

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Points : 56
    Points
    56
    Par défaut
    Ok merci Winjerome. Effectivement j'avais mal compris la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fid = fopen(['new_' monFichier],'wt');
    Ca marche parfaitement sur mon exemple. En revanche dans mon vrai tableau j'ai a la fois des chiffres a virgules et des entiers et dans ce cas ca marche plus.

    Par exemple si je reprends mon cas precedent et que je change juste un chiffre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    23 24.2 25 26
    33 34 35
    43 44 45 46 47
    53 54
    le new_resultat.txt est :
    ca doit etre une histoire de format dans fopen non ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par DJEcalcul Voir le message
    ca doit etre une histoire de format dans fopen non ?
    Pas tout à fait, c'est dans FSCANF

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Pas tout à fait, c'est dans FSCANF
    Ok merci.

    j'ai donc change dans fscanf
    en
    en effet ca fonctionne, merci Winjerome.
    Cependant sur mon exemple precedent j'obtiens donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    23 2.420000e+001 25
    26 33 34
    35 43 44
    45 46 47
    53 54 0
    Comment puis-je obtenir juste a la place de

  8. #8
    Invité
    Invité(e)
    Par défaut
    Là c'est FPRINTF qu'il faut regarder, et plus précisément le format %g.

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Là c'est FPRINTF qu'il faut regarder, et plus précisément le format %g.
    C'est ce que j'avais regarder avant de poser ma derniere question mais ca fonctionne pas. Et pourtant d'apres la description de g c'est tout a fait ce que je veux. Si j'ajoute %g dans fprintf comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(fid,[fmt(1:end-1) '%g\n'],A);
    j'obtients :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    23 2.420000e+001 2526
    33 34 3543
    44 45 4647
    53 54 0
    J'ai aussi essaye dans repmat mais..pas bon non plus...

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par DJEcalcul Voir le message
    J'ai aussi essaye dans repmat mais..pas bon non plus...
    C'est bien là qu'il faut le mettre, cela devrait marcher

  11. #11
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    C'est bien là qu'il faut le mettre, cela devrait marcher
    ok en fait je laissais le %d existant. Maintenant c'est bon ca fonctionne, Merci Winjerome.

    En resume pour les suivants, voici le code :

    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
    monFichier = 'invadedwaterwet.txt';
    NbCol = 3;
     
    % Lecture du fichier
    fid = fopen(monFichier,'rt');
    A = fscanf(fid,'%f');
    fclose(fid);
     
    % Ajout des zéros
    if rem(numel(A),NbCol)~=0
        A(NbCol*ceil(numel(A)/NbCol)) = 0;
    end
     
    % Écriture
    fmt = repmat('%g ',1,NbCol);
    fid = fopen(['new_' monFichier],'wt');
    fprintf(fid,[fmt(1:end-1) '\n'],A);
    fclose(fid);
     
    reshape(A,NbCol,[]).';
    qui transforme une matrice avec nombre de colonne non constante en une matrice manipulable sous matlab.

    par exemple de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    23 24.2 25 26
    33 34 35
    43 44 45 46 47
    53 54
    en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    23 24.2 25
    26 33 34
    35 43 44
    45 46 47
    53 54 0

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

Discussions similaires

  1. référencement sur une matrice
    Par bni dans le forum C++
    Réponses: 3
    Dernier message: 24/03/2005, 01h06
  2. [PL/SQL] définir une matrice
    Par lalystar dans le forum Oracle
    Réponses: 5
    Dernier message: 22/02/2005, 16h27
  3. [JTable] remplir avec une matrice
    Par ybdz dans le forum Composants
    Réponses: 3
    Dernier message: 08/12/2004, 22h03
  4. Recherche des coefficients d'une matrice 3x3
    Par colorid dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 25/11/2004, 17h52
  5. Déclarer une matrice
    Par joy dans le forum C
    Réponses: 7
    Dernier message: 09/12/2002, 01h42

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