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.
Je dispose d'un tableau u_ix d'index dans C :
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 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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part u_ix = [1 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 :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
Code : Sélectionner tout - Visualiser dans une fenêtre à part sz=sum(cellfun(@(x)size(x.data, 1), C(u_ix))) ;
---------------------------------------------------------------------------------
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.
Partager