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 :

figure 3D à partir de données


Sujet :

MATLAB

  1. #1
    Membre du Club
    Femme Profil pro
    Inscrit en
    février 2011
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : février 2011
    Messages : 220
    Points : 62
    Points
    62
    Par défaut figure 3D à partir de données
    Bonjour,
    J'ai un fichier texte contenant 25 colonnes.
    Ce sont des données de véhicules mélangées.
    Les données qui m'intéressent pour le moment sont les 4 premières colonnes, qui me donnent les trajectoires des véhicules (que je veux les dessiner dans une figure 3 D).
    La 1ère colonne contient le temps de parcours. La 2eme colonne contient l'identifiant du véhicule. la 3 eme colonne contient la position du véhicule sur l'axe x. la 4 eme colonne contient la position du véhicule sur l'axe y.
    C'est la 2 eme colonne qui contient l'identifiant de chaque véhicule. Donc si cet identifiant est le même "unique", donc il s'agit des données de trajectoires propres au même véhicule.
    Voilà ci-dessous mon code pour diviser:

    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
     
    clear all
    close all
    data = dlmread('D:\22_tracks_texte.txt');
     
    [~, ~, ic] = unique( data(:,2) );
    n = size(data,1);
    particules = accumarray(ic, (1:n).', [], @(idx) {data(idx,:)});
     
    for i = 1:size(particules,1)
        data1(i,:) = [particules{i,1}(1,1), particules{i,1}(1,3),particules{i,1}(1,4)];
    end
     
    figure
    hold on
    for k = 1:numel(particules)%%Parcourir les 689 véhicules
    if mod(k,2) == 1
    col_line = [1, 0, 0];
    else
    col_line = [0, 0, 1];
    end
     
    M = particules{k};
    plot3(M(:,1), M(:,3),M(:,4), 'color',col_line);
    end
    Je veux avoir les trajectoires des véhicules. mais je n'arrive pas à avoir une figure 3 D contenant le temps de parcours, la position en x, et la position en y !
    Pouvez vous m'aider, s'il vous plaît ?

    Merci d'avance

  2. #2
    Membre du Club
    Femme Profil pro
    Inscrit en
    février 2011
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : février 2011
    Messages : 220
    Points : 62
    Points
    62
    Par défaut
    En compilant mon code, j'ai une figure 2D :
    Nom : image_2021-10-11_112428.png
Affichages : 68
Taille : 34,2 Ko
    Je ne sais pas pourquoi je n'arrive pas à avoir une figure 3D !?

  3. #3
    Membre du Club
    Femme Profil pro
    Inscrit en
    février 2011
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : février 2011
    Messages : 220
    Points : 62
    Points
    62
    Par défaut
    L'idée en gros c'est de diviser les données en des matrices différentes.
    J'ai divisé les données de chaque véhicule (qui a le même identifiant dans la colonne 2 du fichier de données original) dans une matrice à part.
    Pour pouvoir dessiner sur la même figure toutes les trajectoires de tous les véhicules.

  4. #4
    Membre du Club
    Femme Profil pro
    Inscrit en
    février 2011
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : février 2011
    Messages : 220
    Points : 62
    Points
    62
    Par défaut
    Bonjour,
    Je n'ai toujours pas trouvé une solution à mon problème.
    La commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plot3(M(:,1), M(:,3),M(:,4), 'color',col_line);
    ne me donne pas une figure en 3 dimensions
    J'ai besoin de votre aide, s'il vous plaît

  5. #5
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2005
    Messages : 1 840
    Points : 3 365
    Points
    3 365
    Par défaut
    salut

    ca fait quoi si tu tapes view(45,45) ?
    tu as bien des valeurs différentes dans la 4eme colonne de M ?

    suivant la "tête" de tes données, scatter3 pourrait donner de meilleurs résultats (en ne reliant pas les points entre eux)

  6. #6
    Membre du Club
    Femme Profil pro
    Inscrit en
    février 2011
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : février 2011
    Messages : 220
    Points : 62
    Points
    62
    Par défaut
    Bonsoir @le fab,

    Oui "scatter3" me donne bien ce que je cherche.
    Sinon, là j'essaye d'assembler mes véhicules par couple "Suiveur -leader". Je veux tracer sur une même figure les trajectoires des véhicules qui se suivent l'une à côté de l'autre. Càd les véhicules proches en position en x (la 3 eme colonne de mon fichier texte) en fonction du temps de parcours (la 1 ère colonne de mon fichier texte) sur la route.

    Pouvez vous m'aider, s'il vous plaît ?

    Merci infiniment d'avance

  7. #7
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2005
    Messages : 1 840
    Points : 3 365
    Points
    3 365
    Par défaut
    tu pourrais créer par exemple un vecteur distance entre deux véhicules (sqrt((x1-x2)^2) voir sqrt((x1-x2)^2 + (y1 - y2)^2)) et prendre les distances plus courtes en moyenne pour distinguer deux véhicules qui se suivent

  8. #8
    Membre du Club
    Femme Profil pro
    Inscrit en
    février 2011
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : février 2011
    Messages : 220
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par le fab Voir le message
    tu pourrais créer par exemple un vecteur distance entre deux véhicules (sqrt((x1-x2)^2) voir sqrt((x1-x2)^2 + (y1 - y2)^2)) et prendre les distances plus courtes en moyenne pour distinguer deux véhicules qui se suivent
    Bonjour @le fab,

    Merci pour l'idée. Mais j'ai pas compris comment faire.
    Pour mes données, les positions en x se trouvent dans la 3 eme colonne. Donc je peux les avoir par la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    M = particules{k};
    M(:,3) % positions des veh dans 3 eme colonne

  9. #9
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2005
    Messages : 1 840
    Points : 3 365
    Points
    3 365
    Par défaut
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Mk = particules{k};
    Mj = particules{j};
    dist_kj = sqrt((Mk -Mj).^2); % distance instantanée
    distm_kj = mean(dist_kj ); % distance moyenne
    (et ce à condition que tes matrices M soient de même dimension, cad aient été enregistrée avec le même échantillonnage : sinon il faut harmoniser tout ca (interpolation par exemple)

    sinon je te conseilles également de stocker tous tes résultats dans une timetable : c'est assez pratique comme objet

  10. #10
    Membre du Club
    Femme Profil pro
    Inscrit en
    février 2011
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : février 2011
    Messages : 220
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par le fab Voir le message
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Mk = particules{k};
    Mj = particules{j};
    dist_kj = sqrt((Mk -Mj).^2); % distance instantanée
    distm_kj = mean(dist_kj ); % distance moyenne
    (et ce à condition que tes matrices M soient de même dimension, cad aient été enregistrée avec le même échantillonnage : sinon il faut harmoniser tout ca (interpolation par exemple)

    sinon je te conseilles également de stocker tous tes résultats dans une timetable : c'est assez pratique comme objet
    Bonjour Le fab,

    Voilà ce que j'ai fait :
    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
     
    clear all
    close all
    data = dlmread('D:\23_tracks_texte.txt');
     
    data(:,3) = data(:,3) / 25 ;%frame rate = 25 images/seconde donc changer le frame en seconde en divisant par 25
     
    [~, ~, ic] = unique( data(:,2) ); %tester si la 2 eme colonne contenant l'id de chaque véhicule est unique
    n = size(data,1);
    particules = accumarray(ic, (1:n).', [], @(idx) {data(idx,:)});
     
    for i = 1:size(particules,1)
        data1(i,:) = [particules{i,1}(1,1), particules{i,1}(1,4),particules{i,1}(1,14)];
    end
     
    %Alternance Rouge-Bleu
    figure(1)
    hold on
     
    for k = 1:numel(particules)%%Parcourir tous les véhicules
     
    if mod(k,2) == 1
    col_line = [1, 0, 0];
    else
    col_line = [0, 0, 1];
    end
     
    M = particules{k};
     
    %créer un vecteur distance entre deux véhicules 
    %et prendre les distances plus courtes en moyenne pour distinguer deux véhicules qui se suivent
     
    position = M(:,3);      %accéder au 3 eme colonne des données contenant des positions des véhicules
    Mk = position{k};       %prendre la position du véhicule en question
    Mj = position{k+1};     %prendre la position du véhicule suiveur
    dist_kj = sqrt((Mk -Mj).^2);    % distance instantanée
    distm_kj = mean(dist_kj );      % distance moyenne
     
    plot3( M(:,3), M(:,6),M(:,5), 'color',col_line);
     
    view(45,45)
     
    xlabel('time(s) ')
    ylabel('y(t)  ')
    zlabel('x(t) ')
     
    end
    Mais j'ai un message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Cell contents reference from a non-cell array object.
     
    Error in Read_data_Allemandes (line 36)
    Mk = position{k};
    Peut être parce que K, c'est la variable de la boucle ?

  11. #11
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2005
    Messages : 1 840
    Points : 3 365
    Points
    3 365
    Par défaut
    essayes

  12. #12
    Membre du Club
    Femme Profil pro
    Inscrit en
    février 2011
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : février 2011
    Messages : 220
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par le fab Voir le message
    essayes
    Bonsoir Le fab,

    Oui je l'ai corrigé, mais j'ai toujours le message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Attempted to access position(163); index out of bounds because numel(position)=140.
    Error in Read_data (line 36)
    Mk = position(k); %prendre la position du véhicule en question
    Et j'ai l'impression que dans mon plot, je dois prendre en considération les distances les plus courtes en moyenne pour distinguer deux véhicules qui se suivent que j'ai calculé.

  13. #13
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2005
    Messages : 1 840
    Points : 3 365
    Points
    3 365
    Par défaut
    c'est plus la même erreur
    avant c'était un problème de type de donnée (corrigée)
    la c'est un problème de taille de donnée : tu essayes d'accéder à un élément qui n'existe pas du tableau : ton tableau contient 140 élément et tu essayes d'obtenir le 163eme

  14. #14
    Membre du Club
    Femme Profil pro
    Inscrit en
    février 2011
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : février 2011
    Messages : 220
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par le fab Voir le message
    c'est plus la même erreur
    avant c'était un problème de type de donnée (corrigée)
    la c'est un problème de taille de donnée : tu essayes d'accéder à un élément qui n'existe pas du tableau : ton tableau contient 140 élément et tu essayes d'obtenir le 163eme
    Bonsoir Le fab,
    Je suis bloquée, je ne trouve pas la cause de cette erreur Normalement mon tableau doit contenir plus que 140 éléments.
    Egalement je ne trouve pas une méthode pour faire mes plot en tenant compte des distances moyennes entre les positions de chaque 2 véhicules.

    Pouvez vous m'aider, SVP ?

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/08/2005, 17h29
  2. Réponses: 3
    Dernier message: 25/07/2005, 10h40
  3. Réponses: 5
    Dernier message: 05/07/2005, 21h25
  4. Réponses: 1
    Dernier message: 24/05/2005, 15h50
  5. Réponses: 31
    Dernier message: 28/03/2005, 18h23

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