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 :

extraire des lignes en boucle


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 14
    Points : 5
    Points
    5
    Par défaut extraire des lignes en boucle
    Bonjour à tous,
    j'ai un tableau m*n comportant pour chaque case soit un 0 soit un 1.
    J'aimerai comparé le profil de mes lignes entre elles, et lorsque certaines lignes ont le même profil, les extraire de mon tableau (en les mettant dans un autre tableau, ainsi j'aurai autant de "sous-tableau" que de profils différents).

    Je me suis dit qu'il faudrait prendre la première ligne, la comparer avec les autres, l'extraire elle et ses petites copines, et recommencer l'opération (avec la seconde ligne qui sera passé du coup en tête de tableau) jusqu'à ce que mon tableau initiale soit vide. (s'il y a d'autres "plan" à suivre, je suis aussi preneur )

    Soit A mon tableau :
    Soit C et row mon nombre de ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %Pour comparer le profil :
    for C = 1:size(A,1)
          Cligne{C} = A(C,:);
       	C_ref{C} = Cligne{C}
       	for row = 2:size(A,1)
       	   Rligne{row} = A(row,:);
       	   corrsp{row} = comp_ref{C} & Rligne{row}
    c'est à partir de là que je suis plutôt perdu.

    -> De un ma première comparaison/correspondance me donne [], puisque je pars sur
    (en effet je ne vais pas comparer ma première ligne avec ma première ligne. Ou alors je supprime cette comparaison par la suite ?).

    -> De deux, je voudrais créer un nouveau tableau avec les lignes identiques. J'ai donc fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nmatrice.reseau{C} = [comp_ref{C},comp_compare]
    mais il semble que cela ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    " ??? Conversion to cell from double is not possible.
     
    Error in ==> C:\MATLABR11\toolbox\SPM99\danasupprm.m
    On line 19  ==>       Nmatrice.reseau{C} = [comp_ref{C},comp_compare] "
    -> De 3, je ne sais pas comment supprimer les lignes "à profil identiques" sans que ca fasse planter le bazar : une fois certaines lignes extraites, ma size(A,2) n'est plus la même. Il faudrait une sorte de mise à jour avant le premier "for"

    Si quelqu'un a des conseils pour me faire avancer dans ce truc...
    merci d'avance !
    Dan

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,
    Citation Envoyé par Daniel.R Voir le message
    j'ai un tableau m*n comportant pour chaque case soit un 0 soit un 1.
    J'aimerai comparé le profil de mes lignes entre elles, et lorsque certaines lignes ont le même profil, les extraire de mon tableau (en les mettant dans un autre tableau, ainsi j'aurai autant de "sous-tableau" que de profils différents).
    Le même profil, cela veut dire que tous les éléments de deux lignes sont égaux? Si oui, ceci peut t'intéresser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    help unique
    [b, m, n] = unique(A, 'rows')
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    merci.
    Ce n'est pas tout à fait cela, mais ce n'est pas grave puisque je souhaite rajouter un truc :
    j'aimerai calculer le coefficient de corrélation entre chacune de mes lignes (ce que je n'arrive pas à faire d'ailleurs), et en fonction du résultat extraires ces fameuses lignes de ma matrice...

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 14
    Points : 5
    Points
    5
    Par défaut coefficent de corrélation
    Pour préciser un peu :

    j'ai un tableau m*n comportant pour chaque case soit un 0 soit une valeur différente de 0 (en fait soit <-1.6 soit >1.6).
    Chacune de mes m lignes est une observation de n valeurs (ce n'est pas une mesure répétée, ce sont en l'occurrence des niveaux d'activité pour différentes aires cérébrales).
    J'aimerai savoir à quel point le profil de mes lignes se ressemblent en calculant un coefficient de corrélation (des différentes lignes entre elles). (c'est-à-dire savoir à quel point se ressemblent mes différentes carte d'activité (mes observations / lignes)
    Malheureusement, j'ai beau avoir chercher sur matlab, ce site, google, etc..., je ne sais comment écrire mes lignes de commandes pour avoir mon résultats souhaité.
    Si quelqu'un a une piste...
    d'avance merci

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Par contre je ne comprends pas bien pourquoi tu utilises autant de tableau de cellules... Pourrais tu nous montrer le code complet que tu as codé jusqu'à maintenant? (même si il ne fonctionne pas)
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Salut,
    merci pour la fusion (je pensais qu'à question différente, sujet différent, mais c'est noté ).

    Alors, bon, je suis stupide : je cherchais à ce qu'il me calcul les coefficient de corrélation en une fois(de toute ma matrice). Finalement, il suffit de lui donner l'ordre de le faire ligne par ligne... désolé, mais j'y connais rien en programmation et j'apprends en autodidacte (donc par essai/erreur) ^^

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    bonsoir à tous,
    alors j'ai réussi à faire ce que je voulais (enfin je crois), mais il y a une chose que je n'arrive pas :
    je voudrais qu'à chaque extraction de lignes (le nombre de lignes extraites pouvant varier à chaque fois que la boucle reprend) de ma matrice initiale, il me sauvegarde ma sous-matrice sous "fichiers1" puis "fichiers2", puis "fichiersn" jusqu'à ce que ma boucle s'arrêtent.
    Voici mon 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
    groupe.reseau_s_p : [];
    groupe.nom = [];
    
    % corrélation des réseaux seuillés et exprimés en %
    	for C = 1:inf
       	if size(matrice.reseau_s_p,1) == 0
       	break
     	   else indy = zeros(size(matrice.reseau_s_p,1),1);
       	comp_ref = matrice.reseau_s_p(1,:)
       	for row = 1:size(matrice.reseau_s_p,1)
       		Rligne{row} = matrice.reseau_s_p(row,:);
          	coeff = corrcoef(comp_ref,Rligne{row})
          	if coeff(1,2) >= 0.75  %0.17334537 %16,515162
          	indy(C) = 1;
          	indy(row) = 1;
          	comp_compare = Rligne{row}
          	elseif coeff(1,2) <= -0.75
          	indy(C) = 1;
          	indy(row) = 1;
          	comp_compare{row} = Rligne{row}           
          	else
          	end
       	end 
       	groupe.reseau_s_p = matrice.reseau_s_p(find(indy > 0),:);
       	groupe.nom = matrice.nom(find(indy > 0),:);
       	matrice.reseau_s_p(find(indy > 0),:) = [];
       	matrice.nom(find(indy > 0,:) = [];
       	end  
       	cd C:\mat
       	if size(matrice.reseau_s_p,1) > 0
       	   indy = zeros(size(matrice.reseau_s_p,1),1);
       	else
       	end
       	save (?????, groupe.reseau_s_p, '-ASCII')
       	save(?????,groupe.nom, '-ASCII')
       	groupe.reseau_s_p = [];
       	groupe.reseau_s_p = [];
       end
    plus qu'à sauvegarder et c'est fini, donc si quelqu'un a une idée... merci d'avance et encore merci à ceux qui m'ont aidé jusqu'à présent.

    Dan

  8. #8
    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 : 53 163
    Points
    53 163
    Par défaut
    Pense à indenter correctement ton code... sous l'éditeur de MATLAB, tu fais Ctrl+A puis Ctrl+I

    Voici ce qu ça donne :

    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
    groupe.reseau_s_p : [];
    groupe.nom = [];
     
    % corrélation des réseaux seuillés et exprimés en %
    for C = 1:inf
        if size(matrice.reseau_s_p,1) == 0
            break
        else indy = zeros(size(matrice.reseau_s_p,1),1);
            comp_ref = matrice.reseau_s_p(1,:)
            for row = 1:size(matrice.reseau_s_p,1)
                Rligne{row} = matrice.reseau_s_p(row,:);
                coeff = corrcoef(comp_ref,Rligne{row})
                if coeff(1,2) >= 0.75  %0.17334537 %16,515162
                    indy(C) = 1;
                    indy(row) = 1;
                    comp_compare = Rligne{row}
                elseif coeff(1,2) <= -0.75
                    indy(C) = 1;
                    indy(row) = 1;
                    comp_compare{row} = Rligne{row}
                else
                end
            end
            groupe.reseau_s_p = matrice.reseau_s_p(find(indy > 0),:);
            groupe.nom = matrice.nom(find(indy > 0),:);
            matrice.reseau_s_p(find(indy > 0),:) = [];
            matrice.nom(find(indy > 0,:) = [];
        end
        cd C:\mat
        if size(matrice.reseau_s_p,1) > 0
            indy = zeros(size(matrice.reseau_s_p,1),1);
        else
        end
        save (?????, groupe.reseau_s_p, '-ASCII')
        save(?????,groupe.nom, '-ASCII')
        groupe.reseau_s_p = [];
        groupe.reseau_s_p = [];
    end
    Maintenant pour répondre à ta question, essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    filename = sprintf('fichier%d.txt',C);
    save (filename, 'groupe.reseau_s_p', '-ASCII')
    Enfin c'est l'idée...

    Et pas besoin d'utiliser CD dans ton code.

    Pour enregistrer un fichier dans un dossier, tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    filename = sprintf('fichier%d.txt',C);
    pathname = 'C:\mat'
    save (fullfile(pathname,filename), 'groupe.reseau_s_p', '-ASCII')
    Tu peux aussi te passer de la fonction FIND dans ton code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    groupe.reseau_s_p = matrice.reseau_s_p(find(indy > 0),:);
    devient simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    groupe.reseau_s_p = matrice.reseau_s_p(indy > 0,:);
    C'est ce qu'on appelle l'indexage logique
    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)

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    youuuuuuhou !!!

    merci !!

    j'ai tout corrigé selon tes conseils (que j'appliquerai).
    .
    Merci aussi pour l'astuce ctrl+A et ctrl+I, je ne connaissais pas et ca va me servir

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    bon, j'ai vendu la peau de l'ours trop tôt :
    j'aimerai pouvoir enregistrer un tableau de cellule (qui est en fait une liste de nom_prenom). J'arrive à le faire pour :

    class(x) = double

    mais pas pour ma liste de nom : voilà où j'en suis :

    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
    [filename, pathname] = uigetfiles('*.img', 'choisissez les composantes d interets');
    if (pathname == 0); return; end
    smoothC = 0;
    normC = 1;
    for f = 1:length(filename)
       %cfilename{f} = filename{f}(smoothC+normC+7:end-10);
       cfilename{f} = cellstr(filename{f}(smoothC+normC+7:end-10));
    end
    nom = cfilename{1};
    for j = 1:length(filename)-1
       %nom = [nom;cfilename(j+1)]
       nom = [nom;cfilename{j+1}];
    end
     
    nom_s_c = 'nom_sujets_et_composantes'
     
    fid = fopen(nom_s_c,'w')
    sfilename = fprintf(fid,'%c\t',nom);
    fclose(fid)
    Ca marche (si je rajoute dans le code ), mais ca me le sauvegarde en colonne (d'abord la première lettre de tous les prénoms, puis la 2nde, puis la 3e, etc...). Donc voilà je suis à la recherche de l'astuce qui permettra de sauvegarder ma liste de nom, si quelqu'un peut me renseigner svp.
    Autre chose, je ne comprend pas trop le "truc" des %c ou %d, etc... ni les \t ou \n etc, donc je suis preneur d'un lien web qui expliquerait cela.
    Merci d'avance !

  11. #11
    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 : 53 163
    Points
    53 163
    Par défaut
    Tout ceci est bien compliqué... pourquoi ne pas faire simplement :
    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
     
    [filename, pathname] = uigetfiles('*.img', 'choisissez les composantes d interets');
    if (pathname == 0); return; end
    smoothC = 0;
    normC = 1;
     
    nom_s_c = 'nom_sujets_et_composantes'
     
    fid = fopen(nom_s_c,'wt');
     
    for f = 1:length(filename)
       fprintf(fid,'%s\n', filename{f}(smoothC+normC+7:end-10));
    end
     
    fclose(fid);
    Citation Envoyé par Daniel.R Voir le message
    Autre chose, je ne comprend pas trop le "truc" des %c ou %d, etc... ni les \t ou \n etc, donc je suis preneur d'un lien web qui expliquerait cela.
    Voir la documentation de la fonction FPRINTF
    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)

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    en effet, c'est plus simple comme ca.
    J'ai voulu faire un truc, puis un autre donc j'ai modifie ce que j'avais fait, etc..., jusqu'à obtenir un truc très compliqué
    et des fois c'est juste que j'ai pas les connaissances pour faire simple

    en tout cas merci, ca marche en plus d'être plus visible.

Discussions similaires

  1. Extraire des lignes d'un fichier ini en Batch
    Par yoyo612 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 21/07/2008, 20h25
  2. Extraire des lignes d'un fichier
    Par Scal-tn dans le forum Administration système
    Réponses: 3
    Dernier message: 20/04/2008, 13h39
  3. [VBA-E] Extraire des lignes depuis plusieurs classeurs fermés
    Par stoof dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/05/2007, 12h26
  4. Extraire des lignes d'un fichier en commande bash
    Par newnew dans le forum Linux
    Réponses: 3
    Dernier message: 27/07/2004, 16h22
  5. Extraire des lignes precises d'un fichier
    Par keke33 dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 03/06/2004, 10h52

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