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 :

Ecriture dune matrice avec 2 colonnes dans un vecteur colonne [Débutant]


Sujet :

MATLAB

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut Ecriture dune matrice avec 2 colonnes dans un vecteur colonne
    Bonjour à tous,

    J'ai le problème suivant : on se donne une matrice de la forme suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    X=
    1	3
    10	12
    17	24
    29	35
    41	46
    51	58
    60	65
    73	79
    82	84
    91	99
    102	104
    112	116
    118	123
    Le but est de réécrire le résultat sous la forme d'une seule colonne dans un vecteur Y et de la façon suivante : sur le vecteur X on regarde chaque ligne, par exemple la première : 1 3 ; puis dans X, je dois écrire en colonne, par pas de 1, toutes les valeurs entre le début et la fin d'une ligne bornes comprises, ce qui donnerait ici : 1 2 3 écrit en colonne. De même pour 10 12, ce qui donnerait avec cet exemple le début suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Y=
     
    1
    2
    3
    10
    11
    12
    17
    18
    19
    20
    ...
    J'ai réussit à le faire à l'aide de la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function Y=creer(X1_Imp1_liquide_melange)
    Y=[];
     
    %donne les événements
     
        for i=1:size(X1_Imp1_liquide_melange,1)
            Y=[Y;(X1_Imp1_liquide_melange(i,1):X1_Imp1_liquide_melange(i,2))'];
        end
    Mais je cherche un moyen de le réaliser directement sans boucle for.

    EDIT:

    Pour résumé, mon problème commence déjà par l’interrogation suivante : si on se donne l'intervalle [1 3], comment écrire tous les nombres de cet intervalle par pas de 1 (afin d'obtenir [1 2 3]) sans faire de boucle ?

  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 : 52 882
    Points
    52 882
    Par défaut
    Tu devrais pouvoir accélérer le code (dans le cas de matrice de grande dimension) car tu peux déterminer la taille finale du vecteur Y et donc faire une préallocation préalable :

    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
    X = [1	3
        10	12
        17	24
        29	35
        41	46
        51	58
        60	65
        73	79
        82	84
        91	99
        102	104
        112	116
        118	123];
     
    d = diff(X,[],2);
    nY = sum(d)+size(X,1);
    Y = zeros(nY,1);
     
    k = 1;
    for i = 1:size(X,1)
        Y(k:k+d(i),1) = X(i,1):X(i,2);    
        k = k+d(i)+1;
    end
    A tester et à comparer à ta solution.
    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
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Merci beaucoup Dut pour cet effort. C'est effectivement plus rapide de la sorte malgré la boucle for !

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    Une solution sans boucle :

    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
    clear
    X = [1	3
    10	12
    17	24
    29	35
    41	46
    51	58
    60	65
    73	79
    82	84
    91	99
    102	104
    112	116
    118	123];
     
    Y = cellfun(@(Y) Y(1):Y(2), num2cell(X,2),'UniformOutput', false).';
    Y = cell2mat(Y).';
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Merci à vous et désolé de répondre seulement maintenant.

    magelan, j'aimerais bien tester ta variante mais comme je ne comprends pas tout à fait ce que tu as écrit, j'ai voulu le tester tel quel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function Y=creer_sans_boucle(X1_Imp1_liquide_melange_evenements)
     
    Y = cellfun(@(Y) Y(1):Y(2), num2cell(X1_Imp1_liquide_melange_evenements,2),'UniformOutput', false).';
    Y = cell2mat(Y).';
    Mais je reçois l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Too many inputs.
     
    Error in ==> creer_sans_boucle at 3
    Y = cellfun(@(Y) Y(1):Y(2), num2cell(X1_Imp1_liquide_melange_evenements,2),'UniformOutput', false).';
    Apparement le cellfun de ma version matlab (7.0.1.24704 (R14) Service Pack 1) n'accepte pas autant de paramètres. Le problème est le même avec le code que tu m'as proposé tel quel ci-dessus.

    EDIT:

    En parcourant le forum, il est possible qu'il y ait un conflit de versions matlab et qu'avec la mienne, 7.0.1.24704 (R14) Service Pack 1 cela ne fonctionne pas. Y a-t-il malgré tout un moyen de faire marcher les deux lignes avec ma version ?

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Quoi que je fasse, il y a toujours un problème : too many ou too few arguments et ce genre de chose. Au moins, magelan, le code que tu m'as proposé plus haut fonctionne-t-il tel quel sur ta version de matlab ?

  7. #7
    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 : 52 882
    Points
    52 882
    Par défaut
    Citation Envoyé par abel413 Voir le message
    Y a-t-il malgré tout un moyen de faire marcher les deux lignes avec ma version ?
    Non.
    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)

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Dut,

    Dans ce cas existe-t-il quelque chose que je puisse faire du même genre que propose magelan (en prenant par exemple l'exemple du vecteur X donné dans le code de magelan) ? Le but est d'éviter toute boucle quand bien même ta variante est assez rapide.

  9. #9
    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 : 52 882
    Points
    52 882
    Par défaut
    Pourquoi vouloir à tout prix supprimer la boucle ?
    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)

  10. #10
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    J'ai tout simplement pour consigne, dans le cadre de mon travail, d'éviter toutes les boucles. Je pense que la variante de magelan est peut-être plus rapide que celle avec boucle. En fait, je pars de l'à priori, que dans le cas général un code sans boucles est plus rapide qu'un avec.

    Je viens de tester le code avec un collègue et pour lui la ligne avec cellfun passe mais pas celle avec cell2mat tandis que chez moi celle avec cellfun ne fonctionne pas. C'est donc bien clairement la version de matlab qui est problématique. Lui a une édition 2012.

  11. #11
    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 : 52 882
    Points
    52 882
    Par défaut
    Citation Envoyé par abel413 Voir le message
    J'ai tout simplement pour consigne, dans le cadre de mon travail, d'éviter toutes les boucles. Je pense que la variante de magelan est peut-être plus rapide que celle avec boucle. En fait, je pars de l'à priori, que dans le cas général un code sans boucles est plus rapide qu'un avec.
    Un simple test :
    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
    X = [1	3
        10	12
        17	24
        29	35
        41	46
        51	58
        60	65
        73	79
        82	84
        91	99
        102	104
        112	116
        118	123];
     
    X = repmat(X,200,1);
     
    tic
     
    d = diff(X,[],2);
    nY = sum(d)+size(X,1);
    Y = zeros(nY,1);
     
    k = 1;
    for i = 1:size(X,1)
        Y(k:k+d(i),1) = X(i,1):X(i,2);
        k = k+d(i)+1;
    end
     
    toc
     
    tic
    Y2 = cellfun(@(Y) Y(1):Y(2), num2cell(X,2),'UniformOutput', false).';
    Y2 = cell2mat(Y2).';
    toc
     
    all(Y(:)==Y2(:))
    exécuté plusieurs fois sur ma machine :

    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
    41
    42
    43
    44
    45
    46
    Elapsed time is 0.005882 seconds.
    Elapsed time is 0.029674 seconds.
     
    ans =
     
         1
     
    >> Untitled3
    Elapsed time is 0.010957 seconds.
    Elapsed time is 0.020074 seconds.
     
    ans =
     
         1
     
    >> Untitled3
    Elapsed time is 0.005929 seconds.
    Elapsed time is 0.021568 seconds.
     
    ans =
     
         1
     
    >> Untitled3
    Elapsed time is 0.015660 seconds.
    Elapsed time is 0.021886 seconds.
     
    ans =
     
         1
     
    >> Untitled3
    Elapsed time is 0.007153 seconds.
    Elapsed time is 0.023044 seconds.
     
    ans =
     
         1
     
    >> Untitled3
    Elapsed time is 0.010017 seconds.
    Elapsed time is 0.018972 seconds.
     
    ans =
     
         1
    La version avec la boucle est plus rapide sur ma machine.
    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)

  12. #12
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Je te remercie Dut pour ce test, c'est déjà une bonne nouvelle dans ce cas. Je vais donc conserver la version avec boucle. De toute façon, je n'ai pas le choix pour l'instant et sa rapidité me satisfait. Le problème reste la fonction sort je crois mais je n'ai pas reçu de réponse dans le sujet dédié que tu avais créé pour.

  13. #13
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Bonjour,

    Je reviens à ce sujet car entre temps j'ai effectué d'autres recherches la solution suivante m'a été suggérée :

    En utilisant les fonctions suivantes : http://www.mathworks.com/matlabcentr...exchange/29854

    Le problème c'est que je ne peux pas tester ceci en raison du message d'erreur suivant que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ??? At compilation "mcolsettol" was determined to be variable. As a variable,
    it is uninitialized, but function "mcolsettol" is now in context.
    In MATLAB 7, you cannot use the same name in a single function as
    both a function and a variable.
     
    Error in ==> mcolon at 24
    tol = mcolsettol();
    A nouveau ma version de Matlab semble problématique ainsi que la fonction mcolsettol de ce packetage. Qu'en pensez-vous ? Au moins si quelqu'un pouvait simplement tester cette fonction si elle marche chez lui et faire le test de rapidité de Dut.

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

Discussions similaires

  1. [XL-2003] BDMOYENNE avec plusieurs critères dans la même colonne
    Par meliria dans le forum Excel
    Réponses: 6
    Dernier message: 19/05/2010, 22h18
  2. Chercher un mot d'une colonne dans une autre colonne
    Par agur29 dans le forum Réplications
    Réponses: 6
    Dernier message: 17/12/2008, 16h52
  3. Ecrire des vecteurs colonnes dans un fichier text
    Par Ballim dans le forum MATLAB
    Réponses: 6
    Dernier message: 14/11/2008, 09h08
  4. verifier les valeurs d'une colonne dans une autre colonne
    Par Mimosa777 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/04/2008, 20h24
  5. Réponses: 14
    Dernier message: 28/07/2006, 10h20

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