Tables de hachage dans MATLAB

MATLAB prend-il en charge les tables de hachage?


Un peu de fond

Je travaille sur un problème dans Matlab qui nécessite une représentation à l’échelle de l’espace d’une image. Pour ce faire, je crée un filtre gaussien à deux dimensions avec une variance sigma*s^k pour k dans une certaine plage, puis je les utilise à tour de rôle pour filtrer l’image. Maintenant, je veux une sorte de mappage de k à l’image filtrée.

Si k était toujours un entier, je créerais simplement un tableau 3D tel que:

 arr[k] =  

Cependant, k n’est pas nécessairement un entier, donc je ne peux pas le faire. Ce que je pensais faire, c’était garder un tableau de k tel que:

 arr[find(array_of_ks_ = k)] =  

Ce qui semble plutôt bien à première vue, sauf que je ferai cette recherche potentiellement quelques milliers de fois avec environ 20 ou 30 valeurs de k , et je crains que cela nuise aux performances.

Je me demande si je ne serais pas mieux servi avec une table de hachage pour avoir un temps de recherche égal à O (1) au lieu de O (n).


Maintenant, je sais que je ne devrais pas optimiser prématurément, et je n’ai peut-être pas ce problème, mais rappelez-vous, ce n’est que le contexte, et il peut y avoir des cas où c’est vraiment la meilleure solution. meilleure solution pour mon problème.

    Matlab ne prend pas en charge les hashtables. EDIT Jusqu’à r2010a, c’est-à-dire; voir la réponse de @Amro .

    Pour accélérer vos recherches, vous pouvez supprimer la find et utiliser LOGICAL INDEXING .

     arr{array_of_ks==k} =  

    ou

     arr(:,:,array_of_ks==k) =  

    Cependant, dans toute mon expérience avec Matlab, je n’ai jamais fait de recherche sur un goulot d’étranglement.


    Pour accélérer votre problème spécifique, je suggère soit d’utiliser le filtrage incrémental

     arr{i} = GaussFilter(arr{i-1},sigma*s^(array_of_ks(i)) - sigma*s^(array_of_ks(i-1))) 

    en supposant que array_of_ks est sortingé par ordre croissant, et GaussFilter calcule la taille du masque de filtrage en fonction de la variance (et des utilisations, 2 filtres 1D, bien sûr), ou filtre dans l’espace de Fourier, particulièrement utile pour les grandes images sont espacées régulièrement (ce qui n’est probablement pas le cas malheureusement).

    Envisagez d’utiliser la classe de carte MATLAB: containers.Map . Voici un bref aperçu:

    • Création:

       >> keys = {'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', ... 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'Annual'}; >> values = {327.2, 368.2, 197.6, 178.4, 100.0, 69.9, ... 32.3, 37.3, 19.0, 37.0, 73.2, 110.9, 1551.0}; >> rainfallMap = containers.Map(keys, values) rainfallMap = containers.Map handle Package: containers Properties: Count: 13 KeyType: 'char' ValueType: 'double' Methods, Events, Superclasses 
    • Chercher:

       x = rainfallMap('Jan'); 
    • Atsortingbuer:

       rainfallMap('Jan') = 0; 
    • Ajouter:

       rainfallMap('Total') = 999; 
    • Retirer:

       rainfallMap.remove('Total') 
    • Inspecter:

       values = rainfallMap.values; keys = rainfallMap.keys; sz = rainfallMap.size; 
    • Clé de vérification:

       if rainfallMap.isKey('Today') ... end 

    La nouvelle classe containers.Map de Matlab R2008b (7.7) est une version Matlab réduite de l’interface java.util.Map . Il présente l’avantage supplémentaire d’une intégration transparente avec tous les types de Matlab ( Java Maps ne peut pas gérer les structures Matlab par exemple), ainsi que la possibilité, depuis Matlab 7.10 (R2010a), de spécifier des types de données .

    Les mises en œuvre sérieuses de Matlab nécessitant des cartes / dictionnaires de valeur-clé doivent toujours utiliser les classes Map de Java ( java.util.EnumMap , HashMap , TreeMap , LinkedHashMap ou Hashtable ) pour accéder à leurs fonctionnalités plus importantes, voire aux performances. Les versions de Matlab antérieures à R2008b n’ont aucune alternative réelle et doivent utiliser les classes Java.

    Une limitation potentielle de l’utilisation de Java Collections est leur incapacité à contenir des types Matlab non primitifs tels que les structures. Pour remédier à cela, convertissez les types (par exemple, en utilisant struct2cell ou par programme) en bas, ou créez un object Java distinct qui contiendra vos informations et stockera cet object dans la collection Java.

    Vous pouvez également être intéressé par une implémentation de Hashtable orientée object (basée sur une classe) pure-Matlab, disponible sur Exchange .

    Vous pouvez utiliser java pour cela.

    En matlab:

     dict = java.util.Hashtable; dict.put('a', 1); dict.put('b', 2); dict.put('c', 3); dict.get('b') 

    Mais vous devriez faire du profilage pour voir si cela vous donne un gain de vitesse, je suppose …

    C’est un peu énorme, mais je suis surpris que personne n’ait suggéré d’utiliser des structures. Vous pouvez accéder à n’importe quel champ de structure par nom de variable en tant que struct.(var)var peut être n’importe quelle variable et sera résolu de manière appropriée.

     dict.a = 1; dict.b = 2; var = 'a'; display( dict.(var) ); % prints 1 

    Vous pouvez également profiter du nouveau type “Table”. Vous pouvez stocker différents types de données et en extraire des statistiques très facilement. Voir http://www.mathworks.com/help/matlab/tables.html pour plus d’informations.