Hash-Tabellen in MATLAB
Macht MATLAB haben keinen support für die hash-Tabellen?
Einige hintergrund
Arbeite ich auf ein problem in Matlab, die erfordert, dass ein scale-space-Repräsentation eines Bildes. Dazu erstelle ich ein 2-D Gauß-filter mit Varianz sigma*s^k
für k
in einem bestimmten Bereich., und dann benutze ich jeweils in der turn-filter das Bild. Nun möchte ich eine Art mapping von k
zu dem gefilterten Bild.
Wenn k
waren immer ein integer, ich würde einfach erstellen ein 3D-array, so dass:
arr[k] = <image filtered with k-th guassian>
Jedoch k
ist nicht notwendigerweise eine ganze Zahl, so kann ich das nicht. Was ich dachte zu tun, war zu halten eine Reihe von k
s:
arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian>
Scheint ziemlich gut auf den ersten Gedanken, außer ich werde diese Suche möglicherweise ein paar tausend mal mit 20 oder 30 Werte des k
, und ich fürchte, dass dies die Leistung beeinträchtigen.
Frage ich mich, ob ich nicht besser bedient dies mit einer hash-Tabelle irgendwie so, dass ich ein lookup-Zeit von O(1) statt O(n).
Nun, ich weiß, dass ich nicht optimieren vorzeitig, und ich kann nicht dieses problem überhaupt, aber denken Sie daran, dies ist nur der hintergrund, und es kann Fälle geben, wo das wirklich die beste Lösung, unabhängig davon, ob es ist die beste Lösung für meine problem.
InformationsquelleAutor der Frage Nathan Fellman | 2010-08-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Matlab bietet keine Unterstützung für Hashtabellen. BEARBEITEN Bis r2010a, das ist; siehe @Amro's Antwort.
Beschleunigen Sie Ihren look-ups, drop können Sie die
find
, und verwenden Sie LOGISCHE INDIZIERUNG.oder
Jedoch in all meiner Erfahrung mit Matlab, hab ich nie hatte eine lookup einen Engpass.
Um die Geschwindigkeit Ihres spezifischen Problems, schlage ich vor, entweder für die Verwendung der inkrementellen Filterung
vorausgesetzt
array_of_ks
ist in aufsteigender Reihenfolge sortiert, und GaussFilter berechnet die filter-Maske Größe auf die Varianz (und verwendet, 2 1D-Filter natürlich), oder Sie können die filter im Fourier-Raum, was besonders nützlich für große Bilder und wenn die Abweichungen werden gleichmäßig verteilt (was Sie höchstwahrscheinlich nicht leider).InformationsquelleAutor der Antwort Jonas
Erwägen Sie die Verwendung von MATLAB ' s map-Klasse: Container.Anzeigen. Hier eine kurze übersicht:
Schöpfung:
Suche:
Zuordnen:
Hinzufügen:
Entfernen:
Überprüfen:
Check-Taste:
InformationsquelleAutor der Antwort Amro
Matlab R2008b (7.7)'s neue Container.Map-Klasse ist eine abgespeckte Matlab version des java.util.Anzeigen - Schnittstelle. Es hat den zusätzlichen Vorteil der nahtlosen integration mit allen Matlab-Typen (Java-Karten nicht in den Griff Matlab-structs zum Beispiel) sowie die Fähigkeit, da Matlab 7.10 (R2010a)geben Sie Datentypen.
Ernst Matlab-Implementierungen erfordern Schlüssel-Wert-Karten/Wörterbücher sollte immer noch Java-Map-Klassen (java.util.EnumMap, HashMap, TreeMap, LinkedHashMap oder Hashtable) für den Zugriff auf deren größere Funktionalität, wenn nicht die Leistung. Matlab-Versionen, die älter als R2008b haben keine echte alternative in jedem Fall muss der Java-Klassen.
Eine mögliche Einschränkung der Verwendung von Java-Collections ist Ihre Unfähigkeit, enthalten nicht-primitive Matlab-Typen wie structs. Um dies zu überwinden, entweder down-konvertieren-Typen (z.B. mit struct2cell oder programmgesteuert), oder erstellen Sie eine separate Java-Objekt, halten Sie Ihre Informationen und speichern Sie dieses Objekt in der Java-Collection.
Können Sie auch daran interessiert sein, zu prüfen, eine Reine Matlab-Objekt-orientierte (class-based) Hashtable-Implementierung, die verfügbar auf der Exchange-Datei.
InformationsquelleAutor der Antwort Yair Altman
Könnten Sie java.
In matlab:
Aber Sie würde tun, einige Profilerstellung, um zu sehen, ob es gibt Ihnen die Geschwindigkeit, gewinnen, Schätze ich...
InformationsquelleAutor der Antwort tauran
Es ist ein wenig clugey, aber ich bin überrascht, niemand hat vorgeschlagen, Strukturen. Sie können Zugriff auf struct-Feld durch die variable name als
struct.(var)
wovar
kann eine beliebige variable und wird ordnungsgemäß aufgelöst.InformationsquelleAutor der Antwort Mark Elliot
Können Sie auch die Vorteile des neuen Typs "Tabelle". Können Sie speichern verschiedene Arten von Daten und Statistiken aus es ist wirklich einfach.
Sehen http://www.mathworks.com/help/matlab/tables.html für mehr info.
InformationsquelleAutor der Antwort Lei Zhang