MATLAB prend-il en charge les tables de hachage?
Un peu de contexte
Je travaille sur un problème dans Matlab qui nécessite une représentation échelle-espace d'une image. Pour ce faire , créer un filtre gaussien 2-D avec une variance sigma*s^k
pour une k
certaine plage., Puis - je utiliser chacun à son tour pour filtrer l'image. Maintenant, je veux une sorte de mappage de k
l'image filtrée.
Si k
c'était toujours un entier, je créerais simplement un tableau 3D tel que:
arr[k] = <image filtered with k-th guassian>
Cependant, ce k
n'est pas nécessairement un entier, donc je ne peux pas faire cela. Ce que j'ai pensé à faire était de garder un tableau de k
s tels que:
arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian>
Ce qui semble plutôt 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 de faire 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 du tout ce problème, mais rappelez-vous, ce n'est que l'arrière-plan, et il peut y avoir des cas où c'est vraiment la meilleure solution, que ce soit ou non le meilleure solution pour mon problème.
La nouvelle classe containers.Map de Matlab R2008b (7.7) est une version réduite de Matlab de l' interface java.util.Map . Il a l'avantage supplémentaire d'une intégration transparente avec tous les types Matlab ( Java Maps ne peut pas gérer les structures Matlab par exemple) ainsi que la capacité depuis Matlab 7.10 (R2010a) de spécifier des types de données .
Les implémentations sérieuses de Matlab nécessitant des mappages / dictionnaires clé-valeur doivent toujours utiliser les classes Map de Java ( java.util.EnumMap , HashMap , TreeMap , LinkedHashMap ou Hashtable ) pour accéder à leurs fonctionnalités plus larges si ce n'est les performances. Les versions de Matlab antérieures à R2008b n'ont en aucun cas 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 Matlab non primitifs tels que les structs. Pour surmonter cela, convertissez les types à la baisse (par exemple, en utilisant struct2cell ou par programme), ou créez un objet Java distinct qui contiendra vos informations et stockera 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 File Exchange .
la source
Vous pouvez utiliser java pour cela.
Dans matlab:
Mais il faudrait faire un profilage pour voir si cela vous donne un gain de vitesse je suppose ...
la source
C'est un peu cluge, 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)
oùvar
peut être n'importe quelle variable et résoudra de manière appropriée.la source
dict.('2')
:: mathworks.com/access/helpdesk/help/techdoc/matlab_prog/…dict.(['k',num2str(1)])
fonctionne, maisdict.(['k',num2str(1.1)])
échoue, et si les valeurs sont des entiers, vous pouvez les utiliser pour indexer directement. C'est une bonne idée autrement..
par un_
.dict.(genvarname(['k',num2str(1.1)]))
Vous pouvez également profiter du nouveau type "Table". Vous pouvez stocker différents types de données et en tirer des statistiques très facilement. Voir http://www.mathworks.com/help/matlab/tables.html pour plus d'informations.
la source