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 :

d'une liste deux tableaux


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 5
    Points : 3
    Points
    3
    Par défaut d'une liste deux tableaux
    Bonjour à tous ! Je bute depuis quelques jours là dessus, j'en appelle donc à votre aide et enseignement !
    Je vais détailler au plus possible pour être clair, si j'échoue dite le je ferai des petits schémas =)

    la situation :

    je pars d'un fichier data qui ressemble à ça (schématiquement en dessous):

    temps    voltage    courants
    1              0          450
    2              0          398
    ..             ..           ..
    60           0.5         871
    61           0.5         854
    ..             ..           ..
    1060         0          450
    1061         0          398
    ..             ..           ..
    2060          0.7       884
    2061          0.7       836
    1ere colonne le temps qui défile de 0 à environ 35 000.
    2e colonne on alterne des voltages et des 0 : 0 0.1 0 0.3 0 0.5 0 0.7 0 1 0 1.5 ...etc
    il s'agit en fait de polarisations (voltage non nul), suivis de dépolarisation (voltage nul)
    3e colonne les courants associés.

    de cette liste de données j'ai besoin d'en faire 2 tableaux :
    courants_Pol et courants_Depol structurés comme suit :

    courants_Pol :
    temps pendant la polarisation 1 courant associés pendant la polarisation 1 temps pendant la polarisation 2 courant associés pendant la polarisation 2 ....

    car les temps de polarisation sont théoriquement les mêmes (1000s), mais en regardant mes données j'ai entre 720 et 750 valeurs enregistrés, cela varie à chaque fois mais je me dépatouillerai avec le temps.
    il me faut donc les paires (temps, courants) en colonne pour chaque polarisation.

    courants_Depol :
    même chose mais pour les courants de dépolarisation. subtilité ici, toutes les valeurs du voltage (colonne 2 du fichier data) sont de 0.
    je cherche donc à avoir les couples [temps, courants] de chaque dépolarisation de façon séparées.

    voici ce que j'ai écris :

    boucle qui donne un vecteur V avec toutes les polarisations V [ 0.1 ; 0.2 ; 0.5 ... etc], avec N valeurs (N polarisations différentes)

    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
    courants_Pol = zeros(1,2*N);                % 2*N car N polarisations + N colonnes de temps
    courants_Depol = zeros(1,2*(N+1));          % N+1 car on commence tous les protocoles avec une serie de 0V inutile, mais ce n'est pas l'essentiel ici
     
     
    u = 1;
     
    for k = 1: D(1,1) % D(1,1) le nombre de ligne de data1
        for n = 1:N
            if data1(k,2) == V(n,1)   % si la polarisation est non nulle
                courants_Pol(u,2*n-1) = data1(k,1);   % on ajoute la valeur du temps au fichier des courants 
                courants_Pol(u,2*n) = data1(k,3);  % on ajoute la valeur du courant au fichier des courants 
     
                u = u + 1;
     
            else
                courants_Depol(u,2*n-1) = data1(k,1);
                courants_Depol(u,2*n) = data1(k,3);
                u = u + 1;
     
            end
        end    
    end

    j'ai utilisé u = 1 pour qu'à chaque début de nouvelle polarisation, il enregistre les valeurs du courant associé depuis la ligne 1 du fichier final courants_Pol, mais il me faudrait lui dire "quand la polarisation est terminée, remet u = 1 et enregistre les courants dépolarisation dans le fichier final courants_Depol depuis la ligne 1 dans une nouvelle colonne.

    ma logique est de parcourir l'ensemble des lignes du fichier DATA.
    à chaque ligne, je demande qu'il regarde la colonne des polarisations et qu'il compare avec la liste de celles ci : le vecteur V
    s'il trouve un élément en commun, donc s'il y a une polarisation, alors on enregistre le temps et le courant dans le fichier courants_Pol
    sinon (donc le else) c'est qu'il s'agit d'un 0, donc d'une dépolarisation, on enregistre le temps et le courant dans le fichier courants_Depol.

    je devrais donc finir avec 2 fichiers, avec autant de couple (temps, courants) que j'ai de polarisation, avec toutes les cases remplies de nombre mais pas de zéro, et ce sur environ 750 lignes.
    et pourtant je me retrouve avec des tableaux en majorité remplis de 0, faisant 16 000 lignes (soit la moitié de mon fichier DATA de départ, il sépare donc bien les polarisations des dépolarisations, me fait le bon nombre de colonnes, mais c'est comme s'il enregistrait les données sur la diagonale de mon tableau ...

    N'hésitez pas à poser des questions, demandez des clarifications, des schémas ... etc je reste là puisque de toute façon je suis bloqué !
    Bonne journée à vous et merci à ceux qui m'auront lu jusqu'ici, et encore plus à ceux qui m'aideront !

    edit :

    Nom : explain2.png
Affichages : 92
Taille : 21,0 KoNom : explain3.png
Affichages : 88
Taille : 24,1 Ko

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Je ne suis pas sûr de bien comprendre mais essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    data1 = [1              0          450
        2              0          398
        60           0.5         871
        61           0.5         854
        1060         0          450
        1061         0          398
        2060          0.7       884
        2061          0.7       836];
     
    idx = data1(:,2)~=0;
     
    courants_Pol = data1(idx, [1 3]);
    courants_Depol = data1(~idx, [1 3]);
    Ce qui renvoi ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    courants_Pol =
     
              60         871
              61         854
            2060         884
            2061         836
     
     
    courants_Depol =
     
               1         450
               2         398
            1060         450
            1061         398
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    on est pas loin ! Il me faut cependant dissocier les "blocs" en différentes colonnes, à ce qu'à chaque colonne corresponde soit le temps pour une seule polarisation ou le courant pour une polarisation, soit au final 2*N colonnes (avec N polarisations).
    peut être en ajoutant une boucle après la tienne :
    boucle sur les k lignes, si t(k+1) ~= t(k)+1 alors l'enregistrer dans une nouvelle colonne ?
    mais je ne sais pas si on peut comparer une ligne avec la suivante.
    ce qui pourrait aussi se traduire en
    si v(k) ~= V(k+1) alors enregistrer dans un fichier ...etc
    je schématise ci dessous (il y a une 1ere série de V=0 en début de fichier DATA, qu'elle soit dans le fichier final ou non ce n'est pas grave je ne la prendrai pas en compte

    Nom : explain2.png
Affichages : 89
Taille : 21,0 KoNom : explain3.png
Affichages : 94
Taille : 24,1 Ko
    Images attachées Images attachées  

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    finalement je les ai séparé et ça fonctionne :

    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
     
    %boucle pour les polarisations
    savepol = 1; %pour revenir a la ligne 1 en ecrivant une nouvelle colonne fichier polarisations
    savedepol = 1; % meme chose pour le fichier depolarisations
    for n = 1:N   
         for k = 1:D(1,1) % D(1,1) le nombre de ligne de data1
     
            if data1(k,2) == V(n,1)   % si la polarisation est non nulle
                courants_Pol(savepol,2*n-1) = data1(k,1);   % on ajoute la valeur du temps au fichier des courants 
                courants_Pol(savepol,2*n) = data1(k,3);  % on ajoute la valeur du courant au fichier des courants 
     
                savepol = savepol + 1;
                savedepol = 1 ;
            else
                savedepol = savedepol + 1;
                savepol = 1 ;
            end
        end    
    end
     
     
    %boucle pour les dépolarisations
    savedepol = 1; 
    n=1;
    u=1; % pour revenir a la ligne 1 en ecrivant une nouvelle colonne fichier depolarisations
         for k = 1:D(1,1) % D(1,1) le nombre de ligne de data1
     
            if data1(k,2) == 0  && savedepol == 1 % si la polarisation est nulle
                courants_Depol(u,2*n-1) = data1(k,1);   % on ajoute la valeur du temps au fichier des courants 
                courants_Depol(u,2*n) = data1(k,3);  % on ajoute la valeur du courant au fichier des courants
                u = u + 1;
            elseif data1(k,2) ~= 0
                savedepol = savedepol + 1;
                u = 1;
            else data1(k,2) == 0  && savedepol ~= 1;
                savedepol =  1;
                n = n + 1 ;
     
            end
        end

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/05/2014, 15h57
  2. [Débutant] Ajout d'éléments à une liste de tableaux de cellules
    Par ghada97 dans le forum MATLAB
    Réponses: 5
    Dernier message: 18/11/2013, 21h22
  3. Réponses: 7
    Dernier message: 08/10/2012, 09h57
  4. définir une liste de tableaux
    Par faounix dans le forum PL/SQL
    Réponses: 3
    Dernier message: 12/02/2010, 16h17
  5. Réponses: 6
    Dernier message: 21/07/2008, 11h21

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