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 :

Séparation d'une matrice en deux en fonction des valeurs de la première colonne. [Débutant]


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2014
    Messages : 74
    Par défaut Séparation d'une matrice en deux en fonction des valeurs de la première colonne.
    Bonjour à tous !

    J'ai une matrice "Matrice" à 4 colonnes (Col1, Col2, Col3 et Col4) et x lignes.
    J'aimerais diviser cette Matrice en 2 matrices plus petites en fonction de la valeur de la 1ere colonne.

    A priori ce n'est pas bien compliqué ... j'ai déjà fait un truc à un détail près similaire, mais là je n'y arrive pas :

    - Si Col1(lig) = 7 ou 8 ou 9 alors les lignes associées forment la matrice P2
    - Sinon les lignes forment la matrice P1

    >> Précision : Col1 prend les valeurs 1 à 12.

    J'ai essayé avec la fonction FIND
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    deb = 7
    fin = 9
    P2 = find(Matrice(:,1)>=deb & Matrice(:,1)<=fin)
    Mais je ne sais pas comment déduire P1 et de toute façon ça ne marche pas

    Qualqu'un pourrait m'aider ? (une fonction, une autre page d'un forum ... ?)
    Merci !

    Exemple.txt

    Code Complet :
    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
     
    % Choix du fichier de données à utiliser  :
    FichierTexte = 'Exemple.txt'
     
    % Choix du nom du fichier de sortie :
    FichierSortieP1='Exemple_P1.txt'
    FichierSortieP2='Exemple_P2.txt'
     
    % Ouverture du fichier texte dans lequel il y a les données.
    fid=fopen(FichierTexte,'r'); 
     
    % Lecture d'un texte formaté. 
    m=textscan(fid,'%f %f %f %f','delimiter','\t');
     
    % Fermeture du fichier après lecture.
    fclose(fid);
     
    Col1=m{1}; % La colonne 2 de ma matrice m contient les mois "MM".
    Col2=m{2}; % La colonne 5 de ma matrice m contient la hauteur significative spectrale "Hm0".
    Col3=m{3}; % La colonne 6 de ma matrice m contient la direction moyenne de provenance de la houle "Dmoy".
    Col4=m{4}; % La colonne 9 de ma matrice m contient la période moyenne "t02".
     
    % Je compose la matrice "Matrice" avec laquelle je veux travailler à partir des
    % colonnes précédemmment extraites du fichier texte.
    Matrice = horzcat (Col1, Col2, Col3, Col4);
    Dlig=length(Matrice)
     
    % Je créé les matrices P1 et P2.
    for lig = 1:Dlig
     
        if Col1(lig,:) == 7
        elseif Col1(lig,:)  == 8
        elseif Col1(lig,:)  == 9
            P1 = Matrice(: , :)
        else
            P2 = Matrice(: , :)
        end
     
    end
     
     
    % Création du fichier de sortie.
    FichierP1=fopen(FichierSortieP1,'w');
    FichierP2=fopen(FichierSortieP2,'w');
     
    % Ecriture dans le fichier de sortie.
    fprintf(FichierP1,' %12.2f %12.2f %12.2f %12.2f/n ',P1);
    fclose(FichierP1);
    fprintf(FichierP2,' %12.2f %12.2f %12.2f %12.2f/n ',P2);
    fclose(FichierP2);

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

    Sans le find c'est plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    irow= Matrice(:,1)>=deb & Matrice(:,1)<=fin;
    M1= Matrice(irow,:); % lignes ou irow est true
    M2= Matrice(~irow,:);  % lignes ou irow est false
    Avec le find, il faut prendre les indices complémentaire (les indexations restent les mêmes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    P2= setdiff(1:size(Matrice,1),P1);

  3. #3
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2014
    Messages : 74
    Par défaut
    Merci

    En faisant comme tu me le proposes, j'obtiens le même résultats que ce que je suis en train de faire :

    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
     
    % Dlig=length(Matrice)
    % P1=[]
    % P2=[]
    % 
    % % Je créé les matrices P1 et P2.
    % for lig = 1:Dlig
    %     
    %     if Col1(lig,:) == 7
    %     elseif Col1(lig,:)  == 8
    %     elseif Col1(lig,:)  == 9
    %         P2(lig,:) = Matrice(lig , :)
    %     else
    %         P1(lig,:) = Matrice(lig , :)
    %     end
    %     
    % end
    Mais en plus rapide !!

    irow est une fonction (ou une variable ??) de matlab déjà créée ?

  4. #4
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    irow= Matrice(:,1)>=deb & Matrice(:,1)<=fin;
    Cette ligne défini la variable irow comme une vecteur de booléens.

    ton code n'est pas équivalent au mien ! il le serait si tu insérais dans P1 et P2 à la fin () et non pas à la meme ligne que dans la matrice originale. De plus Attention,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dlig=length(Matrice) % max entre nb de ligne et nb colonne
    Dlig= size(Matrice,1) % nb de lignes

  5. #5
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2014
    Messages : 74
    Par défaut

    Oui tu as raisons.

    J'aurais encore une question.
    Je vaux écrire mes matrices dans 2 fichiers texte. J'arrive à les créer, écrire mes patrices ... MAIS les colonnes/lignes sont mélangées :
    Col1 est écrite en premier mais en ligne ... puis Col2 ...

    Donc au lieu d'avoir : (comme affiché dans Matlab)

    1 2 3 4
    1 2 3 4
    1 2 3 4

    j'ai :

    1 1 1 2
    2 2 3 3
    3 4 4 4

    Comment dois-je faire pour mettre tout cela dans l'orde ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    % Création du fichier de sortie.
    FichierP1=fopen(FichierSortieP1,'w');
    FichierP2=fopen(FichierSortieP2,'w');
     
    % Ecriture dans le fichier de sortie.
    fprintf(FichierP1,' %12.4f %12.4f %12.4f %12.4f\n ',P1);
    fclose(FichierP1);
    fprintf(FichierP2,' %12.4f %12.4f %12.4f %12.4f\n ',P2);
    fclose(FichierP2);

  6. #6
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut
    pas très propre, mais il suffit de transposer non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(FichierP1,' %12.4f %12.4f %12.4f %12.4f\n ',P1 ' );

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

Discussions similaires

  1. "colorier" une matrice en fonction des valeurs
    Par klodik dans le forum Scilab
    Réponses: 1
    Dernier message: 27/06/2015, 16h00
  2. Réponses: 4
    Dernier message: 20/01/2015, 16h24
  3. Diviser une page en deux en fonction de la longueur de la page
    Par samantha93 dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 28/03/2012, 16h21
  4. Parcours d'une matrice/tableau à deux dimensions
    Par yal001 dans le forum Mathématiques
    Réponses: 5
    Dernier message: 20/11/2008, 14h59
  5. Diviser une matrice en deux blocs
    Par smirovitch dans le forum MATLAB
    Réponses: 1
    Dernier message: 22/05/2006, 17h11

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