Les tables de hachage dans MATLAB

est-ce que MATLAB a un support pour les tables de hachage?


de fond

je travaille sur un problème dans Matlab qui nécessite une représentation d'une image à l'échelle spatiale. Pour ce faire, je crée un filtre gaussien 2-D avec variance sigma*s^k pour k dans une certaine gamme., et puis j'utilise chacun à tour de rôle pour filtrer l'image. Maintenant, je veux une sorte de mapping de k à l'image filtrée.

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

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

cependant, k n'est pas nécessairement un entier, donc je ne peux pas le faire. Ce que je pensais faire était de garder un tableau de k s tels que:

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

qui semble assez bon à première vue, sauf que je vais faire cette recherche potentiellement quelques milliers de fois avec environ 20 ou 30 valeurs de k , et je crains que cela nuise à la performance.

je me demande si Je ne serais pas mieux servi en faisant cela avec une table de hachage de sorte que j'aurais un temps de recherche qui est 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 du tout, mais rappelez-vous, c'est juste l'arrière-plan, et il peut y avoir des cas où c'est vraiment la meilleure solution, est la meilleure solution pour mon "problème 1519290920".

84
demandé sur Matthew Simoneau 2010-08-28 22:32:04

6 réponses

Matlab ne supporte pas les hashtables. éditer Jusqu'à r2010a, c'est-à-dire; voir @Amro réponse de".

pour accélérer vos recherches, Vous pouvez laisser tomber le find , et utiliser indexage logique .

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 avait une recherche être un étranglement.


pour accélérer votre problème spécifique, je suggère d'utiliser l'un ou l'autre 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 trié dans l'ordre croissant, et GaussFilter calcule la taille du masque de filtre basé sur la variance( et utilise, 21 filtres end, bien sûr), ou vous pouvez filtrer dans L'espace de Fourier, ce qui est particulièrement utile pour les grandes images et si les variances sont espacées de façon uniforme (ce qui ils plus probablement ne sont pas malheureusement).

14
répondu Jonas 2017-05-23 12:25:55

envisager d'utiliser les conteneurs de la classe cartographique de MATLAB: .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');
    
  • Affect:

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

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

    rainfallMap.remove('Total')
    
  • inspecter:

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

    if rainfallMap.isKey('Today')
        ...
    end
    
117
répondu Amro 2012-12-19 06:50:19

Matlab R2008b (7.7), s’de nouveaux conteneurs.Map class est une version Matlab réduite du java .util.Carte interface. Il présente l'avantage supplémentaire d'une intégration transparente avec tous les types de Matlab ( les cartes Java ne peuvent pas gérer les structures Matlab par exemple) ainsi que la possibilité depuis Matlab 7.10 (R2010a) de spécifier les types de données .

Sérieux Matlab implémentations nécessitant clé-valeur des cartes/dictionnaires devrait toujours utiliser les classes de cartes de Java ( java.util.EnumMap , HashMap , TreeMap , LinkedHashMap ou Hashtable ) pour accéder à leur fonctionnalité plus grande si ce n'est la performance. Les versions Matlab antérieures à R2008b n'ont pas d'alternative réelle et doivent utiliser les classes Java.

une limitation potentielle de L'utilisation des Collections Java est leur incapacité à contenir des types de Matlab non primitifs tels que des structures. Pour surmonter cette difficulté, convertissez les types (par exemple, en utilisant struct2cell ou programmatiquement), ou créez un objet Java séparé qui conservera vos informations et stockera cet objet dans la collection Java.

vous pourriez également être intéressé à examiner une implémentation Hashtable orientée objet (basée sur la classe) pur-Matlab, qui est disponible sur L'échange de fichiers .

24
répondu Yair Altman 2017-05-23 12:17:50

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 un peu de profilage pour voir si ça vous donne un gain de vitesse je suppose...

18
répondu tauran 2010-08-28 19:01:01

c'est un petit 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 comme struct.(var)var peut être n'importe quelle variable et résoudra de manière appropriée.

dict.a = 1;
dict.b = 2;

var = 'a';

display( dict.(var) ); % prints 1
11
répondu Mark Elliot 2010-08-28 19:28:50

vous pouvez également profiter du nouveau type"Table". Vous pouvez stocker différents types de données et d'obtenir des statistiques très facile. Voir http://www.mathworks.com/help/matlab/tables.html pour plus d'information.

1
répondu Lei Zhang 2014-11-13 21:21:38