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 :

Remplir une matrice à partir d'un vecteur (Suite)


Sujet :

MATLAB

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 82
    Points : 63
    Points
    63
    Par défaut Remplir une matrice à partir d'un vecteur (Suite)
    Bonjour à tous,
    Je reviens sur la discussion que j'avais lancé en début de semaine (10/03) pour remplir une matrice à parti d'un vecteur.
    J'ai un vecteur pos de Nd (nombre de diffuseurs) lignes et 2 colonnes (coordonnées x et y). Les diffuseurs ont des coordonnées sur une grille entre [0 Tx] et [0 Ty].
    L'idée était de créer une matrice posit contenant comme valeur le nombre de diffuseurs pour chaque noeud.

    La solution suivante faisant bien ce qui est souhaité.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    pos = round(2*rand(8,2)+1)
    [upos,A,B] = unique(pos,'rows');
    nB = histc(B,unique(B));
    [x,y] = meshgrid(1:max(pos(:,1)),1:max(pos(:,2)));
    posit = zeros(size(x)).';
    idx = sub2ind(size(posit),upos(:,1),upos(:,2));
    posit(idx) = nB
    Néanmoins, je souhaite à présent que chaque diffuseur à une position (x,y) donnée ait un poids distribué gaussien avec randn. La matrice de sortie posit devra prendre en compte ces poids.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    pos = 
    [1 1
     3 2
     2 3]
    le diffuseur de coordonnées (1,1) aura comme poids 0.3, (3,2) 0.5 et (2,3) 0.7.

    Posit ressemblera donc à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [0.3 0.0 0.0
     0.0 0.0 0.7
     0.0 0.5 0.0]
    au lieu de:
    comme avant.

    S'il y a plusieurs diffuseurs par noeud, on additionnera les poids.

    J'ai bien pensé à faire un find sur chaque coordonnées puis sommer les poids d'indice correspondant mais je ne suis pas sûr que ce soit optimum.

    Merci d'avance,
    Adrien

  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 884
    Points
    52 884
    Par défaut
    Essaie quelque chose comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    pos = [1 1
           3 2
           2 3]
    
    poids = [0.3
             0.5
             0.7]
       
    [upos,A,B] = unique(pos,'rows');
    nB = histc(B,unique(B));
    [x,y] = meshgrid(1:max(pos(:,1)),1:max(pos(:,2)));
    posit = zeros(size(x)).';
    idx = sub2ind(size(posit),upos(:,1),upos(:,2));
    posit(idx) = poids(A)
    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 du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 82
    Points : 63
    Points
    63
    Par défaut Contrainte d'addition des poids
    On ne peut pas respecter la contrainte d'addition des poids de tous les diffuseurs placés sur le noeud en faisant ainsi.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 82
    Points : 63
    Points
    63
    Par défaut Mieux que ça
    Quelqu'un a-t-il mieux que ça?

    [l,c]=(find(posit~=0));
    for p=1:length(l),
    posit(l(p),c(p))=sum(Amp(find((posbis(:,1)==c(p))&(posbis(:,2)==l(p)))));
    end

    la boucle est mauvaise ...

  5. #5
    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 884
    Points
    52 884
    Par défaut
    Comme ceci alors ?

    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
    pos = [1 1
           3 2
           1 1
           1 1
           3 2
           2 3]
     
    poids = [0.1
             0.2
             0.1
             0.1
             0.3
             0.7]
     
    [upos,A,B] = unique(pos,'rows');
    nB = histc(B,unique(B));
    [x,y] = meshgrid(1:max(pos(:,1)),1:max(pos(:,2)));
    posit = zeros(size(x)).';
    idx = sub2ind(size(posit),upos(:,1),upos(:,2));
     
    nA = numel(A);
    %p=zeros(nA,1);
    for n=1:nA
       p(n)=sum(poids(B==n)); 
    end
     
    posit(idx) = p
    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)

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 82
    Points : 63
    Points
    63
    Par défaut Boucle indispensable...
    Merci.
    Je voulais absolument éviter une boucle codée en Matlab.
    Tant pis, j'arrive tout de même à mes fins.
    Adrien

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

Discussions similaires

  1. [XL-2010] Remplir une matrice à partir de formulaires complétés
    Par soeasytraining dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/09/2013, 18h40
  2. Réponses: 3
    Dernier message: 30/10/2012, 18h48
  3. [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
  4. création d'une matrice à partir d'un vecteur
    Par jena dans le forum Signal
    Réponses: 1
    Dernier message: 10/03/2009, 17h01
  5. Remplir une matrice à partir d'un vecteur
    Par amarion dans le forum MATLAB
    Réponses: 2
    Dernier message: 10/03/2008, 12h17

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