93 votes

Tables de hachage dans MATLAB

Ne MATLAB ont aucune prise en charge pour les tables de hachage?


Certains d'arrière-plan

Je suis en train de travailler sur un problème dans Matlab qui nécessite une échelle de l'espace de représentation d'une image. Pour ce faire, j'ai créer un 2-D filtre Gaussien de la variance sigma*s^k pour k dans certains plage., puis-je utiliser chacun à tour de rôle de filtre de l'image. Maintenant, je veux une sorte de cartographie de l' k de l'image filtrée.

Si k étaient toujours un entier, je serais tout simplement créer un tableau 3D tels que:

arr[k] = <image filtered with k-th guassian>

Toutefois, k n'est pas nécessairement un nombre entier, donc je ne peux pas faire cela. Ce que j'ai pensé à faire était de garder un tableau de ks tels que:

arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian>

Ce qui semble assez bonne première pensée, sauf que je vais faire cette recherche peut-être quelques milliers de fois, avec environ 20 ou 30 valeurs de k, et j'ai peur que cela nuira à la performance.

Je me demande si je ne serais pas mieux servi le faire avec une table de hachage, de la sorte, pour que j'aie une recherche de temps O(1) au lieu de O(n).


Maintenant, je sais que je ne devrais pas optimiser prématurément, et je ne peut pas avoir ce problème, mais n'oubliez pas, c'est juste le fond, et il peut y avoir des cas où c'est vraiment la meilleure solution, indépendamment du fait que c'est la meilleure solution pour mon problème.

123voto

Amro Points 72743

Envisager l'utilisation de MATLAB à la carte de classe: les conteneurs.Carte. 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
    
  • Recherche:

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

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

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

    rainfallMap.remove('Total')
    
  • Inspecter:

    values = rainfallMap.values;
    keys = rainfallMap.keys;
    sz = rainfallMap.size;
    
  • Vérifiez la clé:

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

26voto

Yair Altman Points 4091

Matlab R2008b (7.7), s'de nouveaux conteneurs.La carte est une classe de taille réduite Matlab version de java.util.La carte d'interface. Il a l'avantage d'une intégration transparente avec tous Matlab types (Java Cartes ne peut pas gérer Matlab structures par exemple) ainsi que la possibilité depuis Matlab 7.10 (R2010a) pour spécifier les types de données.

Sérieux Matlab implémentations nécessitant clé-valeur des cartes/les dictionnaires doivent toujours utiliser Java Carte de classes (java.util.EnumMap, HashMap, TreeMap, LinkedHashMap ou table de hachage) pour avoir accès à leur plus grande fonctionnalité si pas la performance. Matlab versions antérieures à R2008b ont pas de véritable alternative en tout cas, et doit utiliser les classes Java.

Une limitation potentielle de l'utilisation de Java Collections est leur incapacité à contenir non primitif Matlab types tels que des structures. Pour surmonter cette difficulté, soit de convertir les types (p. ex., à l'aide de struct2cell ou par programmation), ou de la création d'un objet Java qui va contenir vos informations et de les stocker cet objet dans la Collection Java.

Vous pouvez aussi être intéressé à examiner un pur-Matlab orientée objet (classe) table de hachage de la mise en œuvre, qui est disponible sur le Fichier d'Échange.

19voto

tauran Points 2963

Vous pouvez utiliser Java pour cela.

Dans matlab:

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

Mais il faudrait faire du profilage pour voir si cela vous donne un gain de vitesse, je suppose ...

14voto

Jonas Points 54073

Matlab n'ont pas de soutien pour les tables de hachage. EDIT Jusqu'à ce que r2010a, c'est-à voir @Amro's réponse.

Pour accélérer votre look-ups, vous pouvez déposer l' find, et l'utilisation LOGIQUE d'INDEXATION.

arr{array_of_ks==k} = <image filtered with k-th Gaussian>

ou

arr(:,:,array_of_ks==k) = <image filtered with k-th Gaussian>

Cependant, dans toute mon expérience avec Matlab, j'ai jamais eu une recherche d'être un goulot d'étranglement.


Pour accélérer votre problème spécifique, je suggère d'utiliser des différentiels de filtrage

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

en supposant array_of_ks est triée dans l'ordre croissant, et GaussFilter calcule le masque du filtre de taille basée sur la variance (et les utilisations, 2 1D filtres, bien sûr), ou vous pouvez filtrer dans l'Espace de Fourier, ce qui est particulièrement utile pour les images de grande taille et si les écarts sont espacés de façon régulière (dont ils ne sont probablement pas malheureusement).

12voto

Mark Elliot Points 31871

C'est un peu clugey, mais je suis surpris que personne n'ait suggéré d'utiliser des structures. Vous pouvez accéder à n'importe quel champ struct 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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X