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 :

Stocker mes résultats à chaque boucle dans une matrice sans écraser la précédente (pour les réutiliser ttes) [Débutant]


Sujet :

MATLAB

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Avril 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2018
    Messages : 47
    Par défaut Stocker mes résultats à chaque boucle dans une matrice sans écraser la précédente (pour les réutiliser ttes)
    Bonjour,

    Je vérifiais mon code et je me suis rendu compte d'une bêtise (HEUREUSEMENT!!)

    Description :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for n=1:1:15
     
    MatriceS=[];
     
    % Instruction pour calculer la variable S
     
    MatriceS=[MatriceS S(:)];
     
    end
    Normalement, je devrai avoir 15 matrices et pas une seule (la toute dernière où n=15), puisque à chaque itération, la précédente (la MatriceS dépendant de n) est écrasée.


    Je me suis rendu compte de ça, par ce que dans un 2eme script je fais appelle à cette MatriceS (qui dépend de n aussi dans le 2eme script), mais en réalité il n’appelait que la dernière MatriceS où n=15 !!

    Quelle instruction rajouter à la structure de stockage pour qu'il fasse le lien entre la MatriceS et mon "n" de la boucle dans les deux scripts, comme ça il saura que dans le deuxième script on appelle la bonne MatriceS au bon moment de la boucle (où les "n" coïncident celui de la MatriceS et celui de la boucle du deuxieme script)

    Merci de votre aide,

  2. #2
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2013
    Messages : 35
    Par défaut
    Bonjour Doctorant_GC,

    Simplement : met l'initialisation de ta matrice avant ta boucle;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MatriceS=[];
    for n=1:1:15
     
    % Instruction pour calculer la variable S
     
    MatriceS=[MatriceS S(:)];
     
    end
    Normalement ça devrait éviter d'effacer tes résultats des n-1 précédent. Après, pour stocker des matrices je pense qu'il est préférable d'utiliser des cellules si la taille des matrices est variable() ou d'utiliser une dimension supplémentaire si la taille des matrices ne varient pas (un tenseur )

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Avril 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2018
    Messages : 47
    Par défaut
    Merci de ton retour, l'initialisation est bel et bien avant la boucle for, je me suis juste trompé dans mon texte.

    J'ai bien fait mais le problème c'est que ça écrase à chaque fois..

    je détaille un peu plus le problème pour être explicite :

    En fait, je fais appel à plusieurs fichiers ( tu te rappelle ? ) et je fais une boucle pour parcourir tout ces fichier c'est mas premiere boucle, la deuxieme se passe à l'interieure de chaque fichier, donc la MatriceS est obtenue pour chaque fichier, mais àchaque fois que je lis un nouveau fichier, que je fasse une boucle dessus pour remplir la MatriceS, elle écrase celle obtenue pour le fichier lu précédement.... c'est ça le probleme


    ça donne grosso modo ce qui suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for n = 1:length(FileName) % Parcourir tous les fichiers dont j'ai besoin (le n c'est le i_file)
     
    MatriceS=[];
     
    for j=1:1:23
     
    %Instructions pour faire des calcul sur chaque fichier
     
    MatriceS=[MatriceS, S(:)];
     
    end 
    end
    donc je rempli la MatriceS pour chaque boucle faite sur mon fichier, mais une fois je lis un autre fichier la matriceS est de nouveau remplie en écrasant la précedente... tu vois mieux ce que je voulais dire ?

  4. #4
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2013
    Messages : 35
    Par défaut
    Je vois un peu mieux pour le coup, il te suffit de stocker tes résultats dans une matrice de cellules :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for n = 1:length(FileName) % Parcourir tous les fichiers dont j'ai besoin (le n c'est le i_file)
     
    for j=1:1:23
     
    %Instructions pour faire des calcul sur chaque fichier
     
    MatriceS{n,j} = S(:);
     
    end 
     
    end
     
    Matrice{2,3} % Accéder à la 3ème matrice du deuxième fichier Excel

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Avril 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2018
    Messages : 47
    Par défaut
    En fait, il y a un détail qui n'est pas moindre (enfin je crois)


    les S sont des valeurs uniques, pas des matrices.

    Pour j variant de 1 à 23, j'aurai 23 valeurs de S que je veux conserver dans une MatriceS (quicorrespond à au fichier lu traité dans 23 cas de figures).

    Est ce que ça change quelques choses comme je le pense tu crois ?

  6. #6
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Avril 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2018
    Messages : 47
    Par défaut
    mon objectif au final : c'est d'avoir nombre de matrices égale au nombre de fichier lus (length(FileName)), et chaque matrice comprends 23 valeurs de S ( correspondant à la deuxieme boucle)..

  7. #7
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2013
    Messages : 35
    Par défaut
    Alors j'en profite pour faire un point terminologie :

    • Element de dimension 1x1 = scalaire
    • Element de dimension 1xn = vecteur ligne
    • Element de dimension nx1 = vecteur colonne
    • Element de dimension nxn = matrice
    • Element de dimension nxnxn = tenseur


    Donc si tu souhaites une matrice constituée de vecteurs colonnes correspondants aux différents résultats S (avec S un scalaire) pour 23 valeurs, tu peux écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for n = 1:length(FileName) % Parcourir tous les fichiers dont j'ai besoin (le n c'est le i_file)
     
    for j=1:1:23
     
    %Instructions pour faire des calculs sur chaque fichier
     
    MatriceS(j,n) = S;
     
    end 
     
    end
    Si cela ne correspond toujours pas à ce que tu souhaite, précise nous la dimension de ton MatriceS et donne nous l'index qui tu souhaites appliquer s'il te plaît,

  8. #8
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Avril 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2018
    Messages : 47
    Par défaut
    Je m'excuse des terminologies non techniques que j'utilise, étant débutant (merci pour cet enseignement)

    Ta dernière proposition du code marche PARFAITEMENT, millle merci cher collègue,

    Dans le même contexte, comment je pourrai appeler les valeurs de S appartenant à cette MatriceS pour les utiliser dans un autre script?

    J'ai fait ce qui suit dans le deuxieme script et ça m'a affiché des erreurs


    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
    for n = 1:length(FileName)
     
    j=1:1:23 %t toujours le même j
     
    for j=1:1:23
     
    Sd_PP= MatriceS (j,n)
     
        if Sd_PP < A
            disp('XX')
        elseif Sd_PP >= A & Sd_PP < B
            disp('XX2')
        elseif Sd_PP >= B & Sd_PP < C
            disp('XX3')
        elseif Sd_PP >=C & Sd_PP < D
            disp ('XX4')
        elseif Sd_PP >= D
            disp('XX5')
        end
     
    end
    end
    Ce code me sert à comparer les valeurs de S obtenu dans le premiers script avec des limites prédéfinis (A, B , C, et D), ce sont des chiffre et non des chaines de caractères.

    il me sort l’erreur suivante :

    Undefined function 'lt' for input arguments of type 'cell'.

    Error in Mon_Code (line 33)
    if Sd_PP < A

  9. #9
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2013
    Messages : 35
    Par défaut
    Concernant ta dernière question,

    Ta variable A est une cellule, or la fonction lt (ou less than) n'est pas programmé par défaut pour comparer des cellules. Il faut simplement mettre A{:} dans ton code ou transformer ton A en num grâce à cell2mat(A).

  10. #10
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Avril 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2018
    Messages : 47
    Par défaut
    T'es toujours efficace franchement ! Merci infiniment, ce que t'as proposé fonctionne merveilleusement (j'ai choisi la solution cell2mat (). Elle est plus directe et facile à integrer).

    Est ce que écrire && au lieu de & et vise versa changerait quelques choses dans mes conditions dans le code ?

    En lisant des articles et des documents sur if, certains disent non lorsque l'on compare des entités de même nature, d'autres disent c'est différent si on compare les chaines de caractères ou des chiffres (C'est quoi le plus correcte, ou la bonne instruction) .

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

Discussions similaires

  1. [Débutant] Stocker mes résultats en sortie d'une boucle for dans une matrice
    Par Doctorant_GC dans le forum MATLAB
    Réponses: 7
    Dernier message: 25/05/2018, 09h49
  2. Réponses: 2
    Dernier message: 11/03/2018, 11h47
  3. Réponses: 3
    Dernier message: 06/05/2013, 15h04
  4. Stocker les resultats de ma boucle dans une Matrice
    Par Erebus dans le forum MATLAB
    Réponses: 0
    Dernier message: 06/05/2013, 13h55
  5. renvoyer les résultats d'une boucle dans une matrice
    Par Ptinéwik dans le forum MATLAB
    Réponses: 2
    Dernier message: 14/07/2008, 23h37

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