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. #1
    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 Ajouter des valeurs à une matrice (en conservant la matrice de base)
    Bonjour,

    J'ai un problème de dimensions de matrice sur Matlab

    J'effectue un test pendant lequel un fluide parcours différents tunnels de longueur différentes. Mon pas de temps pour les mesures est de 1/200.
    Pendant ce test, je récupère la valeur de température en entrée et en sortie du tunnel, je sais donc à quel moment de mon test ces températures sont atteintes.

    Je dois ensuite effectuer ce même test en simulation avec un pas de temps de 1/1000.
    Mon problème est donc de dire à Matlab de recréer un vecteur temps avec un pas de 1/1000 jusqu'au moment où la température d'entrée sera atteinte, puis de reprendre le calcul à la valeur temps où la température de sortie est atteinte.

    J'ai essayé avec des boucles for, while...mais comme les matrices/vecteurs ne sont pas de même dimensions, Matlab ne veut pas effectuer l'opération...

    Merci de votre aide

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    Pourrais-tu nous mettre un exemple de tes données (ce que tu as et ce que tu veux obtenir)?

    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  3. #3
    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 faire mettre un exemple court parce que mes vecteurs font plus de 10000 lignes.

    Par exemple en expérience j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Temps : [0 0.005 0.01 0.015...5.205(entrée tunnel, pas de valeurs)  7.405 (sortie tunnel, reprise des données) 7.500 7.505...
    Température :  [17.2 17.4 17.14 17.25...22.3(entrée) 15(sortie) 15.6...
    Et j'aimerais en simulation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Temps: [0 0.001 0.002 0.003 0.004 0.005 0.006 0.007...5.205(entrée) 7.5(sortie) 7.501 7.502 7.503]
    Température: 17.2 17.205 17.25 17.32 17.4...22.3(entrée) 15 15.2 15.3 15.34...
    Pour cet exemple, j'aimerais créer une matrice temps simu, où le temps est incrémenter de 1/1000 jusqu'à 5.205, puis reprend à 7.405 et ainsi de suite...)

    N'hésitez pas à me dire si ce n'est pas très clair.

    J'aurais plus de valeurs donc je serais plus précis.

    Merci

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je pense que la fonction doc interp1 pourra t'aider

  5. #5
    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 essayé avec ça également, mais comment lui dire de s'arrêter à telle valeur puis de reprendre à telle autre valeur ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    C'est toi même qui lui fourni le vecteur adéquat
    Est-ce le problème?
    Dans ce cas, un exemple qui je pense peut t'aider:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    V = 1:10;
    entree = 4;
    sortie = 8;
    V(entree:sortie)= []

  7. #7
    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
    Avec la fonction interp1, mon vecteur fait la bonne dimensions mais il est rempli de 0. C'est surement normal vu que je c'est le 1er vecteur que je créer qui fait cette taille ?

    Pour ton exemple c'est possible de le faire pour plusieurs valeurs d'entrées/sorties ? Ca m'a l'air pas mal, je vais essayer voir ce que ça donne.

    Merci

  8. #8
    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 essayé de le faire pour plusieurs tronçons, Matlab me donne comme message d'erreurs
    ???  Index of element to remove exceeds matrix dimensions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for i=1:100
    V(i);
    entree = 4;
    sortie = 8;
    entree2 = 15;
    sortie2 = 27;
     
    V1(entree:sortie2)= []
    V2(sortie:entree2)= []
    V3(entree2:sortie2)=[]
    end

  9. #9
    Invité
    Invité(e)
    Par défaut
    Ne serai-ce pas plutôt quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    V = 1:30;
    entrees = [4 15];
    sorties = [8 27];
    for i = length(entrees):-1:1
        V(entrees(i):sorties(i))= [];
    end
    V
    (*)Attention de supprimer les indices les plus grands en premier.

  10. #10
    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 mon programme complet j'ai :
    ??? Attempted to access tempsentreetunnel(13175); index out of bounds because numel(tempsentreetunnel)=11551.
    
    C'est normal vu que mes "tempsentreetunnel" sont issus de mes données et donc d'une matrice plus petites

  11. #11
    Invité
    Invité(e)
    Par défaut
    Pourrais-tu justement montrer ton code?
    Déjà pour cibler l'erreur, et ensuite pour bien cerner le déroulement, car je ne suis pas sûr de bien comprendre.

  12. #12
    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 un 1er temps j'importe mes valeurs issues de mon test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    temps=donnee(:,1); 
    longueur=donnee(:,2);
    temperature=donnee(:,3);
    J'ai donc mes vecteurs qui font une certaine dimensions (longueur k)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for i=2:k
        if dportion(i)>2 %tunnel
     temperature2(i)=temperature(i); 
     
        else
    temperature2(i)=temperature(i-1)+pas*constante;
     
      end
    end
    J'ai découper ma longueur en portion, et si ma portion est supérieure à 2mm je dis que ma température simulation = température données, sinon je déduis ma nouvelle température à partir de la température au pas précédent.

    C'est à ce moment là que j'ai un problème, certaines valeurs n'apparaissent pas à cause de la différence de pas de simulation.
    Par exemple si j'ai un tunnel à la ligne 254 de mes données, la ligne 254 de ma simulation ne sera pas un tunnel (car le pas est plus petit - le tunnel sera à la ligne 1247 peut être).
    Et de ce fait, il y a un décalage et lorsque je créer une matrice de dimensions suffisante pour un pas de 1/1000, les calculs sont hors limite à partir d'un certain moment.

    En fait ce que je souhaiterais c'est que ma simulation ait plus de valeurs pour être plus précis, mais que les entrées et sorties de tunnels soient respectés proportionnellement aux différents pas.

    J'espère avoir été assez clair

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nilsmatlab Voir le message
    J'ai donc mes vecteurs qui font une certaine dimensions (longueur k)
    Donc dans un premier temps, tu as k = size(donnee,1)
    Citation Envoyé par nilsmatlab Voir le message
    J'ai découper ma longueur en portion, et si ma portion est supérieure à 2mm je dis que ma température simulation = température données
    De quelle façon l'as-tu découpé? Quelle est la nouvelle longueur? Toujours égal à k (vu ta boucle for)?

    Citation Envoyé par nilsmatlab Voir le message
    C'est à ce moment là que j'ai un problème, certaines valeurs n'apparaissent pas à cause de la différence de pas de simulation.
    C'est là qu'intervient la fonction INTERP1
    Les valeurs entre les entrées et sorties sont-elles présentes au début, ou fais-tu le découpage?

  14. #14
    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
    Bonjour,

    Le "decoupage" de la longueur est juste un delta de la longueur enregistrée à l'instant t avec la longueur enregistrée à l'instant t+1.
    La longueur totale sera toujours identique, mais la longueur de portion sera plus faible vu que mon pas de temps est également plus faible.

    La longueur de la nouvelle matrice (ou vecteur)sera logiquement 5 fois plus grande (pas de temps 5 fois plus petit).

    Le problème des valeurs manquantes, c'est parce que j'ai codé le fait que l'entrée du tunnel soit positionné à la même ligne (avec les 2 pas de temps). Boucle for.

    Si je met avec z la nouvelle longueur de matrice, Matlab me dit que je suis hors limite pour car dportion(i) est issus des matrices de longueur k (des données).

    Pour interp1, je ne vois pas quel paramètre il faudrait mettre car le 3ème paremètre est normalement égal à la longueur du vecteur que l'on désire.

  15. #15
    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 fait ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     d2=interp1(time,d1,tempssimu(i));
    Avec :
    - time le temps de l'essai (dimension k)
    - d1 la longueur du tuyaux lors de l'essai (dimension k)
    - tempssimu(i), un vecteur que j'ai crée (dimension z)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i=1:z
     tempssimu(i)=i;
    end
    J'obtiens d2 = NaN de dimensions 1x1 ???

  16. #16
    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'arrive toujours pas à obtenir mes nouveaux vecteurs de la taille voulue par rapport à mon nouveau pas de calcul...

    Suivant les valeurs que je met dans interp1, soit j'obtiens un NaN comme dit précédemment, soit
    ??? Error using ==> interp1 at 261
    The values of X should be distinct.
    
    Error in ==> simubvspa at 322
     t2=interp1(d1,time,newd(i));
    Je ne sais pas si interp1 est utilisable dans ce cas, j'aimerais juste "copier" le vecteur temps avec un pas de temps plus petit entre chaque valeur.

  17. #17
    Invité
    Invité(e)
    Par défaut
    Pour obtenir le nouveau Temps2, ne peux-tu pas simplement faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Temps2 = Temps(1):1/1000:Temps(end)
    Ensuite faire l'interpolation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Temperature2 = interp1(Temps,Temperature,Temps2);
    Puis supprimer les valeurs comme montré dans mon message #9.
    Les nouveau indices (à quelques indices près je pense) doivent correspondre à 5 fois les anciens.

  18. #18
    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 ton exemple, tu détermine Température2 ?

    En fait Temperature2 sera déterminé par le calcul.
    Ce que j'aimerais faire, c'est obtenir un nouveau vecteur Temps (post #3) et que les coupures de temps (entrée/sortie tunnel), se fassent au même moment d'un point de vue valeur, mais à un endroit différent d'un point de vue indice de vecteur.

    Pour le moment, j'ai juste mes vecteurs (temps, distance et température) de dimensions k et qui sont issus des données (pas de temps = 1/200).

    Merci pour vos réponses en tout cas

  19. #19
    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 créer mon vecteur temps2 (dimension z).
    Est ce qu'il est possible de le comparer au vecteur temps (dimension k) (k<z) et de dire à Matlab de supprimer les valeurs que ne possède pas le vecteur temps (à partir de la première décimale).

    Par exemple
    temps (...1.25 1.255 4.2...)
    temps2 (...1.25 1.251 1.252 1.253 1.254 1.255 1.256 1.257 ....4.2...)

    Matlab supprimerait les valeurs en rouges car elle n'apparaissent dans temps, mais conserverait 1.251... même si ces valeurs n'apparaissent pas directement dans temps

  20. #20
    Invité
    Invité(e)
    Par défaut
    Non je ne pense pas, de plus même si on pouvait les comparer, les autres valeurs 1.251 1.252 1.253 1.254 ne seraient pas présentes non plus.

    Donc dans un premier temps, possèdes-tu les indices des entrées et sorties pour Temps?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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