Unterstützt MATLAB Hash-Tabellen?
Einige Hintergrundinformationen
Ich arbeite an einem Problem in Matlab, das eine Skalierungsraumdarstellung eines Bildes erfordert. Zu diesem Zweck erstelle ich einen 2-D-Gauß-Filter mit einer Varianz sigma*s^k
für k
einen bestimmten Bereich. Anschließend filtere ich das Bild nacheinander. Jetzt möchte ich eine Art Zuordnung k
zum gefilterten Bild.
Wenn k
immer eine ganze Zahl wäre, würde ich einfach ein 3D-Array erstellen, so dass:
arr[k] = <image filtered with k-th guassian>
Ist k
jedoch nicht unbedingt eine Ganzzahl, daher kann ich dies nicht tun. Ich dachte daran, eine Reihe von k
s so zu halten, dass:
arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian>
Was auf den ersten Blick ziemlich gut erscheint, außer dass ich diese Suche möglicherweise einige tausend Mal mit etwa 20 oder 30 Werten von durchführen werde k
, und ich befürchte, dass dies die Leistung beeinträchtigen wird.
Ich frage mich, ob es mir nicht besser wäre, dies mit einer Hash-Tabelle zu tun, damit ich eine Suchzeit habe, die O (1) anstelle von O (n) ist.
Jetzt weiß ich, dass ich nicht vorzeitig optimieren sollte, und ich habe dieses Problem möglicherweise überhaupt nicht, aber denken Sie daran, dies ist nur der Hintergrund, und es kann Fälle geben, in denen dies wirklich die beste Lösung ist, unabhängig davon, ob es die ist beste Lösung für mein Problem.
Die neuen Container.Map-Klasse von Matlab R2008b (7.7) ist eine verkleinerte Matlab-Version der Schnittstelle java.util.Map . Es bietet den zusätzlichen Vorteil einer nahtlosen Integration in alle Matlab-Typen ( Java Maps kann beispielsweise keine Matlab-Strukturen verarbeiten ) sowie die Möglichkeit seit Matlab 7.10 (R2010a) , Datentypen anzugeben .
Bei seriösen Matlab-Implementierungen, für die Karten / Wörterbücher mit Schlüsselwerten erforderlich sind, sollten weiterhin die Map-Klassen von Java ( java.util.EnumMap , HashMap , TreeMap , LinkedHashMap oder Hashtable ) verwendet werden, um Zugriff auf ihre größeren Funktionen zu erhalten, wenn nicht sogar die Leistung. Matlab-Versionen vor R2008b haben auf keinen Fall eine echte Alternative und müssen die Java-Klassen verwenden.
Eine mögliche Einschränkung bei der Verwendung von Java-Sammlungen besteht darin, dass sie nicht primitive Matlab-Typen wie Strukturen enthalten können. Um dies zu überwinden, konvertieren Sie entweder die Typen herunter (z. B. mithilfe von struct2cell oder programmgesteuert) oder erstellen Sie ein separates Java-Objekt, das Ihre Informationen enthält und dieses Objekt in der Java-Sammlung speichert.
Möglicherweise möchten Sie auch eine reine, objektorientierte (klassenbasierte) Hashtable-Implementierung von Matlab untersuchen, die im Dateiaustausch verfügbar ist .
quelle
Sie könnten Java dafür verwenden.
In Matlab:
Aber Sie müssten ein Profil erstellen, um zu sehen, ob Sie dadurch einen Geschwindigkeitsgewinn erzielen, denke ich ...
quelle
Es ist ein wenig schwierig, aber ich bin überrascht, dass niemand vorgeschlagen hat, Strukturen zu verwenden. Sie können über den Variablennamen auf jedes Strukturfeld zugreifen,
struct.(var)
wobei esvar
sich um eine beliebige Variable handeln kann, die entsprechend aufgelöst wird.quelle
dict.('2')
: mathworks.com/access/helpdesk/help/techdoc/matlab_prog/...dict.(['k',num2str(1)])
funktioniert,dict.(['k',num2str(1.1)])
schlägt jedoch fehl, und wenn die Werte Ganzzahlen sind, können Sie sie zum direkten Indizieren verwenden. Ansonsten ist es eine schöne Idee..
durch ein ersetzen_
.dict.(genvarname(['k',num2str(1.1)]))
Sie können auch den neuen Typ "Tabelle" nutzen. Sie können verschiedene Datentypen speichern und ganz einfach Statistiken daraus abrufen. Weitere Informationen finden Sie unter http://www.mathworks.com/help/matlab/tables.html .
quelle