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 :

[débutant]ajout de lignes à un endroit précis dans une matrice


Sujet :

MATLAB

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut [débutant]ajout de lignes à un endroit précis dans une matrice
    Bonjour

    j'ai un petit souci, j'aimerai ajouter à une matrice des lignes à un endroit précis

    j'ai une matrice de trois colonnes sur 286 lignes
    la première colonne de cette matrice correspond à des jours (1 pour le 1 janvier, 32 pour le 1 fevrier, 363 pour le 29 décembre et ainsi de suite)

    voilà un exemple de la matrice, la fin de l'année appelée MA0T440
    319.0000 0.4648 0.4237

    327.0000 0.7263 0.3376

    328.0000 0.6535 0.2993

    329.0000 0.5990 0.2615

    330.0000 0.3182 0.4248

    339.0000 NaN 0.5371

    340.0000 NaN 0.6204

    341.0000 NaN 0.6159

    342.0000 0.1868 0.4811

    360.0000 0.1641 0.4232

    361.0000 0.2120 0.4216

    362.0000 0.1324 0.3416

    363.0000 0.1647 0.2681
    la valeur 319 correspond au 14 novembre et la valeur 363 au 29 décembre
    comme cette matrice fait 286 lignes, il me manque donc 79 jours

    j'ai créé une matrice de trois colonnes sur 365 lignes appelée 'jour',
    la première colonne de correspond à tous les jours de l'année, les deux autres sont des NaN
    exemple
    351 NaN NaN

    352 NaN NaN

    353 NaN NaN

    354 NaN NaN

    355 NaN NaN

    356 NaN NaN

    357 NaN NaN

    358 NaN NaN

    359 NaN NaN

    360 NaN NaN

    361 NaN NaN

    362 NaN NaN

    363 NaN NaN

    364 NaN NaN

    365 NaN NaN
    en utilisant la fonction setdiff, j'ai trouvé les jours qui me manquent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    %comparaison des deux matrices
     
    jour;
     
    MAOT440;
     
    %Magou05lev2=[];
     
    %%% Trouve les jours où il n'y a pas de valeurs, réponse est c
     
    [c, i] = setdiff(jour(:,1), MAOT440(:,1),'rows');
    l'idée est maintenant d'ajouter à ma matrice MAOT440, les dates qui me manquent, soit les lignes de ma matrice 'jour' correspondant au c de setdiff

    on devrait obtenir à la fin
    357 NaN NaN

    358 NaN NaN

    359 NaN NaN

    360 0.1641 0.4232

    361 0.2120 0.4216

    362 0.1324 0.3416

    363 0.1647 0.2681

    364 NaN NaN

    365 NaN NaN
    la présence des NaN est importante

    et c'est que j'ai un souci je vois pas comment faire pour obtenir ce résultat


    merci pour l'aide

    bonne journée

  2. #2
    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 881
    Points
    52 881
    Par défaut
    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
    M = [360 0.1641 0.4232
         361 0.2120 0.4216
         362 0.1324 0.3416
         363 0.1647 0.2681];
     
    N = [357 NaN NaN
         358 NaN NaN
         359 NaN NaN
         364 NaN NaN
         365 NaN NaN];
     
    M = [M;N];
    [pasbesoin,idx] = sort(M(:,1));
     
    M = M(idx,:)
    Ou plus simplement si la première colonne contient uniquement des valeurs distinctes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    M = [360 0.1641 0.4232
         361 0.2120 0.4216
         362 0.1324 0.3416
         363 0.1647 0.2681];
     
    N = [357 NaN NaN
         358 NaN NaN
         359 NaN NaN
         364 NaN NaN
         365 NaN NaN];
     
    M = sortrows([M;N])

  3. #3
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    merci pour la réponse


    cet exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    M = [360 0.1641 0.4232
         361 0.2120 0.4216
         362 0.1324 0.3416
         363 0.1647 0.2681];
     
    N = [357 NaN NaN
         358 NaN NaN
         359 NaN NaN
         364 NaN NaN
         365 NaN NaN];
     
    M = sortrows([M;N])
    celà fonctionne trés bien

    mais avec mes deux matrices, le résultat n'est le même, en fait celà double mes lignes
    code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     M = sortrows([MAOT440;jour])
    résultat
    359.0000 NaN NaN

    360.0000 0.1641 0.4232

    360.0000 NaN NaN

    361.0000 0.2120 0.4216

    361.0000 NaN NaN

    362.0000 0.1324 0.3416

    362.0000 NaN NaN

    363.0000 0.1647 0.2681

    363.0000 NaN NaN

    364.0000 NaN NaN

    365.0000 NaN NaN
    le problème doit venir de la distinction que tu as évoqué

    pour ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    M =[MAOT440;jour];
     
    [pasbesoin,idx] = sort(M(:,1));
     
    M = M(idx,:)
    même résultat, les lignes communes se doublent donc j'ai 651 lignes (365+286)

  4. #4
    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
    Comme ça (sans tester) je dirais de remplacer dans le 1er code la fonction SORT par la fonction UNIQUE.

    Note : Dut avait bien signalé pour le 2ème code :
    Citation Envoyé par Dut
    si la première colonne contient uniquement des valeurs distinctes

  5. #5
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    le problème vient de là en effet

    avec la fonction unique ça ne fonctionne pas ça donne avec ce code,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    M =[MAOT440;jour];
     
    [pasbesoin,idx] = unique(M(:,1));
     
    M = M(idx,:)
    résultat
    361 NaN NaN
    362 NaN NaN
    363 NaN NaN
    364 NaN NaN
    365 NaN NaN

    avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    M = sortrows([MAOT440;jour]);
     
    [n m]=size(M)
    résultat
    362.0000 0.1324 0.3416
    362.0000 NaN NaN
    363.0000 0.1647 0.2681
    363.0000 NaN NaN
    364.0000 NaN NaN
    365.0000 NaN NaN

    j'arrive à enlever ces lignes doubles avec ce code un peu tiré par les cheveux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    M = sortrows([MAOT440;jour]);
     
    [n m]=size(M)
     
    for lig=1:n
     
    if M(lig,1)==M(lig+1,1);
     
       M(lig+1,:)=[];
     
    end
     
    end
    j'ai le message d'erreur suivant
    ??? Index exceeds matrix dimensions.

    Error in ==> AOTlev2 at 190

    if M(lig,1)==M(lig+1,1)
    ;

    par contre le résultat de M dans la command matlab est :
    358.0000 NaN NaN

    359.0000 NaN NaN

    360.0000 0.1641 0.4232

    361.0000 0.2120 0.4216

    362.0000 0.1324 0.3416

    363.0000 0.1647 0.2681

    364.0000 NaN NaN

    365.0000 NaN NaN

    c'est ce que je veux obtenir

    merci pour l'aide

  6. #6
    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
    Tu peux réessayer ton code avec une boucle inversée.

    C'est le même problème que tu as déjà eu : quand tu enlèves des lignes à ta matrice sa taille diminue (logique non ?) donc si tu boucles jusqu'à la taille finale initiale de ta matrice forcément il y a un problème.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    M=rand(3);%M est une matrice 3*3
    for k=1:length(M) %k=1 à 3
       M(k,:)=[];%k'enlève la ligne 1
    end
    Que se passe-t-il ?
    pour k=1
    M(1,: )=[] => M est de taille 2*3
    pour k=2
    M(2,: )=[] => M est de taille 1*3
    pour k=3
    M(3,: )=[] => Argh ce n'est pas possible car il n'y a plus de 3ème ligne

  7. #7
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    je vois pas dans ma boucle comment faire autrement en fait

    j'ai du mal à savoir comment l'ecrire, j'ai compris l'erreur mais je vois pas comment rédiger l'idée que j'ai si elle est bonne bien entendue

  8. #8
    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
    Boucle inversée :
    Au lieu de Tu fais Après essayes d'écrire à la main ce qui va se passer sur quelques lignes et voit comment tu gères les indices.
    D'ailleurs comme tu vas comparer les indices lig et lig+1 il faudrait commencer à n-1 (si n est le nombre de lignes de ta matrice).

  9. #9
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    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
    M = sortrows([MAOT440;jour]);
     
    [n m]=size(M)
     
    MAT=[];
     
    k=1;
     
     
     
    for lig=1:n-1
     
    if M(lig,1)==M(lig+1,1);
     
       MAT(k,:)=M(lig,:);
     
    elseif M(lig,1)~=M(lig+1,1) 
     
      MAT(k,:)=M(lig+1,:); 
     
       k=k+1;
     
    end
     
    end
    avec le code suivant j'obtiens une matrice de 364 lignes, il me manque juste le premier jour début de ma matrice M
    M =



    1.0000 0.2192 0.3646

    1.0000 NaN NaN

    2.0000 0.5646 0.1058

    2.0000 NaN NaN

    3.0000 0.9561 0.0528

    3.0000 NaN NaN

    4.0000 0.6586 0.0982

    4.0000 NaN NaN

    5.0000 0.9486 0.0366

    5.0000 NaN NaN

    6.0000 NaN NaN

    7.0000 1.0309 0.0970

    7.0000 NaN NaN
    je comprends pas pourquoi il manque cette ligne et je vais regarder ton dernier message et essayé de comprendre

    merci pour ton attention

  10. #10
    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
    Je n'arrive décidément pas à te vendre ma boucle inversée
    Pourtant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for lig=n-1:-1:1
       if M(lig,1)==M(lig+1,1);
          M(lig+1,:)=[];
       end
    end
    devrait faire l'affaire.

  11. #11
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    ta boucle inversée est magique mais j'arrive pas à voir ce que ça fait en fait, je suis en train d'ecrire à la main les lignes

    en tout cas bien evidemment ça marche....comme d'habitude en fait


    maintenant je dois faire un compteur pour compter mes jours avec des NaN sur ma deuxieme colonne et reussir a faire dire à mon programme les jours ou j'ai des NaN

    merci beaucoup en tout cas

  12. #12
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    code
    for lig=n-1:-1:1
       if M(lig,1)==M(lig+1,1);
          M(lig+1,:)=[];
       end
    end
    j'ai pigé ta boucle inversée, en fait la raison pour laquelle je comprenais pas (j'assume je vais avoir l'air ridicule), c'est qu'en fait pour lire les lignes de M suivant l'indice lig, je suivais la boucle alors que c'est pas ça c'est à dire

    exemple
    362.0000 0.1324 0.3416

    362.0000 NaN NaN

    363.0000 0.1647 0.2681

    363.0000 NaN NaN

    364.0000 NaN NaN

    365.0000 NaN NaN


    pour lig=363, ligne 363.0000 0.1647 0.2681
    lig+1 est la ligne 363.0000 NaN NaN et non 362.0000 NaN NaN

    et comme on remonte, on peut eliminer les lignes au fur et à mesure et arriver jusqu'à la fin de la matrice


    voilà merci encore

  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
    Citation Envoyé par niepoc Voir le message
    maintenant je dois faire un compteur pour compter mes jours avec des NaN sur ma deuxieme colonne et reussir a faire dire à mon programme les jours ou j'ai des NaN
    Pense à regarder l'aide de la fonction isnan (parce qu'il y a un piège : NaN n'est pas égal à NaN)

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2008
    Messages : 57
    Points : 52
    Points
    52
    Par défaut
    bonjour,

    Je ne comprends pas pourquoi tu ne rajoutes pas seulement les éléments manquants comme présenté au début de ton post ?

    Les résultats obtenus par setdiff semblaient bon.
    A quoi sert donc d'utiliser la fonction setdiff si tu ne te sers pas du résultat

    Je pense que Dut a présenté une solution élégante.

    En ce qui concerne la suppression des lignes dans une matrice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    %ind_s les indices à supprimer
    M(ind_s,:) = [];
    Le truc des boucles c'est trop compliqué...

    Autre solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    M = sortrows([MAOT440;jour]);
    Ind = find(diff(M(:,1))==0)
    M(Ind+1,:) = [];
    la différence me donne zéro sur les doublons, find me trouve les indices
    Ind+1 parce que tes doublons (NaN) se placent en seconde position lors d'un tri

    et hop le tour est joué

  15. #15
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    merci antonin pour ta réponse...comme ça j'ai plusieurs versions ça m'aide à comprendre

    suite du code pour compter les jours sans les NaN, avec les NaN et position des jours avec NaN

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    aot=M(:,2)'; %colonne devient un vecteur
     
    idx=isnan(aot); %trouve les NaN, indice 1
     
    nbjourNaN=find(idx==1); %vecteur avec la position des NaN
     
    nbjoursansaot=numel(nbjourNaN); %nombre de jours sans aot 
     
    nbjouraot=(length(aot)-nbjoursansaot); %nombre de jour avec des valeurs aot
    merci à ceux qui m'ont aidé

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

Discussions similaires

  1. [Débutant] Ouvrir fichier texte à un endroit précis dans une textbox
    Par GuillaumeNcy dans le forum VB.NET
    Réponses: 6
    Dernier message: 29/11/2013, 12h12
  2. [Débutant] Copie d'une ligne prédéfinie x fois dans une matrice
    Par franck34matlab dans le forum Images
    Réponses: 7
    Dernier message: 12/01/2013, 10h22
  3. [AC-2003] récupérer une donnée à un endroit précis dans une table
    Par justine' dans le forum VBA Access
    Réponses: 3
    Dernier message: 12/04/2011, 17h39
  4. Ajout ligne aprés N°ligne précis dans fichier txt
    Par dubinc38 dans le forum VBScript
    Réponses: 12
    Dernier message: 24/02/2009, 08h09
  5. Réponses: 2
    Dernier message: 19/03/2007, 20h52

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