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 :

accès aux champs des structures contenues dans un tableau de cellules


Sujet :

MATLAB

  1. #1
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut accès aux champs des structures contenues dans un tableau de cellules
    Bonjour,

    rien que le titre du post me fait peur
    J'explique donc doucement :
    J'ai un tableau de cellules C de taille (50000, 1).
    Chaque cellule est soit vide, soit contient un structure, toujours la même. Pour simplifier, disons que la structure a un seul champ, nommé data.
    Le code ci-dessous construnt une version simplifiée qui permet de poser ma question.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    C=cell(10,1) ;
    a1.data = 1 ;
    a2.data = 1:2 ;
    a3.data = 1:3 ;
    a4.data = 1:4 ;
    a5.data = 1:5 ;
    C{1} = a1 ;
    C{3} = a2 ;
    C{5} = a3 ;
    C{7} = a4 ;
    C{9} = a5 ;
    Je dispose d'un tableau u_ix d'index dans C :
    Je veux connaitre la somme du nombre d'éléments des champs data contenus dans les mailles d'index u_ix. Dans l'exemple : 1 + 3 + 5 = 9.

    Question 1 : Est-il possible d'obtenir cette somme sans itérer dans C avec une boucle for ?

    Question 2 : si oui, est-ce que cette méthode va créer une nouvelle instance (même temporaire, même cachée) de tout ou partie du tableau C ? c'est important à savoir car les champs data sont nombreux et gros (typiquement : 50000 cellules, chacune ayant un tableau de 20000 x 5 double dans le champ data. Le tableau u_ix peut contenir quelques milliers d'index.

    J'ai essayé des trucs du style ci-dessous mais ça ne lui plait pas du tout. Aparemment, cellfun ne peut pas accéder directement aux champs de la structure contenue dans la cellule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sz=sum(cellfun(@(x)size(x.data, 1), C(u_ix))) ;
    Merci de votre passage. En attendant vos idées, je vais retenir ma respiration le temps d'écrire une grosse boucle for - next qui sent bien mauvais

    ---------------------------------------------------------------------------------
    La suite du post est inutile à la compréhensionde la question. C'est juste une explication pour satisfaire votre légitime curiosité.
    Cette structure de donnée un peu compliquée correspond au problème suivant (c'est de la photogrammétrie) :
    J'ai 1600 photos de 12 Mpx, prises par un appareil photo suspendu à un cerf-volant. Elles se recoupent assez largement les unes les autres (pour permettre les calculs 3D).
    Il y a donc, en tout, 200000 paires d'images qui ont une partie commune (= au moins un petit bout de la scène est vu par les deux images).
    Pour deux images qui ont une partie commune, l'algorithme SIFT trouve (et apparie automatiquement) de 10 à 10000 points communs aux deux images. Ces points servent, en gros, à positionner chaque image dans la grande mosaïque qui représente l'ensemble de la scène.
    Et ces points sont trop nombreux !!! Leur excès alourdit les calculs et sature la mémoire sans apporter de supplément de précision.
    J'ai donc écrit un algo relativement véloce qui me permet de sélectionner les 100 meilleurs points par paire d'image, et de ne garder que ceux-ci pour la suite des calculs. Problème 1 : le temps de chargement des fichiers en mémoire est non négligeable dans le temps total (il y a plusieurs centaines de fichier à charger pour traiter une seule paire d'image, sur 200000). Problème 2 : tous les fichiers ne tiennent pas ensemble en mémoire. Solution : j'ai créé cette fameuse structure C qui garde en mémoire les fichiers déjà chargés pour ne pas avoir à les charger des centaines de fois. Le contenu du fichier est dans le fameux champ data, accompagné de métadonnées (le nom des images concernées, etc.). Un système d'index (le fameux u_ix) me permet de retrouver où, dans C, se trouve un fichier qui m'intéresse. voili voilou.
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

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

    Pauvres boucles for malmenées en ce moment
    Selon ton exemple, c'est la deuxième dimension qu'il faut regarder, l'opérateur colon produisant des vecteurs lignes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sz=sum(cellfun(@(x)size(x.data, 2), C(u_ix))) ;
    Sinon cela me semble la solution optimale, qui ne te coutera pas de copie de tes grosses données

  3. #3
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Bonjour,

    Pauvres boucles for malmenées en ce moment
    Selon ton exemple, c'est la deuxième dimension qu'il faut regarder, l'opérateur colon produisant des vecteurs lignes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sz=sum(cellfun(@(x)size(x.data, 2), C(u_ix))) ;
    Sinon cela me semble la solution optimale, qui ne te coutera pas de copie de tes grosses données
    Merci de ta réponse.
    C'est bizare. Ca ne marchait pas (avec le 1 ou le 2). Je me faisais insulter.
    Il faut que je regarde le vrai code plus en détail....
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

  4. #4
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    Bizarrement, ce sur quoi tu travailles me rappelle étrangement PTAM... si cela peut t'être utile, tu peux peut-être t'en inspirer pour tes travaux.
    Je ne réponds pas aux MP techniques. Le forum est là pour ça.
    La raison est simple : il est ennuyeux de répondre à une seule personne, alors que la réponse peut servir à tout le monde.
    Conclusion : n'hésitez pas à utiliser le forum pour poser vos questions.
    Matlab 2005 - ver.7.1.0.183 (R14) Service Pack 3

  5. #5
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tachmou Voir le message
    Bizarrement, ce sur quoi tu travailles me rappelle étrangement PTAM... si cela peut t'être utile, tu peux peut-être t'en inspirer pour tes travaux.
    En effet, il y a certaines convergences entre la vision artificielle et la photogrammétrie. J'aurais tendance à dire que les grandes avancées sont venues de la vision artificielle, dont la communauté scientifique a une masse critique élevée. Les photogrammétriciens ont utilisé ces avancées algorithmiques pour leurs propres besoins, qui sont quand même distincts.

    En ce moment, j'utilise le logiciel de l'IGN, qui est sous licence libre. www.micmac.ign.fr. Je ne suis pas photogramétricien. Je développe du code matlab autour de ce logiciel pour l'adapter à mes besoins (les gros chantiers aériens très basse altitude).
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/06/2014, 06h43
  2. Réponses: 3
    Dernier message: 26/10/2010, 22h14
  3. Réponses: 4
    Dernier message: 10/07/2007, 09h36
  4. Manipulation des valeurs contenues dans un tableau
    Par khasanouray dans le forum Langage
    Réponses: 3
    Dernier message: 29/05/2007, 20h36
  5. [TP] Afficher des chaînes contenues dans un tableau
    Par mah00 dans le forum Turbo Pascal
    Réponses: 8
    Dernier message: 20/05/2007, 09h15

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