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 une sous matrice d'une autre


Sujet :

MATLAB

  1. #1
    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 Extraire une sous matrice d'une autre
    Bonsoir;
    supposons que j'ai : une matrice par exemple A d'ordre 5 et une matrice P contient des indices de lignes et de colonnes de la matrice A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A=[3 4 5 2 1;1 2 4 6 7;3 4 8 7 9;2 4 3 7 8 ;6 4 2 9 7] ;
    P=[2 3 4 1 5;4 5 2 1 3;3 2 1 5 4;4 2 5 3 1;1 5 2 3 4 ;2 4 3 1 5] ;
    Je cherche une matrice B a partir de A et « par exemple » n=5 :
    Pour B j’ai ce 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
    n=5;
    B=zeros((n-1)*(n-2)/2,2);
    k=2:n-1;
    B(1:n-2,:)=[ones(n-2,1)*1 k'];
    for i=2:n-2
        k=i+1:n-1;
        B((i-1)*n-((i+1)/2*i)+2:(i-1)*n-((i+1)/2*i)+2+(n-(i+2)),:) = [i*ones(n-(i+1),1) k'] ;
     
    end
     B1=[B(:,1) ones(size(B,1),1)*n B(:,end) ];
     rows = B1(:,1:2);
    cols = B1(:,2:3);
    C= sum( A( sub2ind(size(A),rows,cols) ) ,2) ;
     rows = B(:,1);
    cols = B(:,2);
    C1=A( sub2ind(size(A),rows,cols) );
    C-C1;
    idx=find(sort(C-C1,'descend')>=max(C-C1)-1&sort(C-C1,'descend')>0)
    [~,IX]=sort(C-C1,'descend');
    B=B(IX,:)
    B(idx,:)
    Donc B soit :
    B=[3 4 ; 2 4] ;
    1) vos remarques sur le code ?
    2) J'aimerais extraire de P une nouvelle matrice M dont les lignes
    contenant au moins une ligne de B par exemple pour
    on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    2 3 4 1 5 ; 1 5 2 3 4 ; 2 4 3 1 5
    ‘’
    Il ya une répétition’’
    Alors M soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    M=[2 3 4 1 5 ; 1 5 2 3 4 ; 2 4 3 1 5 ; 4 2 5 3 1 ] ?
    Comment trouver M ?
    Je vous remercie d’avance.

  2. #2
    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
    Bonjour ;
    Et voila mon code pour calculer M :
    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
    A=[3 4 5 2 1;1 2 4 6 7;3 4 8 7 9;2 4 3 7 8 ;6 4 2 9 7] ;
    P=[2 3 4 1 5;4 5 2 1 3;3 2 1 5 4;4 2 5 3 1;1 5 2 3 4 ;2 4 3 1 5] ;
    B=[3 4 ; 2 4] ;
    n=5;
    M=ones(6,5)*NaN;
    for i=1:n-1
        P1=[P(:,i) P(:,i+1)]
        for j=1:size(B,1)
            S=repmat(B(j,:),size(P,1),1);
            k=1
            while k<=2
                d=ismember ( P1 ,S,'rows' ) ;
                idx= find ( d ==1 ) ;
                if isempty(idx)==0
                    M(idx,:)=P(idx,:);
                end
                k=k+1;
                S=repmat(fliplr(B(j,:)),size(P,1),1);
            end
        end
     
    end
    l=any(isnan(M),2);
    M(l,:)=[]
    SVP j’ai besoin d’un coup de main pour optimiser les deux codes ''pour M et B''.
    Quelqu’un aurait une idée, une remarque, d’autre proposition……..
    Je suis donc preneuse de tous les conseils
    Merci d’avance à ceux qui vont juste essayer de me repondre et m’aider .

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Une solution :
    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
    P= [2 3 4 1 5
        4 5 2 1 3
        3 2 1 5 4
        4 2 5 3 1
        1 5 2 3 4
        2 4 3 1 5];
    B= [3 4
        2 4];
    
    Prow = reshape(P.',1,[]);
    idx = false(1, size(P,1));
    for k = 1:size(B,1)
        found = [strfind(Prow, B(k,:)) strfind(Prow, B(k,end:-1:1))];
        idx( ceil(found/size(P,2)) ) = true;
    end
    M = P(idx,:)
    Dernière modification par Invité ; 03/04/2014 à 18h43.

  4. #4
    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
    C'est Génial Merci infiniment Winjerome, il y’a une grande différence entre les deux codes.
    Il ‘reste le premier code ‘’pour calculer B’’ ,est ce que vous avez d’autre proposition ?
    Merci encore

  5. #5
    Invité
    Invité(e)
    Par défaut
    Pourrais-tu expliquer l'obtention de ce B ? Le code que tu as utilisé est un peu sinueux pour bien en saisir la finalité.

  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 me explique :
    Pour A une matrice symétrique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A=[3  4 5 2 1 ;4 2 4 6 4 ; 5 4 8 7 9 ;2 6 7 3 1 ;1 4 9 1 8 ]
    Je cherche par exemple pour n==5 ‘’ la 5ème colonne de A’’ toutes les possibilités ou 5 il’est maximale entre deux variables V1 et V2 (tel que V1 et V2<5) donc on a comme possibilités
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [1     2 ;  1     3;  1     4  ;   2     3; 2     4;   3     4]
    par ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    n=5;
    B=zeros((n-1)*(n-2)/2,2);
    k=2:n-1;
    B(1:n-2,:)=[ones(n-2,1)*1 k'];
    for i=2:n-2
        k=i+1:n-1;
        B((i-1)*n-((i+1)/2*i)+2:(i-1)*n-((i+1)/2*i)+2+(n-(i+2)),:) = [i*ones(n-(i+1),1) k'] ;
     
    End
    Puis je calcule par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A(1,5)+A(5,2)-A(1,2)
    A(1,5)+A(5,3)-A(1,3)
    par ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    B1=[B(:,1) ones(size(B,1),1)*n B(:,end) ];
     rows = B1(:,1:2);
    cols = B1(:,2:3);
    C= sum( A( sub2ind(size(A),rows,cols) ) ,2) ;
     rows = B(:,1);
    cols = B(:,2);
    C1=A( sub2ind(size(A),rows,cols) );
    C-C1;
    Et je prends que les possibilités ou la différance est supérieure ou égale a max(C-C1)-1 et >0:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idx=find(sort(C-C1,'descend')>=max(C-C1)-1&sort(C-C1,'descend')>0)
    et enfin je trouve B
    B=[2 3]
    J'espere que j'ai expliqué bien.
    Merciiiiiiiiiiiii

  7. #7
    Invité
    Invité(e)
    Par défaut
    Tu peux replacer ta première partie par
    Pour le reste, je doute que l'on puisse faire grand chose, hormis éviter de ré-ordonner trois fois C-C1 en utilisant une variable temporaire et utiliser l'indexage logique à la place du find.

  8. #8
    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
    Bonjour ;
    Je vous remercie bien Winjerome ;
    Pour le code de B :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    n=5;
    B = nchoosek(1:n-1,2);
     B1=[B(:,1) ones(size(B,1),1)*n B(:,end) ];
     rows = B1(:,1:2);
    cols = B1(:,2:3);
    C= sum( A( sub2ind(size(A),rows,cols) ) ,2) ;
     rows = B(:,1);
    cols = B(:,2);
    C1=A( sub2ind(size(A),rows,cols) );
    S=C-C1;
    idx=sort(S,'descend')>=max(S)-1&sort(S,'descend')>0;
    [~,IX]=sort(S,'descend');
    B=B(IX,:);
    B(idx,:)
    C'est ça non?

    2. Pour le code de M,il ya un problème voir l’ exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    A=[3  4 5 2 1 ;4 2 4 6 4 ; 5 4 8 7 9 ;2 6 7 3 1 ;1 4 9 1 8 ]
    P= [2 3 4 1 5
        4 5 2 1 3
        3 2 1 5 4
        4 2 5 3 1
        1 5 2 3 4
        2 4 3 1 5
        5 4 1 2 3
       2 3 1 5 4
        1 4 3 5 2
       1 4 2 3 5];
    Le résultat est faux ?
    M soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    M=[2 3 4 1 5
    3 2 1 5 4
    1 5 2 3 4
    5 4 1 2 3
    2 3 1 5 4
    1 4 2 3 5] ?
    À bientôt

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par linda05 Voir le message
    C'est ça non?
    Pas encore, j'ai bien parlé de trier trois fois C-C1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    S=C-C1;
    idx=sort(S,'descend')>=max(S)-1&sort(S,'descend')>0;
    [~,IX]=sort(S,'descend');

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    S=C-C1;
    [S_sorted, IX] = sort(S,'descend');
    idx = S_sorted>=S_sorted(1)-1 & S_sorted>0; 
    % max(S) = premier élément de S_sorted : on vient de le trier par ordre 
    % décroissant, inutile donc de calculer explicitement le max.
    Citation Envoyé par linda05 Voir le message
    Pour le code de M,il ya un problème voir l’ exemple :
    Petite erreur de ma part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idx( ceil(found/size(P,2)) ) = true;

  10. #10
    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
    Bonsoir ;

    J'ai d'autres questions:
     Je voudrais construire une nouvelle matrice à partir de M, :
    pour chaque ligne j’ajoute ‘’n=5’’ entre les deux colonnes de B ?
    Donc pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    B=[3 4 ; 2 4]
    M=[2 3 4 1 5 
            1 5 2 3 4 
            2 4 3 1 5 
            4 2 5 3 1 ]
    On a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mat_rech =[2 3 5 4 1 5 
    1 5 2 3 5 4 
     2 5 4 3 1 5 
    2 4 5 3 1 5
     4 5 2 5 3 1 ] ?
     Si j’ai un vecteur V et A une matrice carrée tel que :
    Par exemple :
    Je cherche les indices de lignes corresponds à les deux premiers valeurs max ds V
    donc ds l’exemple :
    les deux premiers valeurs max : 5 et 4
    les indices de lignes corresponds
    2
    4
    6
    5
    7
    9
    Voila le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    V(3)=NaN;%on considère pas l'élément qui est dans le diagonale
    [V_sorted, IX] = sort(V,'descend');
    idx=V==max(V)
    V(idx)=[]
    idx=V_sorted>=max(V)
    IX(idx)
    Si je cherche pour les trois premières valeurs max ds V ’’5,4 et 3’’ :
    le code est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    V(3)=NaN;
    [V_sorted, IX] = sort(V,'descend');
    idx=V==max(V)
    V(idx)=[]
    idx=V==max(V)
    V(idx)=[]
    idx=V_sorted>=max(V)
    IX(idx)
    Le code est assez long je pense ?

    Merci bien

  11. #11
    Invité
    Invité(e)
    Par défaut
    T'en as encore beaucoup de constructions comme ça ?
    Je serais bien curieux de l'application derrière qui demande cela.

    Pour la première partie, tu peux je pense te servir de ma boucle qui sert à générer M, et en particulier des indices found. (Note : il faudrait rajouter found( ~mod(found, size(P,2)) ) = []; pour éviter de choper des positifs enter-lignes)
    Pour la seconde, la fonction unique t'aidera je pense.

  12. #12
    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
    Bonjour a tous ;
    Je pense oui , à chaque fois j’ai essaie de trouver une aidée pour résoudre mon problème avec un code souple et temps d’exécution optimale.
    Je vous remercie pour votre site, J'ai appris pas mal de choses importantes ici.
    1. Pour calculer ‘’mat_rech’’ j’ai essaie ce 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
    Mrow= reshape(M.',1,[])
    X=[];
    for k = 1:size(B,1)
        found = [strfind(Mrow, B(k,:)) strfind(Mrow, B(k,end:-1:1))]
        found( ~mod(found, size(M,2)) ) = [];
        X=[X found];
    end
    k=0;
    X1=sort(X);
    for i=1:size(X1,2)
        Mrow=[Mrow(:,1:X1(i)+k) n Mrow(:,X1(i)+k+1:end)];
        k=k+1;
    end
    mat_rech=reshape(Mrow,size(M,1),n+1)
    Mais Par exemple Pour M(3, :) on remarque que on doit ajouter 5 entre 2 et 4 et entre 4 et 3 donc on a:
    2  5 4 5 3 1 5
    Je voudrais :
    2  5 4 3 1 5
    2 4 5 3 1 5
    2. Voilà ce que j'ai fait,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    V=[3;5;2;5;4;5;4;1;4]
    V(3)=NaN;
    [b,~,n]=unique(V)
    idx=n==length(b)-1|n==length(b)-2
    b=1:length(V);
    vec_rech=b(idx)
    J’ai une question :
    Pourquoi à chaque fois, pour le même code, le temps d'exécution change?
    Quel est le temps d'exécution (le code) à prendre dans ce cas?
    Des explications??

Discussions similaires

  1. Réponses: 10
    Dernier message: 25/07/2012, 11h46
  2. extraction d'une sous matrice d'une image (taille)
    Par Ryma_d3 dans le forum Images
    Réponses: 2
    Dernier message: 25/01/2012, 19h04
  3. [Débutant] extraire une sous matrice d'une matrice
    Par mygwel dans le forum MATLAB
    Réponses: 8
    Dernier message: 30/03/2009, 16h52
  4. Remplacer une sous chaîne par une autre
    Par Erakis dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 10/11/2006, 09h16
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24

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