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 :

vecteur/matrice : reshape +


Sujet :

MATLAB

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 172
    Points : 107
    Points
    107
    Par défaut vecteur/matrice : reshape +
    salut ,

    pour les aficionados, je me pose la colle suivante, et puisqu'on aime tous la simplification à l'extrême, je vous expose la chose aussi.
    Il s'agit de l'exercice de style disons.

    On a un vecteur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    V = [
    1
    2
    3
    11
    22
    33
    111
    222
    1111
    2222
    3333
    ]
    On a les indices des 1, si ça peut servir, c'est-à-dire:
    et on veut la matrice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    M = [
    1 11 111 1111
    2 22 222 2222
    3 33  0    3333
    ]
    donc on crée la matrice zeros, si ça peut servir, zeros(3,4)

    et ensuite comment fait-on pour remplir madame ?
    reshape pas possible car longueur des vecteur dans M pas égaux ..
    le but de la manœuvre est de simplifier au maximum, donc pas de boucle, trop facile (mon .m fait une boucle car pour le moment j'ai pas trouvé comment faire autrement).

    c'est un cumul d'indices + reshape .. hm hm ..

    bref si un truc vous vient à l'esprit

    sinon .. ça reste ouvert jusqu'à qu'une future release nous ponde une fonction faisant la chose

  2. #2
    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,


    Citation Envoyé par Pierre845 Voir le message
    et ensuite comment fait-on pour remplir madame ?
    Pas sûr que tu sois dans le bon forum pour ce type de question....


    Edit : En fait je ne comprends pas quelle est la règle pour construire ton nouveau tableau. La première ligne comprends les indices 1 4 7 et 9. Y-a-t-il une logique pour construire les 2 lignes suivantes à parti de ces indices (1 4 7 9)? Comment l'algo que tu veux faire sait-il qu'il n'y a pas la séquence 333?
    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.

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 172
    Points : 107
    Points
    107
    Par défaut
    pour la madame, j'ai tendu la perche (euhh .. façon de parler .. lol).. je me doutais bien que quelqu'un allait profiter de l'occasion ..

    sinon me demandant la règle de construction, tu as en fait compris la problématique.
    j'ai donné les indices 1 4 7 9 car sans eux on a pas moyen de savoir si le 333 est présent ou pas.

    un reshape doit avoir une certaine condition sur les indices, les indices doivent avoir le même delta entre eux. or là on voit que 4-1=3, 7-4=3, MAIS 9-7=2 .. donc un simple reshape n'est pas possible.

    ma voie d'exploration est d'ajouter des zeros aux bons endroits grace aux indices, sur le vecteur initial (donc dans le cas présent ajouter un zero à l'indice 9, agrandissant donc le vecteur, les indices des 1 devenant [1 4 7 10]) pour ensuite faire un simple reshape

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

    Une manière d'automatiser l'obtention des indices:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    L = arrayfun(@(x) length(num2str(x)),V);
    indices = [1 find(diff(L))+1];

  5. #5
    Invité
    Invité(e)
    Par défaut
    Et maintenant, une solution de remplir la matrice M déjà 'reshapée':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    L = arrayfun(@(x) length(num2str(x)),V(:)');
    indices = [1 find(diff(L))+1 length(V)+1];
     
    V_unite = V-10*floor(V/10);
    nbr_presents = unique(V_unite);
    M = zeros(length(nbr_presents),length(indices)-1); % Allocation
    for i = 1:length(indices)-1
        Vi = V_unite(indices(i):indices(i+1)-1);
        M(ismember(nbr_presents,Vi),i) = V(indices(i):indices(i+1)-1); % Insertion des valeurs présentes
    end
    Dernière modification par Invité ; 04/05/2011 à 12h40. Motif: Amélioration

  6. #6
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 172
    Points : 107
    Points
    107
    Par défaut
    youpi , 1/2 d'h de perdue grace a la magie de l'informatique ..

    pourquoi les forums n'ont pas des enregistreurs de brouillons, ca eviterait de perdre des messages a causes des deconnexions reseau/forums automatiques

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 172
    Points : 107
    Points
    107
    Par défaut
    bef, merci jerome pour ta proposition, ceci etant, il y a une boucle.
    les 1 11 111 1111 sont en fait 1 1 1 1 et avec find(V==1) on trouve les indices des 1, bref j'avais mis 1 11 111 1111 pour simplifier

    donc je disais dans mon mail efface que j'essayais d'utiliser la concantenation de zeros a l'interieur de V.
    mais etant donne que c'est une concatenation indicielle, c'est-a-dire ajouter un zero a un certain endroit, je me demandais si passer par les structures ne pouvait pas aider, en utilisant des union/intersection suite a l'adjonction de zeros pour revenir a des vecteurs "splites" de meme longueur

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Pierre845 Voir le message
    les 1 11 111 1111 sont en fait 1 1 1 1 et avec find(V==1) on trouve les indices des 1, bref j'avais mis 1 11 111 1111 pour simplifier
    euh là je ne comprends plus rien
    Tu avais mis 1 11 111 1111 pour simplifier?
    Dans ce cas que veux-tu exactement?
    Un vecteur au lieu d'une matrice? il suffit de faire un reshape sur mon M ...

  9. #9
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 172
    Points : 107
    Points
    107
    Par défaut
    je te refere a l'ennoce initial si tu ne comprends plus rien, cra rien n'a change.
    les valeurs 1 11 111 1111 , ou 1 1 1 1, peu importe, seul compte le fait qu'on a leurs indices.
    ca peut etre 4 4 4 4, 4 44 4 44 , c'est pas le probleme.
    si c'est 4 4 4 4, on peut avoir les indices en faisant un find sur le 4, si c'est 4 44 444 4 , on fait la supposition pour resoudre le probleme qu'on a les indices.

    la construction de ton M est dans une boucle je crois, or le but est de ne pas utiliser de boucle, car quand les vecteurs sont longs..

    pour cette raison je me penche sur les fonctions associees aux structures, permettant un spread du vecteur V dans un field ou element, que je pourrait unioner avec des zeros, pour ensuite reconstruire le vecteur , sortir de la structure, et faire un reshape... mais pour le moment je trouve pas

  10. #10
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 172
    Points : 107
    Points
    107
    Par défaut
    j'avais pas pense aux cells.
    je vais voir si je trouve qquechose en travaillant sur des cellules au lieu de structures

Discussions similaires

  1. Allocation/Accès mémoire vecteurs matrice
    Par 3aychoucha dans le forum C++
    Réponses: 5
    Dernier message: 27/07/2012, 14h37
  2. Find vecteur / matrice
    Par farfouch00 dans le forum MATLAB
    Réponses: 4
    Dernier message: 01/06/2010, 11h54
  3. vecteur, matrice, sous simulink
    Par electrique_90 dans le forum Simulink
    Réponses: 1
    Dernier message: 25/12/2009, 09h03
  4. problème Vecteur matrice
    Par aerosniper dans le forum MATLAB
    Réponses: 7
    Dernier message: 18/12/2009, 10h42
  5. matrices * vecteur
    Par delire8 dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 07/09/2002, 14h15

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