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 :

extraction de valeurs d'une matrice suivant des indices de deux autres matrices


Sujet :

MATLAB

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sri Lanka

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 191
    Points : 63
    Points
    63
    Par défaut extraction de valeurs d'une matrice suivant des indices de deux autres matrices
    Bonjour,

    j'aimerai extraire des données de Températures pour des longitudes et latitudes données et je dispose de 3 matrices

    lon de dimension(388*276)
    lat de dimension(388*276)
    T de dimension(388*276)

    en faisant la figure comme ça, ça marche très bien mais je n'arrive pas a faire la figure juste pour la zone qui m'intéresse

    pour chercher les valeurs comprise entre les longitudes et latitudes que je cherche je fais ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [l_lon,c_lon]=find(lon>=2 & lon<=7);
    [l_lat,c_lat]=find(lat>=41 & lat<=44);

    j'ai pensé alors puisque je vais avoir des matrices lon et lat de dimension différente faire meshgrid mais ceci ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x=lon(l_lon,c_lon);
    y=lat(l_lat,c_lat);
    [X,Y]=meshgrid(x,y);
    j'ai l'erreur

    ??? Out of memory. Type HELP MEMORY for your options.
    Pour la commande
    x=lon(l_lon,c_lon);
    ensuite même si ceci marche je ne sais pas quels seront les coordx et coordy pour la matrice T


    contourf(X,Y,T(coordx,coordy))

    quelqu'un aurait une idée de comment le faire?
    merci

  2. #2
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Bonjour,
    tu peux utiliser l'indexage logique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    idx = lon>=2 & lon<=7 & lat>=41 & lat<=44;
    surf(lon(idx),lat(idx),T(idx);

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

    Attention cette ligne n'est pas correcte pour l_lon et c_lon vecteurs Un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    lon = [1 2 3 ; 4 5 6 ; 7 8 9];
    x=lon([1 3],[1 3])
     
    x =
     
         1     3
         7     9
    retournant à la fois lon(1,1), lon(1,3), lon(3,1) et lon(3,3) et non seulement lon(1,1) et lon(3,3).

    Et comme te l'a montré FLB, tu peux très bien utiliser l'indexage logique.

  4. #4
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sri Lanka

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 191
    Points : 63
    Points
    63
    Par défaut
    Merci pour la réponse. C'est certainement plus correcte de chercher les points comme ça.

    mais, j'ai eu ce message d'erreur après
    Z must be a matrix, not a scalar or vector.
    et quand j'ai regardé idx, ça donne une matrice avec des 1 sur les points de ma zone, donc il ne faut pas plutôt chercher ces indices des 1 dans idx avant de faire cette commande?

    surf(lon(idx),lat(idx),T(idx)

  5. #5
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Tel que tu découpes les lattitudes et les longitudes, l'indexage logique n'était en fait pas une bonne idée.
    Ce bout de code devrait faire le boulot.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    minLon=min(find(lon(1,:)>=2 & lon(1,:)<=7));
    maxLon=max(find(lon(1,:)>=2 & lon(1,:)<=7));
    minLat=min(find(lat(:,1)>=41 & lat(:,1)<=44));
    maxLat=max(find(lat(:,1)>=41 & lat(:,1)<=44));
    surf(lon(minLon:maxLon,minLat:maxLat),lat(minLon:maxLon,minLat:maxLat),T(minLon:maxLon,minLat:maxLat));

  6. #6
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sri Lanka

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 191
    Points : 63
    Points
    63
    Par défaut
    merci pour la proposition mais j'ai aussi cette erreur
    ??? Index exceeds matrix dimensions.
    
    Error in ==> read_symp_data at 53
             surf(lon(minLon:maxLon,minLat:maxLat),lat(minLon:maxLon,minLat:maxLat),T(minLon:maxLon,minLat:maxLat)); 
    j'ai pas compris pourquoi on doit mettre lon(1,:) et lat(:,1). les minLon, maxLon sont vides car dans la première ligne de la matrice il n y a pas des valeurs entre 2 et 7 donc il faut chercher dans toute la matrice.
    le problème c'est que quand j'ai fais ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    minLon=min(min(find(lon>=2 & lon<=7)));
    c'est aussi faux car il me donne l'indice du vecteur des min, et ça excède les indices de la matrice aussi (même erreur)
    j'arrive pas à trouver comment extraire les indices des valeurs de longitudes, latitudes correspondant à la zone.

  7. #7
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Salut,
    tes lon et lat ne résultent pas d'un meshgrid?
    J'imaginai que lon était formé de lignes qui se répètent (seules les colonnes sont différentes entres elles), et le contraire pour lat.
    Tu peux nous montrer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    lon(1:5,1:5)
    lat(1:5,1:5)

  8. #8
    Invité
    Invité(e)
    Par défaut
    Essai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    idx_lon = 2<=lon & lon<=7;
    idx_lat = 41<=lat & lat<=44;
    T(idx_lon | idx_lat) = NaN;
    surf(lon, lat, T);

  9. #9
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sri Lanka

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 191
    Points : 63
    Points
    63
    Par défaut
    Non ça ne résulte pas d'un meshgrid.

    Voilà les 5 premières lignes et colonnes de mes matrices lon lat

    >> lon(1:5,1:5)

    ans =

    -2.7471 -2.7131 -2.6793 -2.6458 -2.6125
    -2.6908 -2.6572 -2.6239 -2.5908 -2.5579
    -2.6343 -2.6012 -2.5682 -2.5355 -2.5030
    -2.5776 -2.5449 -2.5124 -2.4800 -2.4479
    -2.5207 -2.4884 -2.4563 -2.4244 -2.3927

    >> lat(1:5,1:5)

    ans =

    36.5540 36.5989 36.6435 36.6877 36.7316
    36.5267 36.5719 36.6166 36.6610 36.7051
    36.4998 36.5452 36.5901 36.6347 36.6790
    36.4733 36.5188 36.5639 36.6087 36.6531
    36.4470 36.4927 36.5380 36.5830 36.6276

  10. #10
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sri Lanka

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 191
    Points : 63
    Points
    63
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    idx_lon = 2<=lon & lon<=7;
    idx_lat = 41<=lat & lat<=44;
    T(idx_lon | idx_lat) = NaN;
    surf(lon, lat, T);
    ah donc ceci est proche je crois, sauf que je n'ai toujours pas ma zone, je vais essayer de réfléchir sur la condition pour mettre les NaN.

    en fait en faisant ça j'ai obtenu des données <2 et >7 en lon (l'inverse de ce que je cherche)
    et j'ai obtenu des données >44 et rien entre 41 et 44 et rien <41 en lat (donc pas exactement l'inverse)
    je dois réfléchir encore ...

    voilà les figures 'tout_data' avec toute la matrice et 'essai_data' en appliquant ces lignes de codes
    Images attachées Images attachées   

  11. #11
    Invité
    Invité(e)
    Par défaut
    Exact, tu cherchais à afficher l'inverse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T(~(idx_lon & idx_lat)) = NaN;
    Dernière modification par Invité ; 27/03/2013 à 14h12. Motif: Correction erreur

  12. #12
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sri Lanka

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 191
    Points : 63
    Points
    63
    Par défaut
    oui et c'est justement ce que j'ai essayé de faire mais j'ai eu ceci (pièce jointe)

    ce qui est bien c'est que j'ai ma zone mais j'ai les autres bouts dont je ne veux pas afficher
    - lon>7 et 41<lat<44
    - lon<2 et 41<lat<44
    - 2<lon<7 et lat <41

    je ne comprends pas comment ça reste en faisant ce code. je dois peut être les enlever par d'autres conditions?
    Images attachées Images attachées  

  13. #13
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sri Lanka

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 191
    Points : 63
    Points
    63
    Par défaut
    ah non non !!! j'ai pas mis le
    &
    Merci beaucoup ça marche

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

Discussions similaires

  1. probleme d extraction de valeurs d'une tree
    Par adam57 dans le forum Forms
    Réponses: 6
    Dernier message: 24/03/2008, 21h30
  2. Extraction de valeurs d une iteration
    Par mfontan dans le forum MATLAB
    Réponses: 16
    Dernier message: 18/01/2008, 16h13
  3. Réponses: 6
    Dernier message: 12/12/2006, 18h58
  4. Réponses: 9
    Dernier message: 30/05/2006, 10h33
  5. Réponses: 22
    Dernier message: 19/09/2005, 14h49

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