Matlab - Insérer ligne dans matrice
Répondre à la discussion
Affichage des résultats 1 à 22 sur 22

Matlab - Insérer ligne dans matrice



  1. #1
    invite1038f851

    Matlab - Insérer ligne dans matrice


    ------

    Bonjour,

    ma question est la suivante : comment insérer une ligne où l'on veut dans une matrice, sans écraser la ligne de la matrice. C'est à dire que l'on passerait d'une matrice à n lignes à une matrice à n+1 lignes.

    Par exemple :

    On a :
    Code:
    A=[1 2 3 ; 4 5 6 ; 10 11 12 ; 13 14 15]
    Et on veut insérer la ligne 7 8 9 en troisième ligne pour avoir au final :
    A =

    1 2 3
    4 5 6
    7 8 9
    10 11 12
    13 14 15
    J'espère que c'est possible, simplement.

    Merci d'avance pour votre aide.

    -----

  2. #2
    inviteb9f49292

    Re : Matlab - Insérer ligne dans matrice

    Code:
    B = [A(1:2, :); 7, 8, 9; A(3:end, :)]
    et voilà

  3. #3
    invite1038f851

    Re : Matlab - Insérer ligne dans matrice

    Merci beaucoup pour cette réponse.

    Je souhaite utilisé ceci pour concaténer deux matrices mais je ne sais vraiment pas comment comparer deux matrices.

    L'exemple suivant très simplifié illustre mon problème :

    Soient :

    A =

    1 1 1
    2 2 2
    5 5 5
    7 7 7
    10 10 10
    14 14 14
    B =

    3 3 3
    8 8 8
    12 12 12
    et j'aimerais avoir :

    C =

    1 1 1
    2 2 2
    3 3 3
    5 5 5
    7 7 7
    8 8 8
    10 10 10
    12 12 12
    14 14 14
    Mais je bloque complétement.

    Merci beaucoup pour votre aide !

  4. #4
    inviteb9f49292

    Re : Matlab - Insérer ligne dans matrice

    Le principe est le même:
    Code:
     C = [A(1:2, :); B(1, :); A (3:4, :); B(2, :); A(5, :); B(end, :); A (end, :)];

  5. A voir en vidéo sur Futura
  6. #5
    invite1038f851

    Re : Matlab - Insérer ligne dans matrice

    Je suis d'accord mais je cherche un moyen de le faire automatiquement, avec une boucle, en comparant les valeurs de chaque lignes à insérer à celle de la matrice où l'on veut insérer...

    Des idées ...??

    Merci d'avance

  7. #6
    invitea29b3af3

    Re : Matlab - Insérer ligne dans matrice

    Bonjour,

    C'est possible en seulement 1 ligne

    C=sort([A;B]);

  8. #7
    invite1038f851

    Re : Matlab - Insérer ligne dans matrice

    J'ai regardé l'aide pour SORT. Merci pour m'avoir fait découvrir cette commande.
    Mais le problème c'est que moi j'ai 3 colonnes qui correspondent à des positions successives d'un mobile dans un système X,Y,Z. Je peux donc avoir pour une colonne par exemple :

    1
    3
    5
    8
    11
    15
    20
    28
    24
    21
    18
    22
    25
    29
    30

    (désolé de ne pas l'avoir préciser avant, j'avance petit à petit...)

    Merci d'avance pour d'éventuelles pistes.

  9. #8
    invitea29b3af3

    Re : Matlab - Insérer ligne dans matrice

    Mais dans ce cas-là tu veux faire quoi? Classer ces positions XYZ dans l'ordre croissants des X? ou des Y? ou des Z? ou selon autre chose?

  10. #9
    invite1038f851

    Re : Matlab - Insérer ligne dans matrice

    C'est vrai je me rends compte que je ne suis pas clair du tout et je m'en excuse vraiment.
    Ces questions étaient destinées à essayer de trouver des pistes de réponse pour la discussion http://forums.futura-sciences.com/ma...ml#post3062230

    Désolé pour ce manque de précision, merci pour ton attention, et si tu peux jeter un œil à la discussion ce serait super. Moi pour l'instant j'insère les lignes manuellement comme tu me l'as indiqué au début de cette conversation. Mais c'est pas évident quand t'as des fichiers de plus de 10000 lignes...

    Merci d'avance.

  11. #10
    invitea29b3af3

    Re : Matlab - Insérer ligne dans matrice

    pour l'instant j'insère les lignes manuellement comme tu me l'as indiqué au début de cette conversation
    C'était pas moi

    J'ai jeter un coup d'oeil à l'autre sujet et je ne comprends toujours pas quel est le critère de classification de tes coordonnées. Tu dis que tu ne veux classer que celles pour lesquelles la 4e colonne est non-nulle, que tu veux pouvoir les mettre exactement où tu veux dans une matrice, mais quel est le critère pour le choix de cet emplacement? Selon la valeur de la 4e colonne, selon .... ?

  12. #11
    invite1038f851

    Re : Matlab - Insérer ligne dans matrice

    Soit par exemple le fichier de points suivant en entrée de la fonction :

    35.0000 47.0000 1.0000 37801.0000
    33.9317 46.6972 2.0904 0.0000
    32.4907 46.4027 3.5890 0.0000
    30.7579 46.0925 5.4017 0.0000
    28.8143 45.7426 7.4345 0.0000
    26.7408 45.3288 9.5933 0.0000
    24.6183 44.8271 11.7841 0.0000
    22.5277 44.2135 13.9129 0.0000
    20.5499 43.4639 15.8856 0.0000
    18.7659 42.5543 17.6081 0.0000
    17.2565 41.4605 18.9865 0.0000
    16.1027 40.1586 19.9267 0.0000
    16.0000 40.0000 20.0000 37900.0000
    15.5130 39.1264 20.2796 0.0000
    15.0540 38.1165 20.4270 0.0000
    14.6260 36.9863 20.4549 0.0000
    14.2320 35.7520 20.3760 0.0000
    13.8750 34.4297 20.2031 0.0000
    13.2840 31.5856 19.6264 0.0000
    12.6879 25.8517 18.0005 0.0000
    12.6640 24.0640 17.4320 0.0000
    13.0906 19.4120 15.9570 0.0000
    13.4316 18.0020 15.5523 0.0000
    13.8804 16.7578 15.2436 0.0000
    14.8817 15.1284 15.0022 0.0000
    15.0000 15.0000 15.0000 38000.0000
    15.5208 14.5277 15.0118 0.0000
    16.2811 14.0131 15.0589 0.0000
    16.4470 13.9200 15.0725 0.0000
    17.1539 13.5793 15.1401 0.0000

    La fonction calcul la distance entre chaque point successifs, puis une distance cumulée de point à point. Et lorsque la distance calculée passe supérieur à un multiple de 5 on effectue une interpolation linéaire pour créer les coordonnées d'un point situé à un multiple de 5 du premier. (j'espère être clair).
    J'aimerais alors pouvoir, en même temps que l'on parcours la matrice des distance cumulée (où l'on repère les multiple de 5), parcourir la matrice de coordonnées spécifiées en entrée et dès qu'une ligne dont la 4e colonne est non nul, on l'écrit dans le fichier de points de sortie (entre les différents points créé par interpolation)

    Voila j'espère avoir été clair. Donc une première éventualité aurait été de parcourir les deux matrices en même temps comme je viens de l'expliquer.
    Mais ne réussissant pas ceci, j'ai essayer une autre façon. C'est à dire récupérer tout les points dont la 4e colonne est non nulle, puis de les insérer dans la liste de points de sortie en comparant les trois colonnes. C'est à dire chaque ligne doit s'insérer entre deux points selon les coordonnées (qui sont croissantes où décroissante selon les colonnes).

    J'espère que j'ai été clair et que vous allez pouvoir me donner un petit coup de pouce.
    Merci d'avance.

  13. #12
    invitea29b3af3

    Re : Matlab - Insérer ligne dans matrice

    en comparant les trois colonnes
    Oui, mais selon quel critère ?

    Je ne sais pas si c'est moi qui suis complètement endormi et qui ne comprends rien, mais il me semble que tu n'as toujours pas répondu à ma question

    Si je prends l'exemple de ton fichier, les coordonnées que tu voudrais classer dans ta matrice seraient les suivantes :
    35.0000 47.0000 1.0000
    16.0000 40.0000 20.0000
    15.0000 15.0000 15.0000

    admettons que dans ta matrice tu as déjà les coordonnées suivantes:
    33 48 1
    34 47 2
    35 46 3
    36 45 4
    37 44 5
    38 43 6

    Où est-ce que tes coordonnées (35,47,1) viendraient se classer là-dedans? Quel est le critère de classification des coordonnées?

  14. #13
    invite1038f851

    Re : Matlab - Insérer ligne dans matrice

    La matrice dans laquelle je veux insérer les valeurs de mon fichier exemple peut être la suivante :

    36.63 48.8 0.88
    36.18 47.79 0.94
    endroit à insérer la première ligne
    33.14 45.18 3.38
    28.62 43.71 8.86
    19.72 41.88 17.31
    endroit à insérer la 2e ligne
    15.38 25.64 18.12
    endroit à insérer la 3e ligne
    13.39 3.21 12.21
    Il faudrait insérer les lignes où pour chaque colonne la valeur précédente à la ligne d'insertion est inférieure (respectivement supérieure) et la suivante est supérieure (respectivement inférieure)

    J'espère avoir été un peu plus clair. Merci d'avance.

  15. #14
    invitea29b3af3

    Re : Matlab - Insérer ligne dans matrice

    oooooook. Ce que je ne savais pas, c'est qu'apparemment y'avait aucun risque d'avoir X classé en 27ème position et Y en 5ème position ou je ne sais quoi pour un même point XYZ...

    Donc si je comprends bien avec l'exemple que tu me donnes, il suffit carrément de regarder uniquement la coordonnée X par exemple. Admettons qu'elle soit dans un ordre décroissant comme dans ton exemple.
    On a:
    A=[36.63 48.8 0.88;
    36.18 47.79 0.94;
    33.14 45.18 3.38;
    28.62 43.71 8.86;
    19.72 41.88 17.31;
    15.38 25.64 18.12;
    13.39 3.21 12.21];

    B=[35.0000 47.0000 1.0000;
    16.0000 40.0000 20.0000;
    15.0000 15.0000 15.0000];

    C=A;

    for i=1:size(B,1)
    j=max(find(A(:,1) > B(i,1)))+1; %ça te donne l'indice de la ligne où mettre les coordonnées
    C=[C(1:j-1, : ); B(i,: ); C(j:end, : )];
    end
    Voilà. J'espère que c'est ça que tu voulais, sinon hésite pas à me demander.

  16. #15
    invite1038f851

    Re : Matlab - Insérer ligne dans matrice

    Ça vient bon !

    Alors en fait le problème comme j'ai pu expliquer précédemment c'est que les valeurs de X (comme celles de Y et Z) vont augmenter puis diminuer puis augmenter... donc il faut vraiment que les valeurs insérés soient comparées à celles de la lignes précédentes et suivantes pour s'assurer qu'elles sont au bon endroit.

    De plus le mieux serait de pouvoir comparer les trois colonnes car il se pourrait qu'on ait dans la liste des valeurs de X qui reviennent mais avec des valeurs de Y différentes.

    Par exemple on peut avoir au début du fichier une ligne : 12.02 45.28 301.01
    puis vers la fin du fichier : 12.51 78.12 258.76

    Sinon pour un même point, ses coordonnées XYZ doivent être insérées sur la même ligne.

    Merci pour ton intérêt et j'espère que l'on va réussir à trouver une solution.

  17. #16
    invitea29b3af3

    Re : Matlab - Insérer ligne dans matrice

    Du coup c'est quand même un peu plus complexe

    Là je vais aller manger bientôt, mais je vais y réfléchir en mangeant ^^

    a+

  18. #17
    invitea29b3af3

    Re : Matlab - Insérer ligne dans matrice

    Bon tu peux essayer ça:
    A=[36.63 48.8 0.88;
    36.18 47.79 0.94;
    33.14 45.18 3.38;
    28.62 43.71 8.86;
    19.72 41.88 17.31;
    15.38 25.64 18.12;
    13.39 3.21 12.21];

    B=[35.0000 47.0000 1.0000;
    16.0000 40.0000 20.0000;
    15.0000 15.0000 15.0000];

    m=max(max(A))+1;

    M=[m, m, m; A; 0,0,0];
    for i=1:size(B,1)
    for j=1:size(M,1)-1
    M=[M(1:j, : ); B(i, : ); M(j+1:end, : )];
    if (M(j+1,1)<M(j+2,1) && M(j+1,1)>M(j,1)) || (M(j+1,1)>M(j+2,1) && M(j+1,1)<M(j,1)) && (M(j+1,1)<M(j+2,1) && M(j+1,1)>M(j,1)) || (M(j+1,1)>M(j+2,1) && M(j+1,1)<M(j,1)) && (M(j+1,1)<M(j+2,1) && M(j+1,1)>M(j,1)) || (M(j+1,1)>M(j+2,1) && M(j+1,1)<M(j,1))
    % rien faire
    else
    M=[M(1:j, : ); M(j+2:end, : )]; %on remet comme avant
    end
    end
    end

    C=M(2:end-1, : );
    J'ai testé avec les A et B ci-dessus, mais je suis pas certain que ça marche dans le cas général... tu pourrais m'envoyer ta vraie matrice A ou en tout cas disons une liste plus longue de coordonnées stp?

  19. #18
    invite1038f851

    Re : Matlab - Insérer ligne dans matrice

    Merci pour cette réponse. Je vais regarder en détail le code mais je l'ai essayer pour d'autres matrice mais cela ne fonctionne pas entièrement.

    Je vais essayer de comprendre pourquoi. Et si jamais t'as des infos je suis preneur...

    Je joins à ce post, deux matrices exemples. C'est des exemples simples mais je pense que si ça marche là ça devrait marcher tout le temps.

    Encore merci d'avance.
    Fichiers attachés Fichiers attachés

  20. #19
    invitea29b3af3

    Re : Matlab - Insérer ligne dans matrice

    j'avais oublié des paranthèses
    A=[32.2552 46.3593 3.8350;
    29.5123 45.8708 6.7052;
    26.7678 45.3346 9.5652;
    24.0216 44.6661 12.3952;
    21.2799 43.7648 15.1633;
    18.5750 42.4371 17.7876;
    16.1126 40.1729 19.9194;
    14.4954 36.5989 20.4400;
    13.5037 32.7691 19.8936;
    12.9141 28.9348 18.9273;
    12.6681 25.1158 17.7682;
    12.8137 21.3118 16.5472;
    13.5735 17.5544 15.4343;
    15.7681 14.3427 15.0242;
    19.4398 12.8870 15.4323;
    23.3596 12.4731 16.0820;
    27.2820 12.5854 16.8486;
    31.1645 13.0304 17.6980;
    34.9927 13.7257 18.6234;
    38.7522 14.6411 19.6348;
    42.3354 15.8830 20.8830;
    45.5540 17.5749 22.5433;
    48.5593 19.4945 24.3543;
    51.4702 21.5431 26.1787;
    54.3788 23.6699 27.9148;
    57.3804 25.8328 29.4322;
    60.6014 27.9526 30.4724;
    64.1423 29.7230 30.3461;
    67.3176 30.3750 28.1148;
    69.6464 30.2657 24.8741;
    71.5331 29.8606 21.3722;
    73.1739 29.3063 17.7673;
    74.6626 28.6641 14.1108;
    76.0547 27.9677 10.4262;
    77.3952 27.2429 6.7279;
    78.7431 26.5220 3.0315];

    B=[16.0000 40.0000 20.0000;
    15.0000 15.0000 15.0000;
    40.0000 15.0000 20.0000;
    65.0000 30.0000 30.0000;
    80.0000 26.0000 0.0000];

    m=10000;
    M=[0,0,0;A;m,m,m];
    s=size(M,1);

    for i=1:size(B,1)
    for j=1:s-1
    M=[M(1:j, : ); B(i, : ); M(j+1:end, : )];
    if ((M(j+1,1)<M(j+2,1) && M(j+1,1)>M(j,1)) || (M(j+1,1)>M(j+2,1) && M(j+1,1)<M(j,1))) && ((M(j+1,2)<M(j+2,2) && M(j+1,2)>M(j,2)) || (M(j+1,2)>M(j+2,2) && M(j+1,2)<M(j,2))) && ((M(j+1,3)<M(j+2,3) && M(j+1,3)>M(j,3)) || (M(j+1,3)>M(j+2,3) && M(j+1,3)<M(j,3)))
    s=s+1;
    else
    M=[M(1:j, : ); M(j+2:end, : )];
    end
    end
    end

    C=M(2:end-1, : );
    au final on obtient M:
    32.2552 46.3593 3.8350
    29.5123 45.8708 6.7052
    26.7678 45.3346 9.5652
    24.0216 44.6661 12.3952
    21.2799 43.7648 15.1633
    18.5750 42.4371 17.7876
    16.1126 40.1729 19.9194
    16.0000 40.0000 20.0000
    14.4954 36.5989 20.4400
    13.5037 32.7691 19.8936
    12.9141 28.9348 18.9273
    12.6681 25.1158 17.7682
    12.8137 21.3118 16.5472
    13.5735 17.5544 15.4343
    15.7681 14.3427 15.0242
    19.4398 12.8870 15.4323
    23.3596 12.4731 16.0820
    27.2820 12.5854 16.8486
    31.1645 13.0304 17.6980
    34.9927 13.7257 18.6234
    38.7522 14.6411 19.6348
    40.0000 15.0000 20.0000
    42.3354 15.8830 20.8830
    45.5540 17.5749 22.5433
    48.5593 19.4945 24.3543
    51.4702 21.5431 26.1787
    54.3788 23.6699 27.9148
    57.3804 25.8328 29.4322
    60.6014 27.9526 30.4724
    64.1423 29.7230 30.3461
    65.0000 30.0000 30.0000
    67.3176 30.3750 28.1148
    69.6464 30.2657 24.8741
    71.5331 29.8606 21.3722
    73.1739 29.3063 17.7673
    74.6626 28.6641 14.1108
    76.0547 27.9677 10.4262
    77.3952 27.2429 6.7279
    78.7431 26.5220 3.0315
    on voit que sur les 5 coordonnées de B y'en a 3 qui se sont classées correctement, 2 qui sont inclassables dans le liste (le 15,15,15 et le 86,26,0).
    Par contre si on avait par exemple 86,27,4, elle devrait se classer à la fin de la liste ou par exemple si on avait 30,45,1 il faudrait que ça se classe au début. C'est pour ça que j'ai utilisé la matrice M "allongée" en mettant 10000 et 0 à ses extrémités. D'où le fait que si tu veux être sûr de pas "rater" une coordonnée qui, manque de bol, devrait se classer tout à la fin ou tout au début de ta liste, tu lances deux fois l'algorithme. Une fois avec M tel que défini ci-dessus, et une fois avec M tel que M=[m,m,m;A;0,0,0];

    Et normalement ça devrait marcher.... redis-moi.

  21. #20
    invite1038f851

    Re : Matlab - Insérer ligne dans matrice

    Bon bin ça a l'air de fonctionner selon vous !!

    J'ai pas eu le temps de m'y remettre depuis ce matin, mais en tout cas un immense merci, je n'y serais pas arrivé seul ! Merci

    Il me reste plus qu'à comprendre le code et à l'adapter pour que les fichiers d'entrer et de sortie aient 4 colonnes mais la 4e on ne s'en occupe pas dans les traitements. C'est juste une info supplémentaire pour chaque ligne.

    Je pense que je devrais réussir ceci.

    Encore merci.

  22. #21
    invitea29b3af3

    Re : Matlab - Insérer ligne dans matrice

    De rien oui je pense que ça marche, je garantis rien, mais à mon avis ça devrait aller. Sinon redemande.

    Si jamais pour la compréhension du code, en gros je commence par rajouter 2 coordonnées fictives au début et à la fin, une très petite et une très grande, pour les "bords" de la liste, histoire que ça marche au moment du if, d'où le M=[0,0,0;A;m,m,m];

    Ensuite, pour chaque coordonnées XYZ de B, je l'insère dans M à la ligne j+1, je vérifie (là c'est le if qui fait 3 lignes..) si le X est bien plus petit/grand que le précédent et plus grand/petit que le suivant dans la liste, idem pour le Y, idem pour le Z. Si oui, je note simplement que la taille de M a augmenté de 1 (d'où le s=s+1), sinon, si ça marche pas, je l'enlève de M. Et j'essaie ça à toutes les lignes de M. Au final, les seules lignes qui sont effectivement rajoutées dans M sont simplement celles qui n'ont pas été enlevées, c'est-à-dire celle qui ont satisfait la condition du if.
    Dernière étape, le résultat est la matrice C qui est égale à la matrice M sans les 2 lignes rajoutées au début.

  23. #22
    invite1038f851

    Re : Matlab - Insérer ligne dans matrice

    Et bien un énorme merci pour ce gros coup de pouce, et les explications !! La seule chose qui me paraît bizarre c'est que la dernière ligne de B ne figure pas dans C alors qu'elle est inférieure à 10000. Peu importe, j'ai rajouté une ligne de code permettant de rajouter cette ligne à C.

    Un grand merci.

Discussions similaires

  1. matlab détection de ligne
    Par invite703b2a58 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 12/03/2010, 22h14
  2. suppression de ligne sous matlab
    Par invite9c7554e3 dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 22/02/2010, 15h10
  3. Comment insérer une fonction Matlab dans les paramètres d'entrée d'une autre fonction ??
    Par inviteac36b108 dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 04/01/2010, 08h16
  4. (Matlab) Extraire des données depuis un fichier texte et les placer dans une matrice
    Par invite02e128cc dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 14/12/2009, 12h09
  5. Effacer une colonne dans une matrice sous Matlab
    Par invitecb054b2d dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 10/01/2005, 19h21
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...