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 :

Comment remplir une matrice à N dim. par une série de matrices à N-1 dim.


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 5
    Points
    5
    Par défaut Comment remplir une matrice à N dim. par une série de matrices à N-1 dim.
    Bonjour à tous,

    Je m'initie à Matlab (R2008b)depuis quelques semaines et je fais maintenant face à un problème d'ordre syntaxique (probablement, du moins je l'espère...) assez énervant. Je cherche en effet à créer un matrice à N dimensions en la remplissant au fur et à mesure par des matrices incrémentées de N-1 dimensions (pardon pour la clarté... ^^). Plus simplement (prenons N=3) je cherche à construire une matrice cubique constituée d'un ''empilement'' de matrices n*p. Le code exposé ci-dessous éclaircira peut-être mes dires...

    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
    B = [];
    C = [];
     
    for i=1:5             
        for j=1:3         
            for k=1:3     
     
            B(j,k) = blablabla;     % ''blablabla'' simule dans cet exemple l'endroit où sont sockées mes valeurs...
            end
        end
     
        B(:,:)       % à ce stade B(j,k) est bon pour chaque '' i ''
     
        C(i,:,:) = C(i,B(:,:))    % Cette syntaxe ne marche évidement pas, sniff...
     
    end 
     
    C(4,:,:)    % J'aimerais donc pouvoir lire la ''matrice'' correspondant par exemple à B lorsque i=4.
    Voilà, j'ai beaucoup de mal à trouver la syntaxe pour ce problème, dont l'algorithme paraît pourtant simple.... Il est peut être faux...je ne sais pas...Si quelqu'un pouvait m'aider je lui en serais grandement reconnaissant ^^ !!!!!!!
    Merci d'avance!!

  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 304
    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 304
    Points : 52 881
    Points
    52 881
    Par défaut
    Je ne suis pas sûr de tout bien comprendre mais je ferais plutôt ceci :


  3. #3
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Merci de ta réponse.
    En fait ce type de syntaxe ne passe pas car C et B ne sont pas de la même dim:

    dim(C) = dim(B)+1

    Pour être plus explicite, dans le cas de matrices une dimension, soit des vecteurs, je cherche à les ranger un à un dans une matrice d'ordre 2 (un tableau). ex:

    B1 = [1 2 3 4 5]
    B2 = [4 8 6 9 67]

    et je voudrais les ranger dans C(:,:) = [B1 B2].

    Pour cet exemple pas de problème, sauf que dans mon cas les B(i) sont d'ordres supérieurs (typiquement d'ordre 2) et sont calculés au fur et à mesure dans une boucle. J'aimerais donc les ranger au fur et à mesure dans une matrice C(:,:,:) d'ordre 3. C(1,:,:) correspondrait donc au premier ''tableau'' des B calculés, C(2,:,:) au deuxième, etc.....

    J'espère avoir été plus clair ^^!
    Merci

  4. #4
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Essaye de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    C = [B1 B2] ; % On appelle concaténation horizontale
    mais celà ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    C = [B1 ; B2] ; % On appelle concaténation verticale

  5. #5
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Salut kmaniche,

    en fait étant dans une boucle for (qui décompte le nombre '''d'étages"" de ma matrice cubique), le C doit se remplir au fur et à mesure que B est calculé, je ne peux donc pas utiliser C = [B1 ...... Bn] ....

  6. #6
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Et la solution que je t'ai proposée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for i=1:n
        C = [C B] ;
    end

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

    je n'ai pas bien compris pourquoi la solution de Dut ne convenait pas? Tu cherches bien à mettre des tableaux 2D les uns à la suite des autres pour obtenir un tableau 3D, non? Est-ce que B a toujours les mêmes dimensions à chaque itération de i?

    Pourrais-tu donner un exemple simple de la tête que dois avoir ton tableau final? Quelle doivent être ces dimensions?

  8. #8
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    J'ai pensé que tu cherché à concaténer tes matrices horizontalement. Explique d'avantage. Ton problème n'a pas l'aire d'être trop compliqué

  9. #9
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    En réalité je n'ai accès à Matlab qu'à mon travail, et je n'ai donc pas pu tester le code que me propose Dut....
    Le vrai problème est en effet que mes matrices B n'ont pas le même nombre d'éléments, ce qui complique la création de la matrice. Typiquement, je cherche à obtenir un ''immeuble'': rdc je construit 10 appartements sous la forme 2*5. Ensuite je fais des calculs et je construit au premier étage 18 apparts (genre 3*6). Puis un deuxièmes étages avec 32 apparts, un troisième avec 8, etc....
    PS: désolé pour l'exemple, je ne suis pas très fort en explications... (heureusement pour nos jolies têtes blondes je ne suis pas prof...)

  10. #10
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Donc ce n'est tout simplement pas possible (si j'ai bien compris).

    Tu peux changer de façon de voir les choses et utiliser un tableau de cellules.

  11. #11
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    typiquement

    B1 ferais 180000 par 4
    B2 ferais 31000 par 4
    B3 fearis 64000 par 4 (jmax varie mais pas kmax fixé à 4)
    .
    .
    .
    B20 ..........

    Donc créer une matrice C de taille 180000*4*20. Le tableau B ayant une taille variable, il faudrait remplir de 0 les ''cases'' sans nombre...

  12. #12
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Salut Caro_Line,

    ça paraît être en effet une meilleure approche!!
    Tu pense que je vais pouvoir remplir le tableau de cellules au fur et à mesure?

  13. #13
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Citation Envoyé par belton Voir le message
    typiquement

    B1 ferais 180000 par 4
    B2 ferais 31000 par 4
    B3 fearis 64000 par 4 (jmax varie mais pas kmax fixé à 4)
    .
    .
    .
    B20 ..........

    Donc créer une matrice C de taille 180000*4*20. Le tableau B ayant une taille variable, il faudrait remplir de 0 les ''cases'' sans nombre...
    Pourquoi un nombre aussi important de cellules
    B1 ferais 180000 par 4 ou bien 18000

  14. #14
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    ... c'est bien 180 000....
    C'est des données d'enregistrements de capteurs hautes fréquences (de l'ordre de la dizaine de kHz)

  15. #15
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Citation Envoyé par kmaniche Voir le message
    Et la solution que je t'ai proposée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for i=1:n
        C = [C B] ;
    end

  16. #16
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    C'est vrai que c'est à tester. Je pense par contre que sans passer par le système de tableau de cellules je ne pourrais pas m'en sortir, comme m'a conseiller Caro_Line. La variabilité de jmax va me poser des pb...

  17. #17
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Là j'ai un peu plus de temps, et oui le tableau de cellules c'est l'idéal dans ton cas je pense :

    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
    %B = [];ça ça sert à rien puisque la taille de B va changer pour chaque i
    tailleC = 3;
    C = cells(1,tailleC);%C sera de taille 1*tailleC
     
    for i=1:tailleC           
        %je suppose que c'est ici que sont définis ligneB et colB
        B = zeros(ligneB,colB); %preallocation
        for j=1:ligneB         
            for k=1:colB   
     
            B(j,k) = blablabla;     % ''blablabla'' simule dans cet exemple l'endroit où sont sockées mes valeurs...
            end
        end
     
        C{i} = B;    % Tout simplement
     
    end

  18. #18
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    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 304
    Points : 52 881
    Points
    52 881
    Par défaut
    Ce qui donnerait sans B :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    tailleC = 3;
    C = cells(1,tailleC);%C sera de taille 1*tailleC
     
    for i=1:tailleC           
        %je suppose que c'est ici que sont définis ligneB et colB
        C{i} = zeros(ligneB,colB); %preallocation
        for j=1:ligneB         
            for k=1:colB   
     
            C{i}(j,k) = blablabla;     % ''blablabla'' simule dans cet exemple l'endroit où sont sockées mes valeurs...
            end
        end
    end

Discussions similaires

  1. Réponses: 6
    Dernier message: 03/11/2006, 09h59
  2. Comment remplir un dbcombo à l'aide d'une base donnée ?
    Par eclectik dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 27/09/2006, 15h50
  3. Réponses: 1
    Dernier message: 22/12/2005, 17h28
  4. Réponses: 6
    Dernier message: 09/12/2005, 11h14

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