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 :

Ajouter des valeurs à une matrice (en conservant la matrice de base) [Débutant]


Sujet :

MATLAB

  1. #21
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    Oui, mais suivant les données que je chargerais dans mon fichier, les entrées sorties ne seront pas positionnées au même endroit...

    J'avais penser à faire une différence entre temps(i) et temps(i-1), et si cette différence est supérieure à 1, alors ça veut dire qu'il y a une entrée sortie (donc tunnel).
    Puis enregistrer les valeurs d'entrée et sortie et que dans le vecteur temps2, il n'y ait pas de valeurs quand on atteint la valeur d'entrée jusqu'à celle de sortie.
    Mais ça bloque toujours au niveau de la longueur de chaque vecteur, je ne peux pas faire de boucle.

  2. #22
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nilsmatlab Voir le message
    Oui, mais suivant les données que je chargerais dans mon fichier, les entrées sorties ne seront pas positionnées au même endroit...
    Donc la réponse est non, tu ne possèdes pas les indices, et tu obtiens les données avec le découpage déjà fait. Mais dans ce cas, que fais-tu avec la condition portion(i)>2 ? Ou serai-ce:
    Citation Envoyé par nilsmatlab Voir le message
    J'avais penser à faire une différence entre temps(i) et temps(i-1), et si cette différence est supérieure à 1, alors ça veut dire qu'il y a une entrée sortie (donc tunnel).
    Ou plutôt 1/200, non?

    Puis enregistrer les valeurs d'entrée et sortie et que dans le vecteur temps2, il n'y ait pas de valeurs quand on atteint la valeur d'entrée jusqu'à celle de sortie.
    Mais ça bloque toujours au niveau de la longueur de chaque vecteur, je ne peux pas faire de boucle.[/QUOTE]

  3. #23
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    Dans ce cas, si j'arrive à obtenir mon nouveau vecteur temps, la condition sera uniquement sur le temps, et je recalculerais ma distance à partir de ce vecteur.

    J'ai fixé la condition entre temps(i) et temps(i-1) à 1 comme j'aurais pu le faire à 0.5, 0.6..., c'est uniquement pour savoir si je suis en présence d'un tunnel ou pas (il se passe forcement plus d'1 seconde entre l'entrée et la sortie du tunnel).

    As tu une idée de comment je pourrais faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Puis enregistrer les valeurs d'entrée et sortie et que dans le vecteur temps2, il n'y ait pas de valeurs quand on atteint la valeur d'entrée jusqu'à celle de sortie.
    Mais ça bloque toujours au niveau de la longueur de chaque vecteur, je ne peux pas faire de boucle.
    J'ai codé ça pour le moment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for i=2:k %k longueur du vecteur
       if time(i)-time(i-1)>1 
           entree(i)=time(i-1);
           sortie(i)=time(i);
       end
    end
     
    time2= time2(1):1/1000:time2(end)-(entree-sortie);

  4. #24
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    Peut être qu'une autre solution, je sais pas si c'est réalisable, serait de créer plusieurs vecteurs puis de les assembler tous à la fin.

    De faire,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for i=2:k
        sortie(1)=time(1);
       if time(i)-time(i-1)>1 
           entree(i)=time(i-1);
           sortie(i)=time(i);
       end
    end
     
    while entree(i)==0; %Si entree=0, alors il n'y a pas de tunnel
       time2(i)=sortie(i):1/1000:entree(i); %ecrire le vecteur time2-1 du début jusqu'à entrée1
    vecteur time2-2 de sortie1 à entrée2, etc...
    end

  5. #25
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    Bon ça ne fonctionne pas non plus, toujours un problème de dimensions.
    J'ai également essayé de créer une matrice avec tout les points entree/sortie de tunnel et de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [tunnel, ientree, isortie] = union(entree, sortie);
     
    for i=2:z
        if temps2==tunnel
            while temps2(i)~=tunnel(i+1)
        temps2(i)=0;
            end
        else
        temps2(i)=temps(i);
        end
    end
    Mais toujours les dimensions

  6. #26
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    Correction
    J'y arrive (enfin j'espère), en créant plus matrice pour chaque portion, et les réassembler à la fin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    pas1=0.001;
    for i=1:z-1
        for x=1:((z-1)/2)
    timex=tunnel(i):pas1:tunnel(i+1);
    % time2=tunnel(3):pas1:tunnel(4);
    % time3=tunnel(5):pas1:tunnel(6);
    % time4=tunnel(7):pas1:tunnel(8);
    % time5=tunnel(9):pas1:tunnel(10);
    % time6=tunnel(11):pas1:tunnel(12);
    % time7=tunnel(13):pas1:tunnel(14);
    % time8=tunnel(15):pas1:tunnel(16);
        end
    end
    lasttime=tunnel(end):pas1:time(end);

    Ca fonctionne parfaitement quand j'incrémente mes valeurs moi même à la main, mais pas dans une boucle. z est la longueur du vecteur tunnel (calculer avec le code mis quelques post au dessus).
    Je n'obtiens que le dernier "secteur", ici timex = time8, alors qu'il devrait s'incrémenter au fur et à mesure et que je devrais voir dans mon workspace 8 time différents (ce qui se passe sans boucle)

  7. #27
    Invité
    Invité(e)
    Par défaut
    Une idée, pas très optimisée, vu que Temps2 augmente en taille, mais en manipulant correctement les indices, et en faisant une pre-allocation, tu devrais t'en sortir.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    dTemps = diff(Temps);
    entrees = find(dTemps>1);
    sorties = [1 entrees+1];
    entrees = [entrees length(Temps)];
    Temps2 = [];
    for i = 1:length(entrees)
        Temps2 = [Temps2 , Temps(sorties(i)) : 1/1000 : Temps(entrees(i))];
    end

  8. #28
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    Je vais essayer ta solution voir ce que ça donne. Merci. Par contre en ce qui concerne la pré-allocation, je sais pas si je vais arriver à grand chose
    Ce que j'ai fait n'est pas correct ?

  9. #29
    Invité
    Invité(e)
    Par défaut
    Pour te faire une idée de la pré-allocation

  10. #30
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    Je n'ai pas vraiment compris quel était le but de certaines lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    dTemps = diff(Temps); %Calcul de delta temps ?
    entrees = find(dTemps>1); %Trouve l'emplacement des entrées
    sorties = [1 entrees+1]; %les sorties sont une case plus loin que les entrées. Mais pourquoi le 1er "1"
    entrees = [entrees length(Temps)]; %???
    Temps2 = []; % Créer une matrice vide ?
    for i = 1:length(entrees)
        Temps2 = [Temps2 , Temps(sorties(i)) : 1/1000 : Temps(entrees(i))]; %Créer le nouveau vecteur ?
    end
    Je n'ai également pas compris l'histoire d'indice. Il manque des indices ?

    Ma solution n'est pas exploitable ?

    Je te remercie encore !

  11. #31
    Invité
    Invité(e)
    Par défaut
    Mes "ajouts" de 1 aux sorties et length(Temps) à entrees est fait pour la boucle.
    Prenons un exemple:
    Temps = [0:1/200:1 3:1/200:4];
    Tu obtiendras les indices correspondant à Temps = 1 et 3 respectivement dans entrees (201) et sorties (202).
    Tu peux voir que dans la boucle je fais Temps(sorties(i)) : 1/1000 : Temps(entrees(i)).
    Avec les indices actuels, il y a juste le milieu et pas les extrémités (indices 1 et length(Temps)) je les rajoute donc.

    Ensuite, oui je crée une matrice vide qui servira à la première itération, sinon Temps ne serait pas défini.

  12. #32
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    J'ai réussi à faire ça, mais time2 reste une matrice vide...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    dtime = diff(time);
    entrees = find(dtime>1);
    sorties = [entrees+1];
    entrees1 = [time(entrees)];
    sorties1 = [time(sorties)];
    time2 = [];
    for i = 1:length(entrees)
        time2 = [sorties1(i):1/1000:entrees1(i)];
    end
    Tout le reste fonctionne sinon (mis à part le début et la fin)

  13. #33
    Invité
    Invité(e)
    Par défaut
    Juste un petit oubli:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        time2 = [time2 sorties1(i):1/1000:entrees1(i)];
    Mais tu obtiens quelque chose de vide, c'est justement qu'il faut que tu rajoutes les indices 1 et length(time) comme je l'ai fait.

  14. #34
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    Je les avais enlevés car Matlab me donne comme erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dtime = diff(time);
    entrees = find(dtime>1);
    sorties = [1 entrees+1];
    entrees = [entrees length(time)];
    entrees1 = [time(entrees)];
    sorties1 = [time(sorties)];
    time2 = [];
    for i = 1:length(entrees)
        time2 = [time2 sorties1(i):1/1000:entrees1(i)];
    end
    ??? Error using ==> horzcat
    CAT arguments dimensions are not consistent.
    
    Error in ==> Untitled at 35
    sorties = [1 entrees+1];
    ???

  15. #35
    Invité
    Invité(e)
    Par défaut
    C'est que tes vecteurs entrees et sorties sont des vecteurs colonnes et non lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sorties = [1 ; entrees+1];
    entrees = [entrees ; length(time)];

  16. #36
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    Merci, je viens à l'instant de voir cet oublie (1/2 journée pour 2 ";").

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dtime = diff(time);
    entrees = find(dtime>1);
    sorties = [1; entrees+1];
    entrees = [entrees; length(time)];
    entrees1 = [time(entrees)];
    sorties1 = [time(sorties)];
    time2 = [];
    for i = 1:length(entrees)
        time2 = [time2 sorties1(i):1/1000:entrees1(i)];
    end
    Merci beaucoup Winjerome, tu m'auras vraiment aidé

  17. #37
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    Une dernière petite question,
    A chaque valeur de temps correspond une certaine hauteur.
    Comment se fait-il qu'avec interp1 je n'obtienne pas le résultat attendu ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hauteur2(i)=interp1(time,hauteur,time2(i));
    hauteur et time sont issus des données et time2 à été calculé précedemment.

    Je devrais donc avoir length(hauteur2)=length(time2) ?

  18. #38
    Invité
    Invité(e)
    Par défaut
    Et que vaut i dans hauteur2(i)=interp1(time,hauteur,time2(i));? Fais-tu une boucle avec? Si oui quelles en sont les valeurs d'itérations?

    Une remarque cependant: je ne suis pas sûr qu'avec les vecteurs time et hauteur entiers possédant les "coupures" tu obtiennes de bon résultats à leurs approche. Peut-être faudrait-il faire entre chaque tunnel. À voir donc.

  19. #39
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    Au temps pour moi, je n'avais pas mis le même indice dans la boucle for (c'est la fin de semaine).

    Par contre, comme tu l'as dis, pour les valeurs qui "n'existent pas" dans hauteur/time, les valeurs sont incorrectes pour hauteur2.

    Les hauteurs sont uniquement des entiers et lorsqu'il y a un changement de hauteur, j'ai des décimaux, donc je fais faire un arrondi des valeurs, ou alors faire par tronçon.

    Merci pour tout

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [Débutant] Ajouter des valeurs à une liste situé dans une classe
    Par MPothin dans le forum Windows Forms
    Réponses: 1
    Dernier message: 27/08/2014, 15h05
  2. Ajouter des valeurs à une option de compilation
    Par kkt8 dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 06/04/2011, 08h00
  3. Ajouter des valeurs à une listbox multicolonnes
    Par bobosh dans le forum VBA Access
    Réponses: 1
    Dernier message: 08/10/2008, 09h23
  4. ajouter des valeurs à une liste déroulante
    Par Simon2 dans le forum IHM
    Réponses: 3
    Dernier message: 30/07/2007, 23h59
  5. Réponses: 13
    Dernier message: 01/02/2006, 12h00

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