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 :

Problème construction matrice à partir de plusieurs vecteurs [Débutant]


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Problème construction matrice à partir de plusieurs vecteurs
    Bonjour à tous,

    Je souhaite créer une matrice de telle sorte que je puisse avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    A =
    1 1 1
    1 2 2
    1 3 3
    2 1 4
    2 2 5
    2 3 6
    3 1 7
    3 2 8
    3 3 9
    La première colonne représentant les X, la deuxième les Y, la troisième représentant les Z.
    J'ai pour cela créé 3 vecteurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    x = [1 2 3];
    y = [1 2 3];
    z = [1 2 3 4 5 6 7 8 9];
    J'ai alors tenté le code suivant pour construire ma matrice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    count = 1;
    for i=1:length(x)
    for j=1:length(y)
    XYZ(i,1)=x(i);
    XYZ(i,2)=y(j);
    XYZ(i,3)=z(count);
    count = count+1;
    end
    end
    J'obtiens alors 9 tableaux en 9x3, donc aucun ne me donne le résultat cherché...

    J'ai essayé le même programme en C, et tout se déroule bien, je découvre MATLAB, et ne voit donc pas où se situe mon erreur...

    Vous me seriez d'une grande aide !

    Romwn

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Bonjour,

    Peux tu nous montrer le résultat de ce script en écrivant XYZ dans ta command window?
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Après avoir redémarré Matlab j'ai réinitialisé les valeurs à nouveau, je n'obtiens plus le même résultat.
    Désormais j'ai bien un tableau en 2D, mais toujours pas le résultat obtenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    XYZ =
     
    1	1	3
    2	2	6
    3	3	9
    J'ai cru comprendre que les boucles for n'étaient pas ce qu'il y a de mieux sur Matlab, peut être que la double boucle for est le problème ..?

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Ta variable d'itération varie de 1 à 3 dans ton code, pas étonnant que ta matrice ne comporte que 3 lignes si tu ne trouves pas comment faire, je t'aiderai tout à l'heure
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    J'ai bien réessayé de faire tourner le même code en C et Java, ça marche bien...
    Je vois bien que je fais itérer mon i jusqu'à 3, mais pour chaque valeur de i, je fais itérer j de 1 à 3, donc logiquement je devrais avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    i = 1
       j = 1
       j = 2
       j = 3
    i = 2
       j = 1
       j = 2
       j = 3
    i = 3
       j = 1
       j = 2
       j = 3

    Non ? C'est en tout cas le but recherché pourtant

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Certes, mais ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    count = 1;
    for i=1:length(x)
    for j=1:length(y)
    XYZ(i,1)=x(i);
    XYZ(i,2)=y(j);
    XYZ(i,3)=z(count);
    count = count+1;
    end
    end
    Tu attribues des valeurs aux lignes i=1, i=2 et i=3 de ta matrice. A aucun moment tu n'attribues des valeurs aux lignes suivantes.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    count = 1;
    for i=1:length(x)
    for j=1:length(y)
    XYZ(count,1)=x(i);
    XYZ(count,2)=y(j);
    XYZ(count,3)=z(count);
    count = count+1;
    end
    end
    et comme ça? à noter que tu aurais pu utiliser une troisième boucle.

    Il y a également d'autres méthodes sans passer par des boucles, en utilisant des concaténations à bon escient par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    XYZ= cat(2,[x'; x'; x'], [y'; y'; y'], z);
    XYZ(:,2) = sortrows(XYZ(:,2));
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  7. #7
    Membre à l'essai
    Homme Profil pro
    Analyste Quantitatif / Developpeur
    Inscrit en
    Octobre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Analyste Quantitatif / Developpeur
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2015
    Messages : 9
    Points : 17
    Points
    17
    Par défaut
    Salut romwn,

    Je ne suis pas 100% sur de ce que tu veux faire donc desole si c est a cote de la plaque. J aurais fais quelque chose comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    n = 3
    y = repmat(1:n,1,n)'
    x = sort(y)
    z = (1:n*n)'
    XYZ = [x y z]

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Salut gooby, j'ai essayé le premier code, et j'ai obtenu le résultat suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    XYZ = 
    1	1	1
    2	2	2
    3	3	3
    1	1	4
    2	2	5
    3	3	6
    1	1	7
    2	2	8
    3	3	9
    J'avais essayé de passer par les concaténations, je vais essayer d'y passer un peu plus de temps..!

    dionisis mon sauveur ! C'est (presque) ça ! Au final c'est le résultat recherché, mais la méthode ne peut s'appliquer à mon application

    En l'occurence pour mon application, mes X correspondent à un tableau qui va de -200 à +200 avec un pas qui peut varier, mes Y vont de -500 à +4000. Mais les valeurs peuvent changer, il faut donc que je passe par les éléments de X, Y et Z directement et non par un n, de plus on ne peut créer x à partir de y ...

    Je vais essayer de passer quelques heures sur la doc, mais j'ai peur qu'on ne puisse créer la table de cette façon ..

  9. #9
    Membre habitué
    Homme Profil pro
    Doctorant LNE Trappes
    Inscrit en
    Mai 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Doctorant LNE Trappes
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 64
    Points : 174
    Points
    174
    Par défaut
    Le code pour construire A prend une ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    x=[1 2 3]
    y=[1 2 3]
    z=[1 2 3 4 5 6 7 8 9]
     
    A=[kron(x,ones(1,3))' repmat(y,1,3)' z']

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Bonjour Paul-Ceria,

    J'ai essayé le code et en effet ça marche, seulement comme je l'expliquait précédemment, mes valeurs de X et Y sont respectivement stockées dans une matrice 1*627 double et 1*1401 double...
    mes Z sont normalement stockées dans une matrice 1401*627 double, que j'ai ensuite transformé pour avoir une matrice 1*878427 double en utilisant le code suivant :
    en essayant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A=[kron(x,ones(1,3))' repmat(y,1,3)' z'];
    j'ai obtenu l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Error using horzcat
    Dimensions of matrices being concatenated are not consistent.
    Seulement à quel moment utilise-t-on horzcat dans l'instruction ..?
    L'adaptation vecteur à matrice est il possible ? J'ai essayé de trouver une solution pour transformer une matrice 1*nbElements à un tableau, mais sans succès...

  11. #11
    Membre habitué
    Homme Profil pro
    Doctorant LNE Trappes
    Inscrit en
    Mai 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Doctorant LNE Trappes
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 64
    Points : 174
    Points
    174
    Par défaut
    Tu nous montres un exemple où z était une matrice 3x3, maintenant tu as une matrice 627*1401. Donc il suffit de remplacer les 3 par le nombre correct de colonnes et de lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A=[kron(x,ones(1,627))' repmat(y,1,1401)' z'];

  12. #12
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    ça fonctionne !

    Pas exactement avec ces valeurs, il faut juste inverser 627 et 1401 de façon à avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    A=[kron(x,ones(1,1401))' repmat(y,1,627)' z'];
    Je peux enfin avancer dans mon application, merci à tous, et en particulier à Paul-Ceria

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

Discussions similaires

  1. [Débutant] Créer une matrice à partir de deux vecteurs
    Par vampirella dans le forum MATLAB
    Réponses: 4
    Dernier message: 28/07/2010, 09h56
  2. création d'une matrice à partir d'un vecteur
    Par jena dans le forum Signal
    Réponses: 1
    Dernier message: 10/03/2009, 17h01
  3. Remplir une matrice à partir d'un vecteur (Suite)
    Par amarion dans le forum MATLAB
    Réponses: 5
    Dernier message: 17/03/2008, 08h23
  4. Remplir une matrice à partir d'un vecteur
    Par amarion dans le forum MATLAB
    Réponses: 2
    Dernier message: 10/03/2008, 12h17
  5. Réponses: 2
    Dernier message: 26/01/2007, 14h58

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