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 :

ordonnancement étrange avec des vecteurs [Débutant]


Sujet :

MATLAB

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut ordonnancement étrange avec des vecteurs
    Bonjour tous,

    je souhaite faire une manip un peux spéciale avec une matrice, c'est assez complexe pour moi, j'espere que vous pourrez m'aider.

    1°) données de départ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vecteurDeBase=[1:1:n]';
    2°) étape intermédiaire:
    dans le cas où n=4 je voudrais faire une matrice 4*4 comme ceci:

    1 5 9 13
    2 6 10 14
    3 7 11 15
    4 8 12 16

    je n'ai pas encore résolu cela mais je pense qu'avec des boucles je vais y arriver

    3°) mon problème: là ça se complique un peu, d'ailleurs j'ai du mal à expliquer...

    - je vais ranger 9 vecteurs (de 4 données) dans les lignes de cette matrice:
    A=zeros(9,4)

    - je prends les colonne 1 et 2 et j'en deduis 3 vecteur:
    vecteur1= [ 1 2 6 5 ]
    vecteur2= [ 2 3 7 6 ]
    vecteur3= [ 3 4 8 7 ]

    - maintenant colonnes 2 et 3 et j'en deduis encore 3vecteur:
    vecteur4= [ 5 6 10 9 ]
    vecteur5= [ 6 7 11 10]
    vecteur6= [ 7 8 12 11 ]

    - maintenant colonnes 3 et 4 et j'en deduis encore 3vecteur:
    vecteur7= [ 9 10 14 13 ]
    vecteur8= [ 10 11 15 14 ]
    vecteur9= [ 11 12 16 15 ]

    pour obtenir cela je prendre les 4chiffres qui forme un carré et je tourne dans le sens trigonometrique pour un deduire leur ordre, ensuite je prends le carré juste en dessous et je fais de meme. Une fois que les colonnes 1 et 2 sont effectuées je fais les colonnes 2 et 3...


    4°) assemblage

    je mets les vector dans les lignes de A. Je pense que je n'aurais pas trop de mal à faire ceci en mettant des indices pour mes vector [i] où en ecrivant directement dans A

    j'espere que vous pourrez m'aider pour l'étape 3°) car je ne trouve pas ceci trivial (de plus je ne dois pas le faire pour une matrice 4*4 mais n*n)

    ps: les 1ere et derniere colone ne sont utilisés qu'une fois

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Alors pour la 2ème étape: en utilisant la fonction reshape:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    n = 4;
    M = reshape(1:n*n,n,n)
    Pour la 3ème étape, un simple repmat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for k = 0:n:n*(n-2)
        V = [1 2 n+2 n+1]+k;
        V = repmat(V,n-1,1) + repmat((0:n-2)',1,4)
    end
    Tu peux voir que j'ai réuni les vecteurs (1, 2, 3); (4,5,6),... dans ton cas, ou k:k+n-1 plus généralement, ce qui réduira déjà la prochaine étape
    Dernière modification par Invité ; 23/05/2011 à 23h00.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    tu porte bien ton nom WINJerome !!!

    => un truc qui me prendrait 50lignes tu le fais en 5 !!!!

    je vais regarder ce que tu as fais, je te tiens informé si je suis en galère.

    Merci encore

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Bonsoir,
    for k = 0:n:n*(n-2)
    V = [1 2 n+2 n+1]+k;
    V = repmat(V,n-1,1) + repmat((0:n-2)',1,4)
    end
    Jerome, je n'ai pas compris ce passage (dsl je suis pas très habitué à matlab), c'est un peu hardcore pour moi.

    => je ne comprends déjà pas pourquoi tu fais cette boucle (pourquoi tous les n et tu introduis un - 2 ??)

    => pourquoi on introduit un vecteur de seulement 4 colonne? (dans mon cas je parlé de 4 colonne mais dans le cas general que je veux faire il y en a n)

    => ensuite je pense que si je comprends les 2 points ci dessus je comprendrais le dernier (pas sur quand même car ça à l'air chaud...)

    merci d'avance pour ton aide

    edit:
    je viens encore de relire et decidement je ne comprends pas grand chose car les indices de la boucle sont un peu bizarre et le vecteur V me perturbe beaucoup

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par 21did21 Voir le message
    pourquoi on introduit un vecteur de seulement 4 colonne? (dans mon cas je parlé de 4 colonne mais dans le cas general que je veux faire il y en a n)
    Jusqu'ici je pensais que quelque soit le n, on prennait des carrés 2x2.
    Dans ce cas comment seront ordonnés les n valeurs? car ici on prend le carré 2x2 et on tourne dans le sens trigonométrique, mais pour n=5 par exemple, comment on procède?

    Ainsi ma méthode avec ce que j'avais cru comprendre expliquée:
    V = [1 2 n+2 n+1]+k représente un carré 2x2, le k permettant le changement de colonne par tranches de n (k = 0:n:n*(n-2) avec (n-2) car on a part de 0, et de 0 à (n-2), cela fait n-1 carrés de 2x2 répartis par ligne).
    Ensuite le repmat(V,n-1,1) fait se répéter les 4 valeurs sur (n-1) lignes auquel on ajoute repmat((0:n-2)',1,4) qui opère une incrémentation de 0 sur la 1ère ligne, 1 sur la 2ème, ... jusqu'à (n-1) afin de balayer tous les carrés selon la colonne courante.

    Ainsi chaque V représentera la concaténation de chaque ligne de vecteurs
    vecteur1= [ 1 2 6 5 ]
    vecteur2= [ 2 3 7 6 ]
    vecteur3= [ 3 4 8 7 ]
    V = [ 1 2 6 5 
          2 3 7 6 
          3 4 8 7 ]
    Dernière modification par Invité ; 24/05/2011 à 11h56.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Jusqu'ici je pensais que quelque soit le n, on prennait des carrés 2x2.
    Dans ce cas comment seront ordonnés les n valeurs? car ici on prend le carré 2x2 et on tourne dans le sens trigonométrique, mais pour n=5 par exemple, comment on procède?
    oui c'est bien cela, tu avais bien compris. En fait c'est moi qui n'a pas compris que ces valeurs étaient celles de notre carré.

    Citation Envoyé par Winjerome Voir le message
    Ainsi ma méthode avec ce que j'avais cri comprendre expliquée:
    V = [1 2 n+2 n+1]+k représente un carré 2x2, le k permettant le changement de colonne par tranches de n (k = 0:n:n*(n-2) avec (n-2) car on a part de 0, et de 0 à (n-2), cela fait n-1 carrés de 2x2 répartis par ligne).
    Ensuite le repmat(V,n-1,1) fait se répéter les 4 valeurs sur (n-1) lignes auquel on ajoute repmat((0:n-2)',1,4) qui opère une incrémentation de 0 sur la 1ère ligne, 1 sur la 2ème, ... jusqu'à (n-1) afin de balayer tous les carrés selon la colonne courante.
    merci pour ces explications à présent je comprends mieux.

    ==> je vais tester, A+

    EDIT:

    Ok c'est super tes explications, j'ai tous compris! En fait j'ai eu un peu de mal car je raisonné par lignes et ensuite par colonne et toi tu as résolu le problème dans l'autre sens: colonne puis ligne.

    merci encore Jerome A+

  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 Winjerome Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        V = repmat(V,n-1,1) + repmat((0:n-2)',1,4)
    Une légère amélioration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        V = repmat(V,n-1,1) + repmat((0:n-2).',1,4)
    => : Quelle est la différence entre ' et .' ?
    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 éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par Dut Voir le message
    Une légère amélioration :
    merci pour cette precision DUT

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    re-salut Winjerome (et DUT),

    lorsque j'ai posé mon problème je n'ai pas été assez précis et du coup la solution que l'on a, n'est pas valable dans mon cas général qui n'est pas une matrice carré

    en fait dans le cas général je peux avoir ces deux types de matrices:

    1°) matrice 1: 3*4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1 4 7 10
    2 5 8 11
    3 6 9 12
    vecteurs que je souhaite:
    <1 2 5 4> <2 3 6 5> <4 5 8 7>
    <5 6 9 8> <7 8 11 10> <8 9 12 11>

    2°) matrice 2: 4*3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1 5 9
    2 6 10
    3 7 11
    4 8 12
    vecteurs que je souhaite:
    <1 2 6 5> <2 3 7 6> <3 4 8 7>
    <5 6 10 9> <6 7 11 10> <7 8 12 11>

    3°) ici j'ai mis des matrices de type n*n+1 mais ca peut tres bien etre n*n+7

    en fait la seule chose importante est d'obtenir les vecteurs par rotation dans le sens trigonometrique.

    => je pense que je dois utiliser cette relation:

    vecteur=<A[i][j] A[i][j+1] A[i+1][j+1] A[i+1][j] >

    et je dois faire deux boucles pour me déplacer dans les lignes et colonnes ? du type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for j=1:1:(nb_ligne-1)
    for i=1:1:(nb_colonne-1)
    vecteur{i+j}=[A(i,j) A(i,j+1) A(i+1,j+1) A(i+1,j) ]
    end
    end
    Quand penses tu ? j'ai l'impression que ça dois fonctionner (j'ai pas de quoi tester maintenant..)

    EDIT:

    ca ne va pas marcher ce truc car vecteur va commencer à 2 ....

  10. #10
    Invité
    Invité(e)
    Par défaut
    Aux indices près, oui c'est juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i=1:(nb_ligne-1)
        for j=1:(nb_colonne-1)
            V{j+(nb_colonne-1)*(i-1)} =  [A(i,j) A(i+1,j) A(i+1,j+1) A(i,j+1)];
        end
    end

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Aux indices près, oui c'est juste
    au indices pres

    Citation Envoyé par Winjerome Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i=1:(nb_ligne-1)
        for j=1:(nb_colonne-1)
            V{j+(nb_colonne-1)*(i-1)} =  [A(i,j) A(i+1,j) A(i+1,j+1) A(i,j+1)];
        end
    end

    merci pour cette correction! je test dès que possible.

    EDIT:
    ca fontionne

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Jerome, je peux te demander une dernière chose:

    le petit bout de code ci dessus permet de faire une boucle sur les colonnes ensuite descendre d'une ligne et faire toute les colonnes, ainsi de suite....

    Pour des raisons pratiques (pour la suite de mon travail) ça m'arrangerai vraiment si ce serait le contraire:
    - la double boucle parcours les lignes en 1er puis change de colonne et refait toutes les lignes ...

    J'ai testé plusieurs choses:
    - inverser les indices
    - inverser les boucles

    mais je suis toujours en galere... que dois je modifier dans ce bout de code pour arriver à faire ceci?

  13. #13
    Invité
    Invité(e)
    Par défaut
    Alors déjà échanger les indices des deux boucles, et l'indexage de V comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for j=1:(nb_colonne-1)
        for i=1:(nb_ligne-1)
            V{i+(nb_ligne-1)*(j-1)} =  [A(i,j) A(i+1,j) A(i+1,j+1) A(i,j+1)];
            M(i+(nb_ligne-1)*(j-1),:) =  [A(i,j) A(i+1,j) A(i+1,j+1) A(i,j+1)]; % version avec matrice (de taille (nb_colonne-1)*(nb_ligne-1) x 4 )
        end
    end

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Alors déjà échanger les indices des deux boucles, et l'indexage de V comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for j=1:(nb_colonne-1)
        for i=1:(nb_ligne-1)
            V{i+(nb_ligne-1)*(j-1)} =  [A(i,j) A(i+1,j) A(i+1,j+1) A(i,j+1)];
            M(i+(nb_ligne-1)*(j-1),:) =  [A(i,j) A(i+1,j) A(i+1,j+1) A(i,j+1)]; % version avec matrice (de taille (nb_colonne-1)*(nb_ligne-1) x 4 )
        end
    end
    merci beaucoup jerome

    (c'est bizarre j'ai l'impression que c'est ce que j'avais fait... j'ai du inverse un indice )

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/02/2012, 11h51
  2. Problème étrange avec des plages de cellules
    Par ANOVA dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/08/2011, 23h12
  3. Travail avec des vecteurs (rentabilité)
    Par Caspi dans le forum R
    Réponses: 5
    Dernier message: 27/09/2009, 19h05
  4. Arbre N-aire avec des vecteurs de pointeurs
    Par valderama dans le forum Débuter
    Réponses: 3
    Dernier message: 15/01/2009, 16h42
  5. Petits soucis avec des vecteurs
    Par Superzobi dans le forum SL & STL
    Réponses: 3
    Dernier message: 03/05/2007, 09h04

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