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 :

griddata ou interp2?


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 202
    Par défaut griddata ou interp2?
    Bonjour à tous,

    Donc mon problème est que j'ai besoin d'un conseil sur un code que j'utilise et dont je ne suis pas vraiment sur.

    Tout d'abord mes données:

    A partir de 3 paramètres: X, Y et Z, je calcule un 4ème paramètre.
    Je veux ensuite représenter graphiquement ce 4ème paramètre.

    Sur le pcolor que j'utilise pour représenter, je fais donc mon 4ème param en fonction du 2 et 3ème.

    j'utilise donc:

    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
     
    subset=[Temperature Phosphate Nitrate];
     
    T=max(Temperature);X2=[0:1:T]';
    P=max(Phosphate);Y2=[0:0.02:P]';
    N=max(Nitrate);Z2=[0:0.2:N]';
     
     
    [X,Y,Z]=meshgrid(X2,Y2,Z2);clear X2
    [n,p,z]=size(X);
    X2=reshape(X,n*p*z,1);clear X
    Y2=reshape(Y,n*p*z,1);clear Y
    Z2=reshape(Z,n*p*z,1);clear Z
     
    x=[X2,Y2,Z2];Param4=prob;
     
     
    [XI,YI]=meshgrid(X2,Y2);
    [YI,ZI]=meshgrid(Y2,Z2);
     
    VI=griddata(Y2,Z2,prob,YI,ZI,'linear');
     
    pcolor(Y2,Z2,VI2);
    Le premier problème est que lors du griddata, je perds mes valeurs max issues de prob, ce qui, je pense vient de la fonction.

    Mon deuxième problème est de savoir si mon code semble correct, à savoir si le passage de la 4D à la 3D est cohérent.

    Le dernier est de savoir s'il ne serait pas mieux d'utiliser la fonction interp2...

    Merci d'avance de vos réponses, et en espérant avoir clairement expliqué...

  2. #2
    Membre Expert
    Avatar de tug83
    Homme Profil pro
    MATLAB Geek !
    Inscrit en
    Juin 2006
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : MATLAB Geek !
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 781
    Par défaut
    Ce post d'avril 2007 t'éclairera:
    Interpolation 2D image

    Voici ce que j'écrivais:
    L'interpolation effectuée par interp2 est utile pour des données qui peuvent naturellement être organisées en une grille, comme des données d'image. Souvent, cependant, les données vectorielles x et y ne croissent ni ne décroissent monotoniquement, et meshgrid ne peut pas les placer dans un pattern "écossais" harmonieux.
    La fonction MATLAB griddata prend des données vectorielles arbitraire x, y et z et les interpole en une grille en utilisant la triangulation de Delaunay.

    >> ZI = griddata(x,y,z,XI,YI,method)

    renvoie la matrice ZI avec les valeurs correspondant aux éléments de XI et de YI, interpolées à partir des données vectorielles dans x, y et z.
    La méthode peut être moins efficace qu'interp2, à cause du travail pour créer la grille.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 202
    Par défaut
    Merci pour cet éclaircissement.

    Dans mon cas, x, y et z sont monotones (si j'ai bien compris), puisqu'il s'agit d'une grille que je détermine au départ en fonction du maximum de mes paramètres, avec un pas constant à partir de 0.

    Par contre du coup je comprends mieux la différence que j'obtiens avec le griddata qui a tendance à opérer ce lissage de mes données, les maximums disparaissant au gré de la création de la maille...

    Mais du coup j'ai quelques difficultés à maitriser la fonction interp2...(là je me sens ridicule...).
    Dites moi si je me trompe, mais selon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ZI = INTERP2(X,Y,Z,XI,YI)
    Il faut donc que x,y et z soit des matrices et non des vecteurs...
    Et du coup c'est là que je pêche un peu, étant donné que je suis au départ en 4D, ne faut-il pas que je travaille plutot avec interp3?

  4. #4
    Membre éprouvé
    Avatar de mihaispr
    Inscrit en
    Décembre 2008
    Messages
    1 025
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 025
    Par défaut
    Salut!

    Oui avec interp2 ce sont des matrices.

    As-tu regarde la documentation de la fonction interp2?

    Tu as un tres bon example la!


  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 202
    Par défaut
    Oui, j'épluche les documentations de meshgrid, interp1, 2 et 3 et Griddata 1 et 3 depuis hier...
    Les exemples sont toujours très bien fait, le plus dur est de le rapporter à mon cas...;-)

    Mais sinon je pense avoir un début de réponse, travaillant sur des données issues de l'examen de 3 paramètres, j'obtiens, après reshape, une matrice 3D.

    J'utilise interp3 afin d'interpoler mes données en évitant le lissage par griddata.

    J'obtiens donc une matrice 3D: n*p*z

    Par contre je dois maintenant représenter ces valeurs...sachant que je veux représenter cette matrice en fonction de y et z (2 paramètres), je bloque un peu...en effet, la solution qui me vient naturellement, serait de faire un pcolor en déroulant mes matrices par reshape...

    Mais je suis toujours prudent avec cette méthode...suis-je sur la bonne voie?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 202
    Par défaut
    Re salut...

    C'est toujours moi avec mon problème.

    Ayant avancé un peu, je vais essayer d'être plus clair dans ce que je dis.

    Alors voilà, j'ai 3 vecteurs de n lignes de même taille.

    Je souhaite représenter mon 3ème paramètre en fonction des 2 premiers, mais comment faire....

    En sachant que je ne souhaite pas utiliser griddata qui a tendance à lisser mes données.

    Merci!!!
    et au secours....

  7. #7
    Membre éprouvé
    Avatar de mihaispr
    Inscrit en
    Décembre 2008
    Messages
    1 025
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 025
    Par défaut
    Salut!

    Donne nous les initialisations des tes trois vecteurs que tu desires et le message d'erreur en command window s'il te plait.

    Pourquoi pas essayer applier pour trois vecteurs de 4-5elements dans command window pour la premiere etape?

    J'ai oublie te demander quelle methode d'interpolation tu veux applier avec la fonction interp2 je me suis rendu compte maintenant mais c'est tres important si tu sais ca.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    'nearest'
    	Nearest neighbor interpolation
    'linear'
    	Bilinear interpolation (default)
    'spline'
    	Cubic spline interpolation
    'cubic'
    	Bicubic interpolation
    Amicalment,

    Michel

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 202
    Par défaut
    Je ne suis pas sur d'avoir bien compris ce que tu me demandes...

    Alors j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Y2 (2090x1)
    Z2 (2090x1)
    prob (2090x1)
    Pour faire le graphique je me doute que j'ai besoin de créer une maille.
    Je commence donc par un meshgrid:

    Par contre, je ne peux pas faire un pcolor (par exemple), si je ne transforme pas prob pour qu'il ait la taille de Y et Z....

    PS: dans l'immédiat je suis en linear par défaut, je pense tester également en cubis pour voir s'il y a de grosses différences par rapport aux résultats attendus

  9. #9
    Membre éprouvé
    Avatar de mihaispr
    Inscrit en
    Décembre 2008
    Messages
    1 025
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 025
    Par défaut
    prob (2090x1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    >>whos Y
    >>whos Z
    ???

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 202
    Par défaut
    Citation Envoyé par mihaispr Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    >>whos Y
    >>whos Z
    ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Y         2090x2090            34944800  double        
     Z         2090x2090            34944800  double

  11. #11
    Membre éprouvé
    Avatar de mihaispr
    Inscrit en
    Décembre 2008
    Messages
    1 025
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 025
    Par défaut
    Utilise la fonction reshape pour changer la dimension des tes variables X ey Y comme dans prob.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    Y         2090x2090            34944800  double        
     X         2090x2090            34944800  double

    devenir apres la commande whos:


    2090*1

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 202
    Par défaut
    Oups, je pense que l'on a un petit pb de compréhension, je suis désolé de mal m'expliquer.

    Alors je vais tacher d'être plus clair.

    J'ai 3 variables:

    Y2=la distance à la côte (2090 lignes de données);
    Z2=la bathymétrie (2090 lignes de données);

    prob=la température (2090 lignes de données)

    Je souhaite représenter la température en fonction de la bathymétrie et la distance à la côte.

    Pour cela je souhaite donc créer un maillage, puisque chaque donnée de température correspond à une distance et une bathymétrie.

    Pour créer le maillage, je défini donc Y et Z, qui correspond aux mailles, d'où l'utilisation du meshgrid (il n'y a donc aucun intérêt à faire un reshape dessus).

    L'étape qui me manque, est la transformation de prob qui va faire coincider une valeur de température à chaque maille de mes 2 autres variables.

  13. #13
    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
    Je ne vois pas ce que viens faire MESHGRID ici

    Si tes points Y, Z et prob sont déjà ordonnées sur une grille régulière, il suffit de les réarranger avec RESHAPE et d'utiliser SURF ensuite

    Si tes 2090 points sont sur une grille MxN, tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Y = reshape(Y,M,[]);
    Z = reshape(Z,M,[]);
    prob = reshape(prob,M,[]);
     
    figure
    surf(Y,Z,prob)
    Je ne vois pas où est le problème

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 202
    Par défaut
    Salut Dut,

    Alors le problème (enfin surtt dans ma tête où ça commence à s'embrouiller), c'est que prob est obtenu à partir de 3 variables, donc pour être plus explicite:

    x=profondeur d'échantillonnage(10 possibilités)
    y=distance à la côte(11 possibiltés)
    z=bathymétrie(19 possiblités)

    à partir de là, pour créer chaque possibilité, j'obtiens une combinaison de 2090 lignes, d'où:

    X2=profondeur d'échantillonnage (2090 lignes de données);
    Y2=la distance à la côte (2090 lignes de données);
    Z2=la bathymétrie (2090 lignes de données);

    prob=la température (2090 lignes de données)

    Et ce que je veux pcoloriser, c'est la valeur de prob en fonction de Y2 et Z2...
    et j'avoue que la dernière dimension me perturbe, car j'ai des doutes sur l'ordre que le reshape va provoquer.

  15. #15
    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
    OK donc tes données représentent bien un volume discret (des points) selon (x,y,z). On peut donc considérer que prob est un tableau 3D 10x11x19

    Si X,Y et Z sont les valeurs le long de chaque dimension de la grille (par exemple 1:10, 1:11 et 1:19), pour obtenir tous les couples de points, tu utilise MESHGRID (ou NDGRID) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Xg,Yg,Zg] = mesgrid(X,Y,Z);

    Et tu les as iordonnés comme ceci :

    Soit un tableau 2090x3...

    Tu peux donc redimensionner prob comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prob = reshape(prob,10,11,[]);
    Tu peux utiliser la fonction SLICE pour visualiser des coupes de ton volume comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    figure
    slice(Xg,Yg,Zg,prob,xs,ys,zs)
    Je te laisse lire la documentation pour mettre les valeurs de xs,ys et zs que tu souhaites

    Si tout ceci n'est pas clair, prend un volume avec moins de points (2x3x2 par exemple)

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

Discussions similaires

  1. [interp2] Problème de dimension
    Par LordPeterPan2 dans le forum MATLAB
    Réponses: 2
    Dernier message: 11/06/2007, 10h41
  2. Griddata seulement pour interpolation ?
    Par hollowdeadoss dans le forum MATLAB
    Réponses: 3
    Dernier message: 04/06/2007, 14h11
  3. [griddata] Restauration d'images
    Par mathilde_b dans le forum Images
    Réponses: 4
    Dernier message: 14/05/2007, 14h31
  4. [GridLayout][GridData]
    Par Stessy dans le forum SWT/JFace
    Réponses: 13
    Dernier message: 06/08/2003, 16h22
  5. [SWT] Problème de paramètre GridData
    Par yolepro dans le forum SWT/JFace
    Réponses: 4
    Dernier message: 06/12/2002, 10h37

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