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 matrice sous condition


Sujet :

MATLAB

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 185
    Points : 51
    Points
    51
    Par défaut extraire une sous matrice d'une matrice sous condition
    Bonsoir à tous,
    j'ai une matrice 2000x2000 contenant des 0 et des 1 je veux faire un algorithme qui me permet de vérifier l'existence d'un bloc 50x50 de 0 et de l'extraire (cà dire extraire l'intervalle de ligne et de colonne)
    exemple:
    si le bloc 1:50x1:50 contient des zeros seulement pas des 1 le programme me donne oui le bloc est 1:50x1:50

    Merci infiniment d'avance pour toute réponse

  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 : 53 165
    Points
    53 165
    Par défaut
    Utilise la fonction any pour tester la présence de 1 dans les sous-matrices.
    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 du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 185
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par Jerome Briot Voir le message
    Utilise la fonction any pour tester la présence de 1 dans les sous-matrices.
    merci pour la réponse en fait je veux un algo qui me fait sortir les bloc contenant de 0 càd s'il existe une sous matrice de dimension 50x50 qui ne contient que des 0 alors l'algo m'affiche il existe le bloc (1:50,1:50) qui contient des 0 purs et si un autre bloc contient des 0 il me le donne aussi j'espère que vous avez compris ce que je viens de dire
    merci beaucoup encore une fois pour tous ceux qui puissent m'aider

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 106
    Points : 110
    Points
    110
    Par défaut
    Bonjour,

    C'est à toi d'écrire une telle fonction (c'est pas si compliquer), Il suffit de découper ta matrice en blocs (une boucle for) et de tester chaque bloc, sachant tu connais les indices des blocs que tu traites.

    @++

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 185
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par vbbarent Voir le message
    Bonjour,

    C'est à toi d'écrire une telle fonction (c'est pas si compliquer), Il suffit de découper ta matrice en blocs (une boucle for) et de tester chaque bloc, sachant tu connais les indices des blocs que tu traites.

    @++
    en fait je suis débutante en matlab et pour les blocs c l'algo qui va les sortir en fait le bloc de 50 peut être 30:79 x 50:99
    un peu plus d'éclaircissement SVP si c possible
    merci d'avance

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 106
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par jeuneprincesse Voir le message
    en fait je suis débutante en matlab et pour les blocs c l'algo qui va les sortir en fait le bloc de 50 peut être 30:79 x 50:99
    un peu plus d'éclaircissement SVP si c possible
    merci d'avance

    Essaie ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    idxbloc=1;
    for l=1:1950 % on parcourt toutes les lignes
        idl = l:l+50; % on prend les indices des lignes par groupe de 50 en decalant d'une unité
            for c=1:1950% on parcourt toutes les colonnes
            idc = c:c+50; % idem que pour les lignes
            if isempty(find(im(idl,idc))~=0) % on teste le bloc pour voir si y a des 1
              bloc{dxbloc}= [idl;idc]; % on garde les les indices correspondants dans une structure
              idxbloc = idxbloc+1; % on incremente la taille de la structure
            end
        end
    end

  7. #7
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 185
    Points : 51
    Points
    51
    Par défaut
    merci pour la réponse
    mais il me donne ce message d'erreur
    Undefined function or variable 'dxbloc'.
    que puisse je faire s'il vous plait ?

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 106
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par jeuneprincesse Voir le message
    merci pour la réponse
    mais il me donne ce message d'erreur
    Undefined function or variable 'dxbloc'.
    que puisse je faire s'il vous plait ?
    C'est une erreur de frappe; Désolé! c'est plutôt

  9. #9
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 185
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par vbbarent Voir le message
    C'est une erreur de frappe; Désolé! c'est plutôt
    merci
    et voilà le résultat que j'ai obtiens en fait le prog ne montre pas tous les blocs d'une et d'autre par le bloc qu'il a montré dépasse 1950 en ligne et colonne ?

    [idl;idc]

    ans =

    Columns 1 through 10

    1950 1951 1952 1953 1954 1955 1956 1957 1958 1959
    1950 1951 1952 1953 1954 1955 1956 1957 1958 1959

    Columns 11 through 20

    1960 1961 1962 1963 1964 1965 1966 1967 1968 1969
    1960 1961 1962 1963 1964 1965 1966 1967 1968 1969

    Columns 21 through 30

    1970 1971 1972 1973 1974 1975 1976 1977 1978 1979
    1970 1971 1972 1973 1974 1975 1976 1977 1978 1979

    Columns 31 through 40

    1980 1981 1982 1983 1984 1985 1986 1987 1988 1989
    1980 1981 1982 1983 1984 1985 1986 1987 1988 1989

    Columns 41 through 50

    1990 1991 1992 1993 1994 1995 1996 1997 1998 1999
    1990 1991 1992 1993 1994 1995 1996 1997 1998 1999

    Column 51

    2000
    2000

  10. #10
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut extraire une sous matrice d'une matrice sous condition
    Bonjour,

    Un essai pour répondre à ta première question sur la détection matrices zéros (limité de 1x1 à 4x4) :

    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
    clear
    M =[0     1     0     0     0     0     0     0     1     0
        1     0     0     0     0     0     1     0     1     0
        0     1     0     0     0     0     1     0     1     0
        1     1     0     0     0     0     0     1     1     1
        0     0     1     0     1     1     1     0     1     0
        0     0     1     1     1     1     0     0     0     0
        1     1     0     0     1     0     0     0     0     0
        1     0     0     1     0     1     0     0     0     0
        1     1     0     1     0     1     0     0     0     0
        1     1     0     1     1     1     1     0     1     0];
    MM=num2str(M);% Conversion en caractères
    dx=4;dy=4;% Dimensions de la matrice de zéros recherchée
    for n=1:length(M)
        r=strfind(MM(n,:), num2str(zeros(dx,1)'));% Recherche des chaînes de caractères candidates
        T(n,1:length(r))=r;% Rang des colonnes avec chaîne recherchée
    end
    resu=inters(M,T,dx,dy);% Fonction de calcul des zones
    disp(['Il y a : '  num2str(nnz(resu)) ' zone(s) de zéros de cotés : ' num2str(dx) 'x' num2str(dy)])
    [I,J,V]=find(resu);% calcul des indices
    for k=1:length(I)
        disp(['Matrice : ' num2str(k)]);
        disp(MM(I(k):I(k)+dy-1,V(k):V(k)+2*dx+1))
    end
    La fonction (je cherche à la réduire avec la récursivité) :
    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
    function res=inters(M,T,dx,dy)
    res=zeros(size(T));
    switch dy
        case 1
            res=T;
        case 2
            for n=1:length(T)-dy
                v=intersect(T(n,:),T(n+1,:));
                res(n,1:length(v))=v;
            end
        case 3
     
            for n=1:length(T)-dy
                v=intersect(T(n,:),intersect(T(n+1,:),T(n+2,:)));
                res(n,1:length(v))=v;
            end
        case 4
            for n=1:length(T)-dy
                v=intersect(T(n,:),intersect(T(n+1,:),intersect(T(n+2,:),T(n+3,:))));
                res(n,1:length(v))=v;
            end
    end
    end
    Dans cet exemple :
    Il y a : 2 zone(s) de zéros de cotés : 4x4
    Matrice : 1
    0 0 0 0
    0 0 0 0
    0 0 0 0
    0 0 0 0
    Matrice : 2
    0 0 0 0
    0 0 0 0
    0 0 0 0
    0 0 0 0

  11. #11
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 185
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par phryte Voir le message
    Bonjour,

    Un essai pour répondre à ta première question sur la détection matrices zéros (limité de 1x1 à 4x4) :

    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
    clear
    M =[0     1     0     0     0     0     0     0     1     0
        1     0     0     0     0     0     1     0     1     0
        0     1     0     0     0     0     1     0     1     0
        1     1     0     0     0     0     0     1     1     1
        0     0     1     0     1     1     1     0     1     0
        0     0     1     1     1     1     0     0     0     0
        1     1     0     0     1     0     0     0     0     0
        1     0     0     1     0     1     0     0     0     0
        1     1     0     1     0     1     0     0     0     0
        1     1     0     1     1     1     1     0     1     0];
    MM=num2str(M);% Conversion en caractères
    dx=4;dy=4;% Dimensions de la matrice de zéros recherchée
    for n=1:length(M)
        r=strfind(MM(n,:), num2str(zeros(dx,1)'));% Recherche des chaînes de caractères candidates
        T(n,1:length(r))=r;% Rang des colonnes avec chaîne recherchée
    end
    resu=inters(M,T,dx,dy);% Fonction de calcul des zones
    disp(['Il y a : '  num2str(nnz(resu)) ' zone(s) de zéros de cotés : ' num2str(dx) 'x' num2str(dy)])
    [I,J,V]=find(resu);% calcul des indices
    for k=1:length(I)
        disp(['Matrice : ' num2str(k)]);
        disp(MM(I(k):I(k)+dy-1,V(k):V(k)+2*dx+1))
    end
    La fonction (je cherche à la réduire avec la récursivité) :
    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
    function res=inters(M,T,dx,dy)
    res=zeros(size(T));
    switch dy
        case 1
            res=T;
        case 2
            for n=1:length(T)-dy
                v=intersect(T(n,:),T(n+1,:));
                res(n,1:length(v))=v;
            end
        case 3
     
            for n=1:length(T)-dy
                v=intersect(T(n,:),intersect(T(n+1,:),T(n+2,:)));
                res(n,1:length(v))=v;
            end
        case 4
            for n=1:length(T)-dy
                v=intersect(T(n,:),intersect(T(n+1,:),intersect(T(n+2,:),T(n+3,:))));
                res(n,1:length(v))=v;
            end
    end
    end
    Dans cet exemple :
    Il y a : 2 zone(s) de zéros de cotés : 4x4
    Matrice : 1
    0 0 0 0
    0 0 0 0
    0 0 0 0
    0 0 0 0
    Matrice : 2
    0 0 0 0
    0 0 0 0
    0 0 0 0
    0 0 0 0
    Bonjour et merci pour la réponse j'ai essayé le code et il m'a donné ce message d'erreur
    Undefined function or variable 'inters'. ?

  12. #12
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    Bonjour
    Il faut mettre les deux programmes dans le même dossier.

  13. #13
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 185
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par phryte Voir le message
    Bonjour
    Il faut mettre les deux programmes dans le même dossier.
    quel dossier ? j'ai copié les deux programmes et les coller dans command window
    Images attachées Images attachées  

  14. #14
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut extraire une sous matrice d'une matrice sous condition
    Bonjour,

    Tu copies chaque programme dans un new script que tu sauvegardes dans un même dossier.

  15. #15
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 185
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par phryte Voir le message
    Bonjour,

    Tu copies chaque programme dans un new script que tu sauvegardes dans un même dossier.
    bonjour et merci beaucoup maitenant le programme s'exécute mais comme même il y a une autre erreur que puisse je faire ?
    Images attachées Images attachées  

  16. #16
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut extraire une sous matrice d'une matrice sous condition
    Bonjour,

    "inters" est un sous programme "function", en général il ne s'exécute pas, il est appelé par d'autres programmes avec les paramètres initialisés.
    l'autre script est le programme principal (clear; M=.....). C'est lui qu'il faut exécuter.

    Ce programme n'a pas de limitations en dx par contre dy est limité à 4. (il faut améliorer la fonction "inters" par de la récursivité.

  17. #17
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 185
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par phryte Voir le message
    Bonjour,

    "inters" est un sous programme "function", en général il ne s'exécute pas, il est appelé par d'autres programmes avec les paramètres initialisés.
    l'autre script est le programme principal (clear; M=.....). C'est lui qu'il faut exécuter.

    Ce programme n'a pas de limitations en dx par contre dy est limité à 4. (il faut améliorer la fonction "inters" par de la récursivité.
    Bonjour,
    donc j'ajoute d'autre cases jusqu'à 50 ?
    disp(MM(I(k):I(k)+dy-1,V(k):V(k)+2*dx+1)) cette commande ça sert à quoi ?

    je veux aussi que le message suivant s'affiche c à dire insérer les intervalles des matrice
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Il y a : 2 zone(s) de zéros de cotés : 4x4
    Matrice : 1 (1:3,3:6)
    0 0 0 0
    0 0 0 0
    0 0 0 0
    0 0 0 0
    Matrice : 2(5:8,7:10)
    0 0 0 0
    0 0 0 0
    0 0 0 0
    0 0 0 0
    merci infiniment d'avance pour toute réponse

  18. #18
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 185
    Points : 51
    Points
    51
    Par défaut
    en plus quand j'ai testé le programme sur ma matrice qui est de type logique
    du coup j'ai fait la modification suivante au code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    M =matrice;
    s=double(M);
    MM=num2str(s)
    et ça n'a pas marché j'ai eu ce message d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Out of memory. Type HELP MEMORY for your options.
     
    Error in num2str (line 66)
            xmax = double(max(abs(widthCopy( : ))));
     
    Error in fonction1 (line 3)
    MM=num2str(s);% Conversion en caractères
    :'(
    que puisse je faire s'il vous plait ?

  19. #19
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 185
    Points : 51
    Points
    51
    Par défaut
    [QUOTE=phryte;8622181]Bonjour,

    Un essai pour répondre à ta première question sur la détection matrices zéros (limité de 1x1 à 4x4) :

    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
    clear
    M =[0     1     0     0     0     0     0     0     1     0
        1     0     0     0     0     0     1     0     1     0
        0     1     0     0     0     0     1     0     1     0
        1     1     0     0     0     0     0     1     1     1
        0     0     1     0     1     1     1     0     1     0
        0     0     1     1     1     1     0     0     0     0
        1     1     0     0     1     0     0     0     0     0
        1     0     0     1     0     1     0     0     0     0
        1     1     0     1     0     1     0     0     0     0
        1     1     0     1     1     1     1     0     1     0];
    MM=num2str(M);% Conversion en caractères
    dx=4;dy=4;% Dimensions de la matrice de zéros recherchée
    for n=1:length(M)
        r=strfind(MM(n,:), num2str(zeros(dx,1)'));% Recherche des chaînes de caractères candidates
        T(n,1:length(r))=r;% Rang des colonnes avec chaîne recherchée
    end
    resu=inters(M,T,dx,dy);% Fonction de calcul des zones
    disp(['Il y a : '  num2str(nnz(resu)) ' zone(s) de zéros de cotés : ' num2str(dx) 'x' num2str(dy)])
    [I,J,V]=find(resu);% calcul des indices
    for k=1:length(I)
        disp(['Matrice : ' num2str(k)]);
        disp(MM(I(k):I(k)+dy-1,V(k):V(k)+2*dx+1))
    end
    Bonsoir,

    C'est quoi nnz(resu) c'est une fonction de matlab ?
    j'ai étalé le programme à 14 bien sûr pour une matrice plus grande ça marche mais il m'affiche une matrice 10x14 et non 14 x 14 le problème est dû à dx ?
    voilà le code que j'ai utilisé
    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
    function res=inters(M,T,dx,dy)
    res=zeros(size(T));
    switch dy
        case 1
            res=T;
        case 2
            for n=1:length(T)-dy
                v=intersect(T(n,:),T(n+1,:));
                res(n,1:length(v))=v;
            end
        case 3
     
            for n=1:length(T)-dy
                v=intersect(T(n,:),intersect(T(n+1,:),T(n+2,:)));
                res(n,1:length(v))=v;
            end
        case 4
            for n=1:length(T)-dy
                v=intersect(T(n,:),intersect(T(n+1,:),intersect(T(n+2,:),T(n+3,:))));
                res(n,1:length(v))=v;
            end
            case 5
            for n=1:length(T)-dy
                v=intersect(T(n,:),intersect(T(n+1,:),intersect(T(n+2,:),intersect(T(n+3,:),T(n+4,:)))));
                res(n,1:length(v))=v;
            end
             case 6
            for n=1:length(T)-dy
                v=intersect(T(n,:),intersect(T(n+1,:),intersect(T(n+2,:),intersect(T(n+3,:),intersect(T(n+4,:),T(n+5,:))))));
                res(n,1:length(v))=v;
            end
              case 7
            for n=1:length(T)-dy
                v=intersect(T(n,:),intersect(T(n+1,:),intersect(T(n+2,:),intersect(T(n+3,:),intersect(T(n+4,:),intersect(T(n+5,:),T(n+6,:)))))));
                res(n,1:length(v))=v;
            end
             case 8
            for n=1:length(T)-dy
                v=intersect(T(n,:),intersect(T(n+1,:),intersect(T(n+2,:),intersect(T(n+3,:),intersect(T(n+4,:),intersect(T(n+5,:),intersect(T(n+6,:),T(n+7,:))))))));
                res(n,1:length(v))=v;
            end
            case 9
            for n=1:length(T)-dy
                v=intersect(T(n,:),intersect(T(n+1,:),intersect(T(n+2,:),intersect(T(n+3,:),intersect(T(n+4,:),intersect(T(n+5,:),intersect(T(n+6,:),intersect(T(n+7,:),T(n+8,:)))))))));
                res(n,1:length(v))=v;
            end
            case 10
            for n=1:length(T)-dy
                v=intersect(T(n,:),intersect(T(n+1,:),intersect(T(n+2,:),intersect(T(n+3,:),intersect(T(n+4,:),intersect(T(n+5,:),intersect(T(n+6,:),intersect(T(n+7,:),intersect(T(n+8,:),T(n+9,:))))))))));
                res(n,1:length(v))=v;
            end
             case 11
            for n=1:length(T)-dy
                v=intersect(T(n,:),intersect(T(n+1,:),intersect(T(n+2,:),intersect(T(n+3,:),intersect(T(n+4,:),intersect(T(n+5,:),intersect(T(n+6,:),intersect(T(n+7,:),intersect(T(n+8,:),intersect(T(n+9,:),T(n+10,:)))))))))));
                res(n,1:length(v))=v;
            end
     
             case 12
            for n=1:length(T)-dy
                v=intersect(T(n,:),intersect(T(n+1,:),intersect(T(n+2,:),intersect(T(n+3,:),intersect(T(n+4,:),intersect(T(n+5,:),intersect(T(n+6,:),intersect(T(n+7,:),intersect(T(n+8,:),intersect(T(n+9,:),intersect(T(n+10,:),T(n+11,:))))))))))));
                res(n,1:length(v))=v;
            end
            case 13
            for n=1:length(T)-dy
                v=intersect(T(n,:),intersect(T(n+1,:),intersect(T(n+2,:),intersect(T(n+3,:),intersect(T(n+4,:),intersect(T(n+5,:),intersect(T(n+6,:),intersect(T(n+7,:),intersect(T(n+8,:),intersect(T(n+9,:),intersect(T(n+10,:),intersect(T(n+11,:),T(n+12,:)))))))))))));
                res(n,1:length(v))=v;
            end
            case 14
            for n=1:length(T)-dy
                v=intersect(T(n,:),intersect(T(n+1,:),intersect(T(n+2,:),intersect(T(n+3,:),intersect(T(n+4,:),intersect(T(n+5,:),intersect(T(n+6,:),intersect(T(n+7,:),intersect(T(n+8,:),intersect(T(n+9,:),intersect(T(n+10,:),intersect(T(n+11,:),intersect(T(n+12,:),T(n+13,:))))))))))))));
                res(n,1:length(v))=v;
            end
    end
    end
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    M=mat;
    MM=num2str(M);% Conversion en caractères
    dx=14;dy=14;% Dimensions de la matrice de zéros recherchée
    for n=1:length(M)
        r=strfind(MM(n,:), num2str(zeros(dx,1)'));% Recherche des chaînes de caractères candidates
        T(n,1:length(r))=r;% Rang des colonnes avec chaîne recherchée
    end
    resu=interstest(M,T,dx,dy);% Fonction de calcul des zones
    disp(['Il y a : '  num2str(nnz(resu)) ' zone(s) de zéros de cotés : ' num2str(dx) 'x' num2str(dy)])
    [I,J,V]=find(resu);% calcul des indices
    for k=1:length(I)
        disp(['Matrice : ' num2str(k)]);
        disp(MM(I(k):I(k)+dy-1,V(k):V(k)+2*dx+1))
    end
    et encore il y a des zones qui présentent des 1 ?
    merci d'avance pour toute aide

  20. #20
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 185
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par jeuneprincesse Voir le message
    en plus quand j'ai testé le programme sur ma matrice qui est de type logique
    du coup j'ai fait la modification suivante au code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    M =matrice;
    s=double(M);
    MM=num2str(s)
    et ça n'a pas marché j'ai eu ce message d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Out of memory. Type HELP MEMORY for your options.
     
    Error in num2str (line 66)
            xmax = double(max(abs(widthCopy( : ))));
     
    Error in fonction1 (line 3)
    MM=num2str(s);% Conversion en caractères
    :'(
    que puisse je faire s'il vous plait ?
    j'ai fait un clear et j'ai travaillé sur une partie de la matrice sans passer du logique au numérique j'ai appliqué le programme il m'affiche des résultats mais d'une part il ya des zones qui présentent des 1 et la matrice n'est pas carré càd si je lui demande matrice 14x14 il me donne une 10x14
    merci d'avance pour toute aide

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/03/2016, 19h03
  2. Réponses: 3
    Dernier message: 20/02/2015, 11h19
  3. [Débutant] affecter une matrice a une variable cree par une boucle
    Par chipo01 dans le forum MATLAB
    Réponses: 5
    Dernier message: 06/04/2013, 19h05
  4. [Toutes versions] Sous VBA appeler une cellule excel avec une variable
    Par karatetiger76 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/04/2011, 19h04
  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