web-dev-qa-db-fra.com

Tables de hachage dans MATLAB

MATLAB prend-il en charge les tables de hachage?


Quelques antécédents

Je travaille sur un problème dans Matlab qui nécessite une représentation échelle-espace d'une image. Pour ce faire, je crée un filtre gaussien 2D avec variance sigma*s^k pour k dans une certaine plage., puis j'utilise chacun à son tour 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] = <image filtered with k-th guassian>

Cependant, k n'est pas nécessairement un entier, donc je ne peux pas faire ça. Ce que j'ai pensé faire était de garder un tableau de ks tel que:

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

Ce qui semble assez bon à première vue, sauf que je vais faire cette recherche potentiellement plusieurs 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 en faisant cela avec une table de hachage d'une sorte afin d'avoir 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 du tout 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, que ce soit le meilleure solution pour mon problème.

87
Nathan Fellman

Matlab ne prend pas en charge les tables de hachage. [~ # ~] modifier [~ # ~] Jusqu'à r2010a, c'est-à-dire; voir la réponse de @ Amro .

Pour accélérer vos recherches, vous pouvez supprimer le find et utiliser INDEXATION 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 eu une recherche être un goulot d'étranglement.


Pour accélérer votre problème spécifique, je vous suggère d'utiliser soit un filtrage incrémentiel

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é par ordre croissant, et GaussFilter calcule la taille du masque de filtre en fonction de la variance (et utilise, 2 filtres 1D, 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és uniformément (ce qu'ils ne sont probablement pas malheureusement).

14
Jonas

Pensez à utiliser la classe de carte de 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');
    
  • Attribuer:

    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
    
118
Amro

Les nouveaux conteneurs de Matlab R2008b (7.7). La classe Map est une version Matlab réduite de l'interface Java.util.Map . Il a 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 capacité depuis Matlab 7.10 (R2010a) à spécifier les types de données =.

Les implémentations sérieuses de Matlab nécessitant des cartes/dictionnaires de valeurs-clés doivent toujours utiliser les classes Map de Java ( Java.util.EnumMap , HashMap , TreeMap , - LinkedHashMap ou Hashtable ) pour accéder à leurs fonctionnalités plus importantes, sinon aux performances. Les versions de Matlab antérieures à R2008b n'ont en aucun cas de réelle alternative 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 des structures. Pour surmonter cela, convertissez les types (par exemple, en utilisant struct2cell ou par programme), ou créez un objet Java Java qui contiendra vos informations et stockez cet objet dans la collection Java.

Vous pouvez également être intéressé par une implémentation de Hashtable orientée objet (basée sur les classes) pure Matlab, qui est disponible sur l'échange de fichiers .

25
Yair Altman

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 il faudrait faire du profilage pour voir si cela vous donne un gain de vitesse je suppose ...

18
tauran

C'est un peu compliqué, 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 se résoudra de manière appropriée.

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

var = 'a';

display( dict.(var) ); % prints 1
12
Mark Elliot

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

1
Lei Zhang