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 :

Extraire les valeurs non nulles d'une matrice


Sujet :

MATLAB

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 65
    Points : 41
    Points
    41
    Par défaut Extraire les valeurs non nulles d'une matrice
    Bonjour,

    Je souhaiterais extraire d'une matrice les lignes non-nulles.
    J'ai vu que la fonction sparse correspond, mais elle ne me renvoie pas une matrice, mais des adresses et leur valeurs associées.

    Voici mon code :
    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
     
    %Calcul de N
    clear
    clc
    Tfusion=input ('Entrer la Température de fusion? \n')
     
    L=load ('C:\Documents and Settings\Sartorius\Mes documents\Sartorius_Stedim\sortie_matlab\Tmilieu.txt','-ASCII'); %charge le tableau des températures
     
    m=round(length(L(1,:))/2);
     
    for k=1:length(L(:,1)) %met à zeros les lignes où T milieu<Tfusion
        if L(k,m) < Tfusion
            L(k,:)=0;
        end
    end
    L = sparse(L)
    pause
    temps=L(:,1);
    tf=length(temps);
    T=L(:,2:length(L(1,:)));
     
    A=7.3e-6;
    Ea=6e4;
     
    [Derive]=calcul_expo(A,Ea,T);
     
    Simpson(Derive,temps(1),temps(tf));
    En fait, je charge un tableau qui comprend sur la 1ère colonne des temps, et sur les colonnes suivantes l'évolution de la température à différentes coordonnées.
    Je souhaite avoir un tableau qui ne comporte que les cellules dont la température est supérieure à une valeur fixe ( Tfusion dans mon cas). C'est pourquoi, j'ai choisi de mettre à 0 toutes les cellules ne satisfaisant pas cette condition, et que je veux enlever les lignes avec les 0.

  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,

    En utilisant FIND tu devrais y arriver:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    % Trouve les indices des lignes où il y a des 0 (seulement pour les colonnes de 2 à la fin)
    [line_idx, col_idx] = find(L(:, [2:end])<Tfusion);
     
    % On s'assure de ne garder qu'une fois chaque ligne
    line_idx = unique(line_idx);
     
    % On supprime les lignes ainsi définies
    L(line_idx, :) = [];
    Voilà j'espère que ca pourra t'aider

    Bonne journée,
    Duf

    P.S. Il doit y avoir une solution plus courte mais j'ai pas le courage de la chercher

  3. #3
    Membre actif
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Points : 213
    Points
    213
    Par défaut
    Essaie un truc comme ça :


  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 65
    Points : 41
    Points
    41
    Par défaut
    Merci, c'est top!


  5. #5
    Membre actif
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Points : 213
    Points
    213
    Par défaut
    je me suis trompé, je n'avais pas compris que L contenait plus de 2 colonnes.

    Regarde plutot ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L(~all(L(:,2:end),2),:) = [] ;

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 65
    Points : 41
    Points
    41
    Par défaut
    En fait, j'ai l'impression que la première solution fonctionne bien, car elle elimine les ligne où la deuxième valeur est nulle, non?

  7. #7
    Membre actif
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Points : 213
    Points
    213
    Par défaut
    Citation Envoyé par kwatz Voir le message
    En fait, j'ai l'impression que la première solution fonctionne bien, car elle elimine les ligne où la deuxième valeur est nulle, non?
    oui, la première solution que j'ai proposée efface la ligne si et seulement si la deuxième colonne (pour cette ligne) est nulle.

    La deuxième solution que j'ai proposée efface la ligne si et seulement si une des colonnes (sauf la première) (pour cette ligne) est nulle.

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 313
    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 313
    Points : 52 939
    Points
    52 939
    Par défaut
    Citation Envoyé par nahouto Voir le message
    La deuxième solution que j'ai proposée efface la ligne si et seulement si une des colonnes (sauf la première) (pour cette ligne) est nulle.
    Dans ce cas, tu aurais dû utiliser ANY, non ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 65
    Points : 41
    Points
    41
    Par défaut
    oui, la première solution que j'ai proposée efface la ligne si et seulement si la deuxième colonne (pour cette ligne) est nulle.
    Oui, donc ca fonctionne bien car je met à zero toute la ligne quand la condition n'est pas remplie.

  10. #10
    Membre actif
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Points : 213
    Points
    213
    Par défaut
    Citation Envoyé par Dut Voir le message
    Dans ce cas, tu aurais dû utiliser ANY, non ?
    c'est équivalent dans ce cas, puisqu'il met toute la ligne à zéro (je n'avais pas saisi ce point là)

    Citation Envoyé par kwatz Voir le message
    Oui, donc ca fonctionne bien car je met à zero toute la ligne quand la condition n'est pas remplie.
    ok, je comprends mieux.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 65
    Points : 41
    Points
    41
    Par défaut
    D'ailleurs, avec cette astuce

    Je peux même enlever ma boucle for, mon code devient du coup :

    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
     
    %Calcul de N
    clear
    clc
    Tfusion=input ('Température de fusion? \n')
    L=load ('C:\Documents and Settings\Sartorius\Mes documents\Sartorius_Stedim\sortie_matlab\Tmilieu.txt','-ASCII');
     
    m=round(length(L(1,:))/2);
     
    L(L(:,2)<Tfusion,:) =[];
     
    temps=L(:,1);
    tf=length(temps);
    T=L(:,2:length(L(1,:)));
     
    A=0.0000073;
    Ea=20000;
     
    [Derive]=calcul_expo(A,Ea,T);
     
    S=Simpson(Derive,temps(1),temps(tf));
    Merci pour votre aide!

  12. #12
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 313
    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 313
    Points : 52 939
    Points
    52 939
    Par défaut
    Citation Envoyé par kwatz Voir le message
    D'ailleurs, avec cette astuce
    Et cette astuce s'appelle l'indexage logique :

  13. #13
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 313
    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 313
    Points : 52 939
    Points
    52 939
    Par défaut
    Tu peux même remplacer le bloc suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    temps=L(:,1);
    tf=length(temps);
    T=L(:,2:length(L(1,:)));
     
    A=0.0000073;
    Ea=20000;
     
    [Derive]=calcul_expo(A,Ea,T);
     
    S=Simpson(Derive,temps(1),temps(tf));
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    A=0.0000073;
    Ea=20000;
     
    [Derive]=calcul_expo(A,Ea,L(:,2:end));
     
    S=Simpson(Derive,L(1,1),L(end,1));
    A vérifier

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 65
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par Dut Voir le message
    Tu peux même remplacer le bloc suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    temps=L(:,1);
    tf=length(temps);
    T=L(:,2:length(L(1,:)));
     
    A=0.0000073;
    Ea=20000;
     
    [Derive]=calcul_expo(A,Ea,T);
     
    S=Simpson(Derive,temps(1),temps(tf));
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    A=0.0000073;
    Ea=20000;
     
    [Derive]=calcul_expo(A,Ea,L(:,2:end));
     
    S=Simpson(Derive,L(1,1),L(end,1));
    A vérifier



    Merci, je viens de tester, ca a l'air de fonctionner !
    A ce rythme, je vais finir par poster tout mon programme pour que tu l'optimise !

  15. #15
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 313
    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 313
    Points : 52 939
    Points
    52 939
    Par défaut
    Citation Envoyé par kwatz Voir le message
    A ce rythme, je vais finir par poster tout mon programme pour que tu l'optimise !
    Je dirais plutôt que c'est à toi de bien comprendre chacune de nos "optimisations" et d'essayer de les appliquer toi-même

    Dans ce sens, pense à conserver les anciennes versions de tes programmes "non-optimisés" pour pouvoir comparer leur évolution

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 65
    Points : 41
    Points
    41
    Par défaut
    Héhé, si je comprends bien, je vais devoir faire le boulot

    Merci beaucoup en tous cas!

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

Discussions similaires

  1. Récupérer uniquement les valeurs non null d'un array
    Par yamatoshi dans le forum Langage
    Réponses: 5
    Dernier message: 07/06/2010, 08h08
  2. Garder les valeurs non nulles dans une matrice
    Par mfontan dans le forum MATLAB
    Réponses: 4
    Dernier message: 03/04/2009, 13h42
  3. Réponses: 4
    Dernier message: 24/12/2008, 20h35
  4. Les valeurs des tableaux dans une matrice
    Par fatma hamdi dans le forum Fortran
    Réponses: 1
    Dernier message: 30/03/2008, 23h33
  5. nombre de valeurs non nulles dans une tables
    Par 080983 dans le forum SQL
    Réponses: 33
    Dernier message: 27/08/2007, 12h04

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