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 :

Remplissage sélectif d'une matrice


Sujet :

MATLAB

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut Remplissage sélectif d'une matrice
    Bonjour à tous,

    Je cherche à remplir sélectivement un certain tableau noté mat. Pour faire simple, j'initialise une matrice de 12 colonnes de zéro. Je remplis les trois premières avec des nombres et je veux remplir les 7 colonnes restantes avec d'autres nombres mais ce remplissage est fonction de ce qu'il y a dans la troisième colonne. Par exemple je cherche les indices dans la troisième colonne où je trouve le nombre 123 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A123=find(mat(:,3)==123);
    Ce que je veux c'est remplir uniquement les colonnes 7 à 12 pour les lignes trouvées dans A123. SI j'écris la chose suivante :

    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
     
    A=mat(:,1);
    B=mat(:,2);
     
    G=mat(:,7);
    H=mat(:,8);
    I=mat(:,9);
    J=mat(:,10);
    K=mat(:,11);
    L=mat(:,12);
     
    A123=find(mat(:,3)==123);
    A123_C1=A(A123);
    A123_C2=B(A123);
    if(numel(A123)>0)
        for i=1:size(A123,1)
        G(i)=median(valeurs_Imp1(A123_C1(i):A123_C2(i)));
        H(i)=median(valeurs_Imp2(A123_C1(i):A123_C2(i)));
        I(i)=median(valeurs_Imp3(A123_C1(i):A123_C2(i)));
        J(i)=1E36;
        K(i)=1E36;
        L(i)=1E36;
        end 
     
    mat(:,7)=G;
    mat(:,8)=H;
    mat(:,9)=I;
    mat(:,10)=J;
    mat(:,11)=K;
    mat(:,12)=L;
     
     
    end
    Cela ne marche pas : je ne remplis aps G,H,I,JK,L seulement pour les indices de A123. Je sais que c'est faux en raison du for qui ne parcourt pas ce qu'il faut. Mais je n'arrive pas à remplir seulement ce que je veux.

  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 302
    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 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Essaie de comprendre ces deux exemples simples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    M = rand(1,10)
     
    idx = find(M>.3);
     
    for n = 1:numel(idx)
        M(idx(n)) = NaN;
    end
     
    M
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    M = rand(1,10)
     
    idx = find(M>.3);
     
    for n = idx
        M(n) = NaN;
    end
     
    M
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Bonjour Dut et merci pour ta réponse.

    Si je ne m'abuse ces deux codes que tu proposes font donc la même chose : on se donne un vecteur colonne avec 10 lignes et on recherche les indices où les valeurs de M sont supérieures à 0.3 puis on met les valeurs correspondantes de M à NaN. Il se trouve que je ne connaissais pas la notation "for n=idx" et de ce fait le premier code est plus lisible pour moi.

    Malheureusement, dans mon cas la variante équivalente avec n=idx ne marche pas : si je tappe ce qui suit :

    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
    A123=find(mat(:,3)==123);
    if(numel(A123)>0)
        for i=A123
        G(i)=median(valeurs_Imp1(A(i):B(i)));
        H(i)=median(valeurs_Imp2(A(i):B(i)));
        I(i)=median(valeurs_Imp3(A(i):B(i)));
        J(i)=1E36;
        K(i)=1E36;
        L(i)=1E36;
        end 
     
    mat(:,7)=G;
    mat(:,8)=H;
    mat(:,9)=I;
    mat(:,10)=J;
    mat(:,11)=K;
    mat(:,12)=L;
     
    end
    Sachant que A123 possède 128 lignes dans un exemple, tout se passe comme si on était tout le temps au rang 128 : le remplissage des colonnes 7 à 12 de mat se fait 128 fois avec les mêmes valeurs. J'obtiens donc l'allure de mat suivante :

    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
    595	598	123	5,8	2	12	-1490,5	-1018,3	-897,5	1e+036	1e+036	1e+036
    801	803	123	5,6	2	12	-1490,5	-1018,3	-897,5	1e+036	1e+036	1e+036
    1306	1314	123	5,9	2	12	-1490,5	-1018,3	-897,5	1e+036	1e+036	1e+036
    1357	1359	123	5,9	2	12	-1490,5	-1018,3	-897,5	1e+036	1e+036	1e+036
    1579	1582	1234	5,7	2	12	0	0	0	0	0	0
    1584	1600	123	5,8	2	12	-1490,5	-1018,3	-897,5	1e+036	1e+036	1e+036
    3078	3080	123	5,9	2	12	-1490,5	-1018,3	-897,5	1e+036	1e+036	1e+036
    3209	3217	123	5,8	2	12	-1490,5	-1018,3	-897,5	1e+036	1e+036	1e+036
    3228	3230	123	5,9	2	12	-1490,5	-1018,3	-897,5	1e+036	1e+036	1e+036
    3826	3880	123	5,6	2	12	-1490,5	-1018,3	-897,5	1e+036	1e+036	1e+036
    4371	4375	123	5,4	2	12	-1490,5	-1018,3	-897,5	1e+036	1e+036	1e+036
    6290	6293	123	5,1	2	12	-1490,5	-1018,3	-897,5	1e+036	1e+036	1e+036
    6304	6306	123	5,1	2	12	-1490,5	-1018,3	-897,5	1e+036	1e+036	1e+036
    6630	6700	123	5,1	2	12	-1490,5	-1018,3	-897,5	1e+036	1e+036	1e+036
    6740	6742	123	5,1	2	12	-1490,5	-1018,3	-897,5	1e+036	1e+036	1e+036
    6799	6803	123	5,1	2	12	-1490,5	-1018,3	-897,5	1e+036	1e+036	1e+036
    6840	6849	123	5	2	12	-1490,5	-1018,3	-897,5	1e+036	1e+036	1e+036
    Par contre avec le code suivant :

    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
    A123=find(mat(:,3)==123);
    if(numel(A123)>0)
        for i=1:size(A123,1)
        G(A123(i))=median(valeurs_Imp1(A(A123(i)):B(A123(i))));
        H(A123(i))=median(valeurs_Imp2(A(A123(i)):B(A123(i))));
        I(A123(i))=median(valeurs_Imp3(A(A123(i)):B(A123(i))));
        J(A123(i))=1E36;
        K(A123(i))=1E36;
        L(A123(i))=1E36;
        end 
     
    mat(:,7)=G;
    mat(:,8)=H;
    mat(:,9)=I;
    mat(:,10)=J;
    mat(:,11)=K;
    mat(:,12)=L;
     
    end
    Ce que je veux faire fonctionne : tous les i de 1 à 128 sont bien parcouru et on obtient l'allure suivante :

    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
    595	598	123	5,8	2	12	-1490,5	-1018,3	-897,5	1e+036	1e+036	1e+036
    801	803	123	5,6	2	12	286,5	-165	311	1e+036	1e+036	1e+036
    1306	1314	123	5,9	2	12	-565	-395	193	1e+036	1e+036	1e+036
    1357	1359	123	5,9	2	12	-635	-1154	-1173	1e+036	1e+036	1e+036
    1579	1582	1234	5,7	2	12	0	0	0	0	0	0
    1584	1600	123	5,8	2	12	-295,5	-480	-1064,5	1e+036	1e+036	1e+036
    3078	3080	123	5,9	2	12	-1698	-1805	-1338	1e+036	1e+036	1e+036
    3209	3217	123	5,8	2	12	-1092	21,5	-225,5	1e+036	1e+036	1e+036
    3228	3230	123	5,9	2	12	-1121	-1797	-1256,5	1e+036	1e+036	1e+036
    3826	3880	123	5,6	2	12	-160	-256,5	-340,5	1e+036	1e+036	1e+036
    4371	4375	123	5,4	2	12	106	65,5	-144	1e+036	1e+036	1e+036
    6290	6293	123	5,1	2	12	173,25	131	20	1e+036	1e+036	1e+036
    6304	6306	123	5,1	2	12	170	154	207,5	1e+036	1e+036	1e+036
    6630	6700	123	5,1	2	12	-44	-485	-524	1e+036	1e+036	1e+036
    6740	6742	123	5,1	2	12	67	147,5	121	1e+036	1e+036	1e+036
    6799	6803	123	5,1	2	12	-169,5	-275	13,5	1e+036	1e+036	1e+036
    6840	6849	123	5	2	12	-180,25	74,5	535,5	1e+036	1e+036	1e+036
    Voilà, donc je ne vois pas pourquoi la première variante ne marche pas alors que sur ton exemple c'est bon.

    De plus voici l'ensemble du 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
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    G=mat(:,7);
    H=mat(:,8);
    I=mat(:,9);
    J=mat(:,10);
    K=mat(:,11);
    L=mat(:,12);
     
    A123=find(mat(:,3)==123);
    if(numel(A123)>0)
        for i=1:size(A123,1)
        G(A123(i))=median(valeurs_Imp1(A(A123(i)):B(A123(i))));
        H(A123(i))=median(valeurs_Imp2(A(A123(i)):B(A123(i))));
        I(A123(i))=median(valeurs_Imp3(A(A123(i)):B(A123(i))));
        J(A123(i))=1E36;
        K(A123(i))=1E36;
        L(A123(i))=1E36;
        end 
     
    mat(:,7)=G;
    mat(:,8)=H;
    mat(:,9)=I;
    mat(:,10)=J;
    mat(:,11)=K;
    mat(:,12)=L;
     
    end
     
    A1234=find(mat(:,3)==1234);
    if(numel(A1234)>0)
        for i=1:size(A1234,1)
        G(A1234(i))=median(valeurs_Imp1(A(A1234(i)):B(A1234(i))));
        H(A1234(i))=median(valeurs_Imp2(A(A1234(i)):B(A1234(i))));
        I(A1234(i))=median(valeurs_Imp3(A(A1234(i)):B(A1234(i))));
        J(A1234(i))=median(valeurs_Imp4(A(A1234(i)):B(A1234(i))));
        K(A1234(i))=1E36;
        L(A1234(i))=1E36;
        end 
     
    mat(:,7)=G;
    mat(:,8)=H;
    mat(:,9)=I;
    mat(:,10)=J;
    mat(:,11)=K;
    mat(:,12)=L;
     
    end
     
    A12345=find(mat(:,3)==12345);
    if(numel(A12345)>0)
        for i=1:size(A12345,1)
        G(A12345(i))=median(valeurs_Imp1(A(A12345(i)):B(A12345(i))));
        H(A12345(i))=median(valeurs_Imp2(A(A12345(i)):B(A12345(i))));
        I(A12345(i))=median(valeurs_Imp3(A(A12345(i)):B(A12345(i))));
        J(A12345(i))=median(valeurs_Imp4(A(A12345(i)):B(A12345(i))));
        K(A12345(i))=median(valeurs_Imp5(A(A12345(i)):B(A12345(i))));
        L(A12345(i))=1E36;
        end 
     
    mat(:,7)=G;
    mat(:,8)=H;
    mat(:,9)=I;
    mat(:,10)=J;
    mat(:,11)=K;
    mat(:,12)=L;
     
    end
     
    A123456=find(mat(:,3)==123456);
    if(numel(A123456)>0)
        for i=1:size(A123456,1)
        G(A123456(i))=median(valeurs_Imp1(A(A123456(i)):B(A123456(i))));
        H(A123456(i))=median(valeurs_Imp2(A(A123456(i)):B(A123456(i))));
        I(A123456(i))=median(valeurs_Imp3(A(A123456(i)):B(A123456(i))));
        J(A123456(i))=median(valeurs_Imp4(A(A123456(i)):B(A123456(i))));
        K(A123456(i))=median(valeurs_Imp5(A(A123456(i)):B(A123456(i))));
        L(A123456(i))=median(valeurs_Imp6(A(A123456(i)):B(A123456(i))));
        end 
     
    mat(:,7)=G;
    mat(:,8)=H;
    mat(:,9)=I;
    mat(:,10)=J;
    mat(:,11)=K;
    mat(:,12)=L;
     
    end
    Je cherche successivement 123, 1234, 12345, 123456 sur la troisième colonne et je remplis les 5 dernières en conséquences. Pourrais-je toutefois faire plus court, notamment sans 4 boucles ?

Discussions similaires

  1. [TPW] Remplissage aléatoire d'une matrice avec une condition
    Par abdou monta dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 24/11/2012, 16h54
  2. remplissage d'une matrice
    Par yasinfo dans le forum JBuilder
    Réponses: 2
    Dernier message: 30/12/2008, 23h25
  3. Remplissage d'une matrice
    Par vg-matrix dans le forum C
    Réponses: 5
    Dernier message: 28/05/2008, 23h26
  4. Algorithme de remplissage d'une matrice
    Par bettiboo94 dans le forum MATLAB
    Réponses: 1
    Dernier message: 18/05/2008, 05h53
  5. [Débutant] Remplissage d'une matrice
    Par Keldou dans le forum Octave
    Réponses: 2
    Dernier message: 24/04/2007, 19h54

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