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 :

Calculer la surface occupée par un nuage de point


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 53
    Points : 38
    Points
    38
    Par défaut Calculer la surface occupée par un nuage de point
    Bonjour,

    J'ai 2 petites questions.
    La première:
    J'ai un bout de code dont je me demandais si y avait pas moyen d'optimiser, le voici, dites moi ce que vous en pensez.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    l=size(matr);
    a=[0 0 0]; 
     
    for i=1:l(1)
        for j=1:l(2)
                if matr(i,j)~=0
                    a=[a; i j ];
                end
        end
    end
    a=a(2:length(a),:);
    La seconde:
    J'aimerai calculer la surface occupé par mon nuage de point formé par les ligne de a (cette surface n'est pas proportionnel à la taille de a car la répartition des points n'est pas homogène). Existe t-il une fonction matlab qui fait ca ?

    Merci d'avance

  2. #2
    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 828
    Points
    14 828
    Par défaut
    1ère question :
    note : ton code est faux il généère une erreur car tu concatènes un vecteur de longueur 3 avec des vecteurs de longueur 2.

    Objetcif : récupérer les indices i,j tels que mat(i,j) différent de 0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [idl,idc]=find(matr~=0);
    a=[idl,idc];
    Ceci dit quel est l'intérêt car il est souvent inutile de passer par ces indices et de préférer l'indexage logique.

    2ème question :
    Je sais pas.
    Avant de se demander s'il existe une fonction MATLAB toute faite : existe-t-il un algorithme pour faire cela, un calcul ?

  3. #3
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    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 316
    Points : 52 948
    Points
    52 948
    Par défaut
    Il faudrait que tu nous montres le nuages de points et le polygone représentant les bord de la surface à calculer... pour préciser un peu plus ce que tu entends par "surface occupé par mon nuage de point"

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 53
    Points : 38
    Points
    38
    Par défaut
    Bon je pense qu'il va falloir que j'explique tout:

    J'ai un volume représenté par des valeurs dans un matrice 3d (matr), je dois trouver l'angle de rotation du volume qui minimise la surface de la projection de ce volume sur le plan 0xy.

    Voici mon programe:

    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
    l=size(matr);
    a=[0 0 0]; %initialisation
     
    for i=1:l(1)
        for j=1:l(2)
            for k=1:l(3)
                if matr(i,j,k)~=0
                    a=[a; i j k];
                end
            end
        end
    end
    a=a(2:length(a),:);  %on vire le premier vecteur qui a servi a initialiser a
    a=transpose(a);      % "a" contient les coordonées de mon volume
     
     
    for alpha=0:pi/2:2*pi
                rot=rotx(alpha);   % rotx fabrique ma matrice de rotation
                b=rot*a;             
                b=b(1:2,:);         % je supprime les coordonées en z
                figure
                plot(b(1,:),b(2,:),'x')
     
                % il faudrait maintenant que je puisse calculer la surface occupé
                % par ces points (b), pour trouver le alpha qui va bien
    end
    EDIT: j'ai trouvé comment calculé cette surface:
    j'ai fait un changement de repere des coordonnée dans b pour quel ne soit que positif puis je les ai arrondi pour quelles soient entiere , puis j'ai pris une matrice de 0 assez grande et mis des "1" au coordonnée . Enfin je n'ai plus qu'a compter mon nombre de 1. Je sais pas si c'est tres clair, si ca interesse quelqun je peux donner le code.
    Il reste néamoin une questions:


    par contre caro-line
    je comprend pas, j'ai remplacé le début de mon code par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [idl,idc,idcf]=find(matr~=0);
    a=[idl,idc,idcf];
    a=transpose(a);
    mais je n'obtient pas le même résultat, j'aimerai pouvoir quand même l'utiliser parcque c'est nettement plus rapide.

  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 316
    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 316
    Points : 52 948
    Points
    52 948
    Par défaut
    Citation Envoyé par PaM... Voir le message
    mais je n'obtient pas le même résultat, j'aimerai pouvoir quand même l'utiliser parcque c'est nettement plus rapide.
    Simplement parce que FIND ne fonctionne pas en 3D. La 3ème valeur retournée (ici idcf) ne correspond aux indices selon la 3ème dimension de matr mais :
    Citation Envoyé par documentation
    [row,col,v] = find(X, ...) returns a column or row vector v of the nonzero entries in X
    Voir les exemples de la documentation pour plus d'informations

    Il faut faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    idx = find(matr~=0);
    [idl,idc,idcf]=ind2sub(size(matr),idx);
    a=[idl,idc,idcf];
    a=transpose(a);
    Ce qui se simplifie grandement en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    idx = find(matr~=0);
    % Si a existe déjà, faire a = []; avant la ligne suivante
    [a(1,:),a(2,:),a(3,:)] = ind2sub(size(matr),idx);
    Les valeurs sont les même mais n'apparaissent pas de le même ordre qu'avec la boucle FOR-END. Pour preuve :
    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
    %% METHODE 1
    l=size(matr);
    a=[0 0 0]; %initialisation
     
    for i=1:l(1)
        for j=1:l(2)
            for k=1:l(3)
                if matr(i,j,k)~=0
                    a=[a; i j k];
                end
            end
        end
    end
    a=a(2:length(a),:);  %on vire le premier vecteur qui a servi a initialiser a
    a=transpose(a);      % "a" contient les coordonées de mon volume
     
    %% METHODE 2
    idx = find(matr~=0);
    [b(1,:),b(2,:),b(3,:)] = ind2sub(size(matr),idx);
     
    %% VERIFICATION
    a = sortrows(a.');
    b = sortrows(b.');
    all(a(:)==b(:))

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    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 316
    Points : 52 948
    Points
    52 948
    Par défaut
    Pour ton problème de calcul de surface, es-tu sûr de la méthode choisie ?

    Dans le cas contraire, et si tu veux d'autres avis, je te conseille de pauser une question sur le choix de la méthode ici : Algorithmes > Mathématiques (en donnant le lien de cette discussion )

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 53
    Points : 38
    Points
    38
    Par défaut
    Merci pour cette réponse

    J'ai testé et ton code marche pour une matrice de test de 3*2*2, mais des que je passe avec mes données (matrice de 512*512*128), j'obtiens ce message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ???  In an assignment A(matrix,:) = B, the number of elements in the subscript of A and
    the number of rows in B must be the same.
    Apparement la fonction ind2sub(size(matr),find(matr~=0)) retourne le même résultat que find(matr~=0).
    Je comprend pas ...

    Et pour le calcul de la surface ca à l'air de fonctionner pour les premières données que j'ai passé, tant que je rencontre pas d'erreur je creuse pas plus

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    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 316
    Points : 52 948
    Points
    52 948
    Par défaut
    Citation Envoyé par Dut Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    idx = find(matr~=0);
    % Si a existe déjà, faire a = []; avant la ligne suivante
    [a(1,:),a(2,:),a(3,:)] = ind2sub(size(matr),idx);

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 53
    Points : 38
    Points
    38
    Par défaut
    Non j'ai essayé c'est pas ca


    m'enfin c'est pas trop grave c'est du détail
    comment on fait pour mettre le tag résolu ?

  10. #10
    Membre actif
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Points : 213
    Points
    213
    Par défaut
    Citation Envoyé par PaM... Voir le message
    comment on fait pour mettre le tag résolu ?
    En bas de cette page, il y a au centre un bouton "Résolu"

Discussions similaires

  1. Intégrer le volume défini par un nuage de points
    Par ewaca dans le forum Mathématiques
    Réponses: 4
    Dernier message: 10/12/2014, 14h47
  2. Réponses: 4
    Dernier message: 10/12/2011, 19h48
  3. Equation de surface à partir d'un nuage de points
    Par lybhur dans le forum MATLAB
    Réponses: 10
    Dernier message: 24/09/2009, 10h01
  4. courbe 2d par un nuage de points
    Par Medoou dans le forum Mathématiques
    Réponses: 18
    Dernier message: 24/07/2009, 11h10
  5. Surface générée par un nuage de points
    Par pizzsto dans le forum MATLAB
    Réponses: 7
    Dernier message: 29/01/2008, 11h51

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