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 :

maximum d'une matrice


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    universitaire
    Inscrit en
    Août 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : universitaire
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 15
    Par défaut maximum d'une matrice
    Bjr à tous, je ss nouveau dans le forum, j'ai un petit problème dans l'analyse de mes données avec matlab, en effet, je ss entrain de rechercher le maximum d'une
    matrice, cependant il y'a des matrices qui ont des valeurs égales et me donne un maximum peu satisfaisant, j'utilise la fonction max(max(matrice)), mais je trouve
    un maximum qui n'est pas maximum.
    le probleme est le suivant je dois trouver des peaks d'une surface rugueuse, donc le maximum doit etre le point cent des 9 points de la matrice, un maximum strictement superieur à tous les 8 points autour de lui.
    merci de votre aide, car je ss vraiment amateur dans l'analyse des données

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Par défaut
    Bonjour,

    Personnellement je n'ai pas bien saisi ta démarche. Pourrais tu nous montrer ce que tu as fait et nous indiquer là où le bât blesse? Dans tout les cas si tu cherches des pics, la fonction max(max) ne t'indiquera jamais plus que le maximum de la matrice?

    Gooby

  3. #3
    Membre averti
    Homme Profil pro
    universitaire
    Inscrit en
    Août 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : universitaire
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 15
    Par défaut Bonjour Goody
    Merci de l'attention porté à mon problème, voici mon programme entier matlab:
    je cherche des peaks sur surface rugueuse pour ce faire je crée une matrice 3X3 = 9 points, le point milieu ou central doit etre le maximum absolu des points avoisinants, dans le cas où la valeur de valeur maximum est égale à la valeur de l'un des 8 points avoisinants, alors le programme continue la recherche, la fonction max(max(matrice)) ne m'aide pas car ne me donne pas le point max absolu. ainsi je cherche comment retrouver le maximum central absolu d'une matrice 3X3, car je continuerais avec les matrices 5X5, 7X7, 9X9, 11X11.

    programme entier:

    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
    clear all;
    load('Cil3_50x_onepeak');
    s1=length(Zm111(1,:));
    s2=length(Zm111(:,1));
    k=0;
    w=1.4; nu1=0.41; nu2=0.41; E1=103e+9; E2=107e+9;
    Estar=((1-nu1^2)/E1+(1-nu2^2)/E2)^-1;
    Z1 = 0.3e-9;
    Zms = Zm111*0;
    Xms = Xm111;
    Yms = Ym111;
    dimframe=1;
    for j=dimframe:s1-2*dimframe
        i=dimframe;
        while i<s2-2*dimframe
            matrice = Zm111(i:i+2*dimframe,j:j+2*dimframe);
            massimo = max(max(matrice));
                if massimo == Zm111(i+dimframe,j+dimframe)
                     k=k+1;
                     peaks(k,3)= Zm111(i+1,j+1);
                     peaks(k,2)= Ym111(i+1,j+1);
                     peaks(k,1)= Xm111(i+1,j+1);
                     f = fittype('a*((x-x0)*cos(th)+(y-y0)*sin(th)).^2+b*(-(x-x0)*sin(th)+(y-y0)*cos(th)).^2+z0','problem',{'x0','y0'},'independent', {'x', 'y'},'dependent', 'z','coefficients', {'a','b','th','z0'});
                      [cfun,gof] = fit([reshape(Xm111(i:i+2*dimframe,j:j+2*dimframe),[],1),...
                      reshape(Ym111(i:i+2*dimframe,j:j+2*dimframe),[],1)],...
                      reshape(Zm111(i:i+2*dimframe,j:j+2*dimframe),[],1),f,...
                      'problem',{Xm111(i+dimframe,j+dimframe),Ym111(i+dimframe,j+dimframe)},...
                      'Start', [1,1,0,0],...
                      'Lower',[-Inf -Inf -pi/2 -Inf],...
                      'Upper',[0 0 0 Inf]);
                  peaks(k,3)= Zm111(i+dimframe,j+dimframe);
                  peaks(k,2)= Ym111(i+dimframe,j+dimframe);
                  peaks(k,1)= Xm111(i+dimframe,j+dimframe);
                  peaks(k,4)=cfun.a;
                  peaks(k,5)=cfun.b;
                  peaks(k,6)=cfun.th;
                  peaks(k,7)=cfun.z0;  
                  Rmax = -real(1/((cfun.a+cfun.b)-sqrt((cfun.a)^2-(2*cfun.a*cfun.b)+(cfun.b)^2)));
                  Rmin = -real(1/((cfun.a+cfun.b)+sqrt((cfun.a)^2-(2*cfun.a*cfun.b)+(cfun.b)^2)));
                  peaks(k,8)= Rmax;
                  peaks(k,9)= Rmin;
                  muTmax =((16*Rmax*1e-6*w^2)/(9*Estar^2*Z1^3))^1/3;
                  muTmin =((16*Rmin*1e-6*w^2)/(9*Estar^2*Z1^3))^1/3;
                peaks(k,10)= muTmax;
                peaks(k,11)= muTmin;
                  rmse = gof.rmse;
                  peaks(k,12)=rmse;
     
                  i= i+dimframe;
     
                   Ymatr = Ym111(i:i+2*dimframe, j:j+2*dimframe);
                    Xmatr = Xm111(i:i+2*dimframe, j:j+2*dimframe);
                    x = reshape(Xmatr, 1,[]);
                    y = reshape(Ymatr, 1,[]);
                    z = reshape(Zmatr, 1,[]);
                figure
                grid on
                hold on
                Zsphere=cfun(Xm111,Ym111);
               surf(Xm111,Ym111,Zsphere);
             surf(Xm111,Ym111,Zm111);
                plot3(x,y,z,'.','Markersize',15)
                zlim([-0.4 0.4])
                xlim([min(x)-2.5 max(x)+2.5])
                ylim([min(y)-2.5 max(y)+2.5])
                caxis([-0.6 0.6])
                shading interp
                end
               i=i+1;
        end
        j;
    end
    Bonne journée Goody

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    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 317
    Par défaut
    Si je comprends bien , tu cherches les maximum locaux, c'est bien ça ?

    Si oui, et si tu possèdes l'Image Processing Toolbox, tu peux te servir de la fonction nlfilter.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    fun = @(x) all(x(5)>x([1:4 6:9]));
     
    A = rand(5);
     
    B = nlfilter(A, [3,3], fun);
     
    C = A.*B;
     
    idx = B(:)==1;
     
    maxval = A(idx);
    Ce qui donne par exemple :

    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
    A =
     
        0.9391    0.6482    0.3479    0.3308    0.7069
        0.3013    0.0252    0.4460    0.8985    0.9995
        0.2955    0.8422    0.0542    0.1182    0.2878
        0.3329    0.5590    0.1771    0.9884    0.4145
        0.4671    0.8541    0.6628    0.5400    0.4648
     
     
    B =
     
         1     0     0     0     0
         0     0     0     0     1
         0     1     0     0     0
         0     0     0     1     0
         0     1     0     0     0
     
     
    C =
     
        0.9391         0         0         0         0
             0         0         0         0    0.9995
             0    0.8422         0         0         0
             0         0         0    0.9884         0
             0    0.8541         0         0         0
     
     
    maxval =
     
        0.9391
        0.8422
        0.8541
        0.9884
        0.9995

  5. #5
    Membre averti
    Homme Profil pro
    universitaire
    Inscrit en
    Août 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : universitaire
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 15
    Par défaut bonjour Dut.
    merci de la reponse apportée à mon problème, essayant de verifier ton script, j'obtiens une solution peu satisfaisante:
    voici le script:

    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
    >> fun = @(x)all(x(3)> x([1:4 6:9]));
    a = rand(3);
    b = nlfilter(a,[3,3],fun);
    c = a.*b;
    idx = b(:)== 1;
    maxval = a(idx);
     
    et la solution:
    a = 
    0,1455	0,5797	0,8530
    0,1360	0,5498	0,6220
    0,8692	0,1449	0,3509
     
    b=
    0	0	0
    0	1	0
    0	0	0
     
    c=
    0	0	        0
    0	0,5498	0
    0	0	        0
     
    idx=
    0
    0
    0
    0
    1
    0
    0
    0
    0
     
    maxval = 0,5498
    cette solution ne me satisfait pas car dans la matrice "a", maxval n'est pas le maximum absolu, nous avons autour de cette valeur centrale, autres valeurs tels que 0,5797; 0,8530; 0,6220; 0,8692 supérieurs à maxval=0,5498, je cherche maxval absolument superieur à tous les points de la matrice et , maxval doit etre au centre des points de la matrice.

    Merci Dut

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    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 317
    Par défaut
    Il faut comparer le 5ème élément du bloc 3x3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fun = @(x) all(x(5)> x([1:4 6:9]));
    C'est l'indice linéaire de l'élément central :

    1 4 7
    2 5 8
    3 6 9

  7. #7
    Membre averti
    Homme Profil pro
    universitaire
    Inscrit en
    Août 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : universitaire
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 15
    Par défaut bonjour Dut.
    # Merci infiniment Dut, ton aide a été fondamentale et capitale pour la suite de l'analyse de mes données, qu'à celà ne tienne j'ai essayé d'utiliser ton script pour la détection des maximums locaux, cependant, en utilisant des données reduites c'est-à-dire 10x10, je parviens à ressortir 49 peaks, mais une fois que j'utilise des données 640x480, l'analyse est très long et à la fin me donne des messages d'erreurs.
    En outre, durant les calculs, s'affiche toujours ce message en rouge "Applying Neighborhood Operation".
    N'est-il pas possible de reduire le temps de calcul de peaks pour des données importantes(640x480) , car je n'arrive pas avec des données assez importantes?
    ce message en rouge, peut-on le cacher durant l'analyse des données?
    Merci une fois encore Dut, excellente journée.

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

    Dans le même principe, avec la fonction colfilt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    N = ...
    center = (ceil(N/2)-1)*N + ceil(N/2);
    fun = @(x) all(bsxfun(@gt,x(center,:),x([1:center-1 center+1:end],:)), 1);
    B = colfilt(A, [N N], 'sliding', fun);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. chercher le maximum dans certaines zones d'une matrice.
    Par Swiss_Knight dans le forum Octave
    Réponses: 1
    Dernier message: 07/06/2011, 10h16
  2. Recherche de maximums dans une matrice
    Par zizi_coin_coin dans le forum MATLAB
    Réponses: 12
    Dernier message: 22/12/2010, 16h07
  3. position d'un maximum dans une matrice
    Par oliv27400 dans le forum MATLAB
    Réponses: 2
    Dernier message: 23/11/2010, 14h20
  4. chercher le maximum d'une matrice 2D
    Par poitou86 dans le forum C++
    Réponses: 4
    Dernier message: 29/05/2008, 14h41
  5. Réponses: 11
    Dernier message: 11/09/2007, 12h25

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