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 :

Dupliquer les lignes d'une matrice et adapter les valeurs d'une des colonnes concernées. [Débutant]


Sujet :

MATLAB

  1. #1
    Membre du Club
    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
    Points : 49
    Points
    49
    Par défaut Dupliquer les lignes d'une matrice et adapter les valeurs d'une des colonnes concernées.
    Bonjour à tous !

    Je travaille sur des données tri-horaires (ce qui signifie que j'ai une donnée toutes les trois heures).
    Exemple :
    >> colonne 1 --> les heures
    >> colonne 2 --> les données

    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
     
    00 12
    03 15
    06 18
    09 5
    12 0
    15 25
    18 13
    21 13
    23 21
    00 19
    03 17
    06 18
    09 3
    12 2
    15 6
    18 11
    21 23
    23 12
    Et j'ai besoin de données horaires (ce qui signifie qu'il me faut une donnée par heure).
    Pour avoir ces données horaires, j'ai choisi de tripliquer (multiplier par 3) chaque ligne de ma matrice, sauf l'heure qui doit être mise à jour ... :

    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
    00 12
    01 12
    02 12
    03 15
    04 15
    05 15
    06 18
    07 18
    08 18
    09 5
    10 5
    11 5
    12 0
    13 0
    14 0
    15 25
    15 25
    17 25
    18 10
    19 10
    20 10
    21 13
    22 13
    23 13
    00 19
    01 19
    02 19
    03 17
    03 17
    03 17
    
    etc

    Sachant qu'en réalité je n'ai pas 2 colonnes mais 6, voici le code que j'ai pour le moment :
    Je mets 3 fois la même boucle à la suite pour rajouter 3 ligne dans ma "Matrice(n)" horaire pour chaque ligne "lig" de ma matrice tri-horaire ...
    Exemple.txt

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    %% IMPORTATION DES DONNEES
     
    % Choix du fichier de données à utiliser  :
    FichierTexte = 'Exemple.txt'
     
    % Ouverture du fichier texte dans lequel il y a les houles.
    fid=fopen(FichierTexte,'r'); 
     
    % Lecture d'un texte formaté. 
    m=textscan(fid,'%f %f %f %f %f %f %f','delimiter','\t');
     
    % Fermeture du fichier après lecture.
    fclose(fid);
     
    YY=m{1}; % Année 
    MM=m{2}; % Mois 
    JJ=m{3}; % Jour 
    HHtri=m{4}; % Heure
    Min=m{5}; % Minutes 
    Vit=m{6}; % 
    Dir=m{7}; % 
     
    %% CONVERTIR LE TRI-HORAIRE EN HORAIRE
     
    % J'initialise le nombre de ligne de ma matrice Tri-horaire
    Dlig=length(YY)
    n=1
     
       for lig=1:Dlig
           % J'initialise mon heure pour n=1
           if n==1
              HH(1) = 0
           % Si j'atteins 23h, je réinitialise HH
           elseif HH(n-1) == 23
              HH(n) = 0
           % Dans tous les autres cas, je rajoute 1h à HH :
           else
               HH(n) = HH(n-1) +1
           end
     
           % Je concatène ma première ligne pour la valeur lig actuelle     
           Matrice(n) = horzcat (YY(lig), MM(lig), JJ(lig), HH(n), Vit(lig), Dir(lig))
     
           if n==1
              HH(1) = 0
           elseif HH(n-1) == 23
              HH(n) = 0
           else
               HH(n) = HH(n-1) +1
     
           % Je concatène ma deuxième ligne pour la valeur lig actuelle     
           Matrice(n) = horzcat (YY(lig), MM(lig), JJ(lig), HH(n), Vit(lig), Dir(lig))
           end
     
           if n==1
              HH(1) = 0
           elseif HH(n-1) == 23
              HH(n) = 0
           else
               HH(n) = HH(n-1) +1
     
           % Je concatène ma troisième ligne pour la valeur lig actuelle     
           Matrice(n) = horzcat (YY(lig), MM(lig), JJ(lig), HH(n), Vit(lig), Dir(lig))
           end
       end
    Le problème c'est qu'en plus d'être très brouillon, mon travail ne fonctionne pas !

    In an assignment  A(I) = B, the number of
    elements in B and I must be the same.
    
    Error in AllData (line 89)
           MatriceVent(n) = horzcat (YYV(lig),
           MMV(lig), JJV(lig), HHVbis(n),
           VitV(lig), DirV(lig))
     
    
    Comment puis-je faire pour créer ma nouvelle Matrice qui consiste à regrouper des matrices déjà existantes, tripliquer chaque ligne en modifiant seulement l'heure ...

    Je suis en train de voir pour :
    1) Créer ma matrice HH avec 3*Dlig lignes (3 fois le nombre de ligne de ma matrice tri-horaire).
    2) Concaténer mes matrices (sauf HH)
    3) Tripliquer chaque ligne
    5) rajouter HH à tout ça

    ... Si vous avez plus simple je prends !


    Merci d'avance !

  2. #2
    Membre du Club
    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
    Points : 49
    Points
    49
    Par défaut
    Voilà le script dont je vous ai parlé dans mon premier post :

    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
     
    % 1) Créer ma matrice HH avec 3*Dlig lignes (3 fois le nombre de ligne de ma matrice tri-horaire).
     
    Dlig = length(YY)
     
    for lig = 1:3*Dlig
     
       % J'initialise mon heure pour n=1
       if lig==1
          HH(1) = 0;
       % Si j'atteins 23h, je réinitialise HH
       elseif HH(lig-1) == 23
          HH(lig) = 0;
       % Dans tous les autres cas, je rajoute 1h à HH :
       else
           HH(lig) = HH(lig-1) +1;
       end
     
    end
     
    % 2) Concaténer mes matrices (sauf HH) 
     
    Mtri = horzcat (YY, MM, JJ, Vit, Dir)
     
    % 3) Tripliquer chaque ligne
    n=0
    for lig = 1:Dlig
        n=n+1;
        Mhor(n,:) = Mtri(lig,:);
        n=n+1;
        Mhor(n,:) = Mtri(lig,:);
        n=n+1;
        Mhor(n,:) = Mtri(lig,:);
    end
    % 5) rajouter HH à tout ça
     
    Matrice = horzcat ( HH, Mhor);
    Evidemment il y a un problème ... Matlab semble de pas aimer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mhor(n,:) = Mtri(lig,:);
    ni
    In an assignment  A(I) = B, the number of
    elements in B and I must be the same.
    
    Error in ExempleAllData (line 97)
        Mhor(n) = Mtri(lig,:);
    
    Sur internet je n'ai trouvé que ce sujet pour m'aider : http://www.developpez.net/forums/d34...ignes-matrice/
    Mais je n'ai pas bien compris le fonctionnement. A priori cela ne permet que de dupliquer une matrice (ou une partie d'une matrice) vers une autre matrice ... Moi je dois dupliquer chaque ligne dans la même matrice ou une nouvelle ...

    Là je n'ai plus d'idée ...

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur en analyse décisionnelle
    Inscrit en
    Juin 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en analyse décisionnelle

    Informations forums :
    Inscription : Juin 2013
    Messages : 113
    Points : 133
    Points
    133
    Par défaut
    Essaie ceci :

    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
    %% IMPORTATION DES DONNEES
     
    % Choix du fichier de données à utiliser  :
    FichierTexte = 'Exemple.txt';
     
    % Ouverture du fichier texte dans lequel il y a les houles.
    fid=fopen(FichierTexte,'r'); 
     
    % Lecture d'un texte formaté. 
    m=textscan(fid,'%f %f %f %f %f %f %f','delimiter','\t');
     
    % Fermeture du fichier après lecture.
    fclose(fid);
     
    M = cell2mat(m);
     
    Mh = M(ceil((1:(size(M,1)*3))/3),:);
    Mh(:,4) = Mh(:,4) + mod(0:size(Mh,1)-1,3)';
     
    disp(Mh);

  4. #4
    Membre du Club
    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
    Points : 49
    Points
    49
    Par défaut
    Ca marche
    Merci !

    J'aimerais juste que tu me dises si j'ai bien compris ce que tu as fait. Le cas échéant, je veux bien des explications ^^

    M est la matrice obtenue à partie de m :
    Mh est la matrice "horaire" obtenue à partir de M.
    Les dimensions de Mh sont :
    >> Lignes : ceil((1:(size(M,1)*3))/3) Soit l'entier supérieur le plus proche de (1:(size(M,1)*3))/3.
    Ce dernier calcul représente les lignes 1 à size(M,1)*3/3.
    Ne peut-on pas remplacer size(M,1)*3/3 par length(M,1)*3 ? Pourquoi multiplier par 3 puis diviser par 3 ?
    >> Colonnes :toutes les colonnes de M
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mh = M(ceil((1:(size(M,1)*3))/3),:);
    Pour toutes les lignes de Mh, dans la colonne 4, on modifie les valeurs des heures :
    >> On ajoute aux valeurs de la colonne 4 de Mh les valeurs 0, 1 ou 2 :
    mod(x,y) c'est ce qui reste de la division de x par y.
    Dans mon cas, c'est ce qui reste de la division de 0:size(Mh,1)-1 par 3 --> les valeurs 0, 1 ou 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mh(:,4) = Mh(:,4) + mod(0:size(Mh,1)-1,3)';
    Mais je ne comprends pas comment les heures sont calculées ?


    Mais je ne vois toujours pas à quel moment les lignes sont tripliquées ?

    Merci d'avance pour ces explications

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur en analyse décisionnelle
    Inscrit en
    Juin 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en analyse décisionnelle

    Informations forums :
    Inscription : Juin 2013
    Messages : 113
    Points : 133
    Points
    133
    Par défaut
    Oui, ça me fera plaisir de t'expliquer ! C'est très bien de vouloir comprendre les stratégies employées.

    D'abord, le code réalise une matrice Mh de rangées triplées, donc si [m, n] sont les dimensions de la matrice M, alors les dimensions de la matrice Mh seront [3*m, n], ce qui concorde avec le fait de tripler les rangées.

    Comment cela est réalisé ?

    Mon but initial est de reprendre chacune des rangées et de les tripler par simple copie. Par exemple :

    doit devenir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    0 10
    0 10
    0 10
    3 20
    3 20
    3 20
    6 30
    6 30
    6 30
    Pour ce faire, j'utilise l'indexation.

    Disons que j'ai une matrice :

    Si j'indexe M de cette façon, voici ce que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >> M([1,1,1,2,2,2,3,3,3],:)
    ans =
         0    10
         0    10
         0    10
         3    20
         3    20
         3    20
         6    30
         6    30
         6    30
    Mon but devient alors de générer automatiquement cette suite de nombres : [1,1,1,2,2,2,3,3,3]

    La longueur de cette suite de nombres sera nécessairement le triple du nombre de rangées de M, d'où size(M,1). Je préfère utiliser cette fonction à celle de length, car cette dernière ne donne que la taille de la plus grande dimension, donc si tu as moins de rangées que de colonnes, tu n'obtiendras pas le nombre de rangées, mais plutôt le nombre de colonnes!

    Supposons que j'ai 3 rangées, alors je veux maintenant en obtenir 9. Générons les nombres de 1 à 9 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >> 1:9
    ans =
         1     2     3     4     5     6     7     8     9
    La fonction ceil arrondit à l'entier supérieur, alors que se passe-t-il si je l'applique après avoir divisé cette suite de nombres par 3 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >> ceil((1:9)/3)
    ans =
         1     1     1     2     2     2     3     3     3
    J'obtiens la suite de nombres désirée pour mon indexation en rangées, il suffit de remplacer le "9" par le triple du nombre de rangées de la matrice M, ce qui donne la matrice Mh où chaque rangée de M est triplée.

    Cependant, il faut faire suivre l'heure comme tu le désires ! Dans tes données, il n'y a donc que la 4e colonne à modifier.

    Tu as maintenant ces heures : [0,0,0,3,3,3,6,6,6]. Comment les faire devenir [0,1,2,3,4,5,6,7,8] ? Voyons voir la différence (soustraction) : [0,1,2,0,1,2,0,1,2]. Comment créer cette suite ? En fait, tu pourrais tout simplement utiliser la fonction repmat, mais puisqu'on utilise des astuces mathématiques depuis le début, continuons dans cette branche. Générons les nombres de 0 à 8 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >> 0:8
    ans =
         0     1     2     3     4     5     6     7     8
    Que se passe-t-il si on applique le modulo 3 à ces nombres ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >> mod(0:8,3)
    ans =
         0     1     2     0     1     2     0     1     2
    Et voilà ! Il suffit de remplacer le "8" par un de moins que le triple du nombre de rangées de la matrice M.

    Note : Pour ta question Pourquoi multiplier par 3 puis diviser par 3 ?, fais attention aux parenthèses. La taille en rangées de la matrice M est multipliée par 3 pour générer la suite de nombre consécutifs. Cette suite de nombres est par la suite divisée par 3 et finalement la fonction ceil y est appliquée.

  6. #6
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 54
    Points : 30
    Points
    30
    Par défaut
    Je veux juste vous dire UN GRAND MERCI pour toutes ses explications
    Merci

  7. #7
    Membre du Club
    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
    Points : 49
    Points
    49
    Par défaut
    Oui, moi aussi Merci !

    Trop souvent les gens trouvent une solution à leur problème, mais ne partegant pas la solution ... ou alors c'est incompréhensible pour les débutants ^^
    C'est sympa que ceux qui comprennent jouent le jeu !


    Bref ...
    J'avais pensé mettre en place une suite arithmétique pour générer mais heures (0,1,2,3,4,5,...) à partir des heures tri-horaire( 0,3,6,9,12 ...). Mais je n'avais pas trouvé la solution, et encore mins comment la transcrire avec Matlab.

    Je garde tes infos bien au chaud !!

    A+

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

Discussions similaires

  1. Remplacer les lignes d'un fichier excel par les lignes d'un autre fichier
    Par nandy.c dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 17/05/2013, 14h35
  2. Réponses: 16
    Dernier message: 15/08/2008, 11h08
  3. Réponses: 5
    Dernier message: 17/06/2008, 15h17
  4. Réponses: 6
    Dernier message: 29/11/2007, 16h15
  5. recuper les valeurs d'une matrice
    Par marcelsoh1 dans le forum C
    Réponses: 2
    Dernier message: 06/09/2006, 16h48

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