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 :

Interpolation de coordonnées


Sujet :

MATLAB

  1. #1
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 93
    Points : 41
    Points
    41
    Par défaut Interpolation de coordonnées
    Bonjour,

    j'espère que je vais être clair dans l'exposition de mon problème et que vous allez prendre le temps de me lire, car j'ai besoin d'aide d'experts comme vous.

    J'ai une série de points en 3D, formant une courbe. Ces points sont séparés d'environ 1 (mètre par exemple, valeurs variables). Je souhaiterais avoir au final un fichier de points distants de 5 (mètres). Cette dernière valeur est alors calculée en faisant la somme des distances partielles (distance entre chaque point). Ainsi pour avoir la valeur 5 exactement, il faudra donc créer des interpolations. C'est-à-dire, lorsque cette valeur se trouve entre deux points connus, on interpolera linéairement pour avoir les coordonnées du point recherché. Ce dernier sera alors par la suite intégré à la liste de points pour calculer les distances partielles

    J'arrive à programmer ceci mais pour créer un seul point, je ne vois pas comment faire une boucle qui se répèterait jusqu'à la fin de la liste original.

    Je pense que vous comprendrez mieux en exécutant le code suivant avec le fichier *.txt joint à ce message :

    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
    function[]=interpolation(txt)
     
    M=dlmread(txt);
     
    Final = [M(1,1) M(1,2) M(1,3)];
     
     
    for i=1:length(M)-1
        D(i,1)=sqrt((M(i,1)-M(i+1,1))^2+(M(i,2)-M(i+1,2))^2+(M(i,3)-M(i+1,3))^2);
    end
     
    for j=1:length(D)
        Dpro(j,1)=D(j,1);
        Dcumul(j,1)=sum(Dpro);
    end
     
     
    for k=1:length(Dcumul)
     
        if Dcumul(k,1)>5 && Dcumul(k-1,1)<5
            Dtot=Dcumul(k,1)-Dcumul(k-1,1);
            Dint=5-Dcumul(k-1,1);
     
            Final(k,1)= M(k,1)+(M(k+1,1)-M(k,1))*Dint/Dtot;
            Final(k,2)= M(k,2)+(M(k+1,2)-M(k,2))*Dint/Dtot;
            Final(k,3)= M(k,3)+(M(k+1,3)-M(k,3))*Dint/Dtot;
     
            M(k+1,1)=Final(k,1);
            M(k+1,2)=Final(k,2);
            M(k+1,3)=Final(k,3);
     
        end
    end
     
     
    %on supprime les 0
    ligneasupprimer = [];
    for l=1:length(Final)
        if (Final(l,1)==0) & (Final(l,2)==0) & (Final(l,3)==0)
        ligneasupprimer = [ligneasupprimer l];   
        end
    end
    Final(ligneasupprimer,:) = [];
     
    Final

    Un grand merci d'avance,

    Cordialement.
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    Ton programme s'écrit plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    M=dlmread('essai.txt');
    D2 = sqrt(sum((M(2:end,:)-M(1:end-1,:)).^2,2));
    Dcumul = cumsum(D2);
    indice = find(Dcumul-5>0,1,'first');
    Dtot=Dcumul(indice)-Dcumul(indice-1);
    Dint=5-Dcumul(indice-1);
     
    Final = M(indice,:)+(M(indice+1,:)-M(indice,:))*Dint/Dtot;
    Par contre je suis curieux de connaître le but de cette méthode?...


    Sinon je n'ai pas compris ta question, qu'appelles-tu "faire une boucle qui se répèterait jusqu'à la fin de la liste original."?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  3. #3
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 93
    Points : 41
    Points
    41
    Par défaut
    Merci pour cette réponse et ce code raccourci. Mes lignes de code témoigne que je suis pas expert en programmation (c'est pourquoi je viens sur ce forum).

    Par "faire une boucle qui se répèterait jusqu'à la fin de la liste original" cela signifie qu'il faut créer un point à 5 du premier, à 10, à 15... jusqu'à la fin du fichier de points.

    En somme il faut considérer une ligne brisée passant par tout les points et calculer des coordonnées de points tout les 5.
    C'est ceci qui me pose problème !!

    Si quelqu'un peut m'aider...

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Citation Envoyé par stick25 Voir le message
    Mes lignes de code témoigne que je suis pas expert en programmation (c'est pourquoi je viens sur ce forum).
    Je ne pointais pas du doigt le fait que tu n'es pas un expert, je voulais juste te montrer une alternative en prenant en compte le fait que MATLAB aime la vectorisation (lorsque c'est possible comme dans ton application). Il faut bien commencer quelque part et je pense que l'on commence tous par coder avec des boucles qui s'avèrent inutiles (et qui de plus ralentissent le code). Mais autant prendre des bonnes habitudes dès maintenant, après c'est toi qui choisi

    Citation Envoyé par stick25 Voir le message
    Par "faire une boucle qui se répèterait jusqu'à la fin de la liste original" cela signifie qu'il faut créer un point à 5 du premier, à 10, à 15... jusqu'à la fin du fichier de points.
    Si tu arrives à le faire pour 5, tu sais aussi le faire pour 10, non? Si oui, il te suffit de rajouter une boucle et de mettre en forme les résultat pour récupérer chacun des points que tu calcules.
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  5. #5
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 93
    Points : 41
    Points
    41
    Par défaut
    Magelan, je suis tout a fait d'accord avec toi au sujet des débuts sous Matlab. Et je sais que tu ne pointais pas du doigt le fait que je ne suis pas un expert, et te remercie de me faire découvrir la vectorisation (que je ne maîtrise pas encore, je découvre petit à petit).

    Quand au code, oui je sais le refaire pour 10, 15 ... mais mon problème est justement que je n'arrive pas en faire une boucle pour faire les calculs et récupérer les points calculés.
    Je pense que cela ne doit pas être très très compliqué mais mes connaissances, mon expérience en programmation me freinent et me stop ici, c'est pourquoi je viens demander de l'aide...

    Merci beaucoup d'avance.

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    En fait, il suffit que tu aies une variable qui varie de 5 en 5, tu peux alors faire le calcul de Final pour chaque itération de cette variable.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for m=5:5:Dcumul(end)
        % calcul des coordonnées du point à la distance m
        % on met ce point dans un tableau
    end
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  7. #7
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 93
    Points : 41
    Points
    41
    Par défaut
    Merci pour cet élément de réponse.

    J'ai tapé le code suivant mais le problème est que seulement le premier et le dernier point calculés sont justes ! Les points calculés entre sont faux.
    Ne maitrisant pas encore la vectorisation, je ne comprends pas pourquoi... si vous pouviez m'aider svp.

    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
    M=dlmread('essai.txt');
     
    D2 = sqrt(sum((M(2:end,:)-M(1:end-1,:)).^2,2));
    Dcumul = cumsum(D2);
     
    for m=5:5:Dcumul(end)
     
    indice = find(Dcumul-m>0,1,'first');
    Dtot=Dcumul(indice)-Dcumul(indice-1);
    Dint=5-Dcumul(indice-1);
     
    Final(m,:) = M(indice,:)+(M(indice+1,:)-M(indice,:))*Dint/Dtot;
     
    end
     
    Final(1,:)=M(1,:);
     
    %on supprime les 0 de Final
    ligneasupprimer = [];
    for l=1:length(Final)
        if (Final(l,1)==0) & (Final(l,2)==0) & (Final(l,3)==0)
        ligneasupprimer = [ligneasupprimer l];   
        end
    end
    Final(ligneasupprimer,:) = [];
     
     
    Final
     
    Test_dist = sqrt(sum((Final(2:end,:)-Final(1:end-1,:)).^2,2))
    Merci beaucoup d'avance !

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Regarde bien chaque ligne dans ta première boucle : tu devrais rapidement comprendre l'erreur que tu as fait.
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  9. #9
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 93
    Points : 41
    Points
    41
    Par défaut
    Je me suis rendu compte juste après avoir posté de l'erreur à la ligne où Dint est calculé. J'ai remplacé 5 par m et ça semble fonctionner. Je vais affiner tout ceci et je reviendrai sur cette discussion si je rencontre un nouveau problème.

    Merci beaucoup !!

  10. #10
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut


    Autre remarque, plutôt que de rajouter une boucle pour supprimer les éléments à 0, autant ne pas les créer si ils sont inutiles. Voici une façon de faire (il en existe d'autres ):
    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
    M=dlmread('essai.txt');
     
    D2 = sqrt(sum((M(2:end,:)-M(1:end-1,:)).^2,2));
    Dcumul = cumsum(D2);
    Final=M(1,:);
    compteur = 2;
     
    for m=5:5:Dcumul(end)
     
        indice = find(Dcumul-m>0,1,'first');
        Dtot=Dcumul(indice)-Dcumul(indice-1);
        Dint=m-Dcumul(indice-1);
     
        Final(compteur,:) = M(indice,:)+(M(indice+1,:)-M(indice,:))*Dint/Dtot;
        compteur = compteur +1;
     
    end
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  11. #11
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 93
    Points : 41
    Points
    41
    Par défaut
    Effectivement c'est beaucoup mieux. Merci encore !!

  12. #12
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 93
    Points : 41
    Points
    41
    Par défaut
    Dernier détail à régler, et j'espère que vous allez pouvoir m'aider une nouvelle fois.

    Maintenant le fichier de points en entrée a 4 colonnes. La 4e colonne est remplie de 0 sauf pour quelques lignes. J'aimerais que le calcul d'interpolation insère ces lignes au bon endroit dans le fichier de point final.

    C'est à dire que l'on parcourt le fichier de points via la liste des distances cumulée de 5 en 5 et il faudrait que dès que l'on rencontre un point dont la 4e colonne n'est pas égale à 0, on insère ce point dans la liste de coordonnées final (quelqu'en soit la distance par rapport aux points voisins).

    J'espère que c'est pas trop flou ce que je raconte.

    J'ai déjà adapter le code pour calculer les distance sur les trois première colonne, mais je ne vois pas comment tenir compte de la 4e...
    Mon code est le suivant (la valeur di est la valeur d'interpolation ; 5 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
    function[]=interpol(txt,di)
     
    M=dlmread(txt);
     
    D2 = sqrt(sum((M(2:end,1:3)-M(1:end-1,1:3)).^2,2));
    Dcumul = cumsum(D2);
    Final=M(1,:);
    compteur = 2;
     
    for m=di:di:Dcumul(end)
     
        indice = find(Dcumul-m>0,1,'first');
        Dtot=Dcumul(indice)-Dcumul(indice-1);
        Dint=m-Dcumul(indice-1);
     
        Final(compteur,1:3) = M(indice,1:3)+(M(indice+1,1:3)-M(indice,1:3))*Dint/Dtot;
        compteur = compteur +1;
     
    end
     
     
    Final
     
    Test_dist = sqrt(sum((Final(2:end,1:3)-Final(1:end-1,1:3)).^2,2))

    Je joins également à ce post un fichier de points avec 4 colonnes.


    J'espère vraiment que vous allez pouvoir m'aider pour cette étape finale.
    Fichiers attachés Fichiers attachés

  13. #13
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 93
    Points : 41
    Points
    41
    Par défaut
    Je n'arrive pas à trouver d'autre solution que de rajouter ces lignes où la 4e colonnes n'est pas nul manuellement après les calculs... un peu chiant du fait que j'ai des gros fichiers mais à défaut d'autres solutions...

    Si jamais quelqu'un voit ce post et a une idée je suis preneur, même si c'est pas tout de suite !

    Merci beaucoup pour l'aide déjà apportée et merci d'avance pour une éventuelle aide future.

Discussions similaires

  1. Interpolation discrete sur coordonnées 2D
    Par magictol53 dans le forum Mathématiques
    Réponses: 1
    Dernier message: 27/06/2014, 13h29
  2. Réponses: 1
    Dernier message: 27/05/2014, 23h38
  3. SIFT : Amélioration de la précision par interpolation des coordonnées
    Par TheDwarf01 dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 21/02/2013, 23h40
  4. [FLASH MX] Interpolations de formes
    Par SamDaKap dans le forum Flash
    Réponses: 7
    Dernier message: 13/04/2005, 17h12
  5. Coordonnées du curseur ???
    Par LE CHAKAL dans le forum Composants VCL
    Réponses: 3
    Dernier message: 27/08/2002, 18h28

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