Tabele Hash w MATLAB
Czy MATLAB ma wsparcie dla tabel hash?
Jakieś tło
Pracuję nad problemem w Matlab, który wymaga reprezentacji skali-przestrzeni obrazu. W tym celu tworzę 2-D Filtr Gaussa z wariancją sigma*s^k
dla k
w pewnym zakresie., a następnie używam każdego z nich po kolei do filtrowania obrazu. Chcę odwzorowania z k
na przefiltrowany obraz.
Gdyby k
były zawsze liczbą całkowitą, po prostu stworzyłbym tablicę 3D taką że:
arr[k] = <image filtered with k-th guassian>
Jednak k
niekoniecznie jest liczbą całkowitą, więc nie mogę tego zrobić. To, co chciałem zrobić, to trzymać tablicę k
takich, że:
arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian>
Co wydaje się całkiem dobre na pierwszy rzut oka, tyle że będę robił to wyszukiwanie potencjalnie kilka tysięcy razy z około 20 lub 30 wartościami k
, i obawiam się, że to zaszkodzi wydajności.
Zastanawiam się, czy nie byłoby lepiej, robiąc to z tabelą hash jakiegoś rodzaju, aby mieć czas wyszukiwania to jest O (1) zamiast O (n).
Teraz wiem, że nie powinienem przedwcześnie optymalizować i może nie mam tego problemu w ogóle, ale pamiętaj, że to tylko tło i mogą być przypadki, w których jest to naprawdę najlepsze rozwiązanie, niezależnie od tego, czy jest to najlepsze rozwiązanie dla mojego {27]} problemu.
6 answers
Matlab nie obsługuje hashtabli. edytuj do r2010a, czyli; zobacz @ AMRO's Odpowiedz.
Aby przyspieszyć wyszukiwanie, możesz porzucić find
i użyć logicznego indeksowania .
arr{array_of_ks==k} = <image filtered with k-th Gaussian>
Lub
arr(:,:,array_of_ks==k) = <image filtered with k-th Gaussian>
Jednak, w całym moim doświadczeniu z Matlabem, nigdy nigdy nie miałem dostępu do wąskiego gardła.
Aby przyspieszyć twój konkretny problem, proponuję użyć filtrowania przyrostowego
arr{i} = GaussFilter(arr{i-1},sigma*s^(array_of_ks(i)) - sigma*s^(array_of_ks(i-1)))
Zakładając, że array_of_ks
jest sortowane w porządku rosnącym, a GaussFilter oblicza rozmiar maski filtra na podstawie wariancji (i używa, 2 filtry 1D, oczywiście), lub można filtrować w przestrzeni Fouriera, co jest szczególnie przydatne dla dużych obrazów i jeśli wariancji są rozmieszczone równomiernie(co najprawdopodobniej nie są niestety).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:55
Rozważ użycie klasy map MATLAB: containers.Mapa . Oto krótki przegląd:
-
Tworzenie:
>> 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
-
Lookup:
x = rainfallMap('Jan');
-
Przypisać:
rainfallMap('Jan') = 0;
-
Dodaj:
rainfallMap('Total') = 999;
-
Usunąć:
rainfallMap.remove('Total')
-
values = rainfallMap.values; keys = rainfallMap.keys; sz = rainfallMap.size;
-
Klucz czekowy:
if rainfallMap.isKey('Today') ... end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-19 06:50:19
Nowe pojemniki Matlab R2008b (7.7)Klasa Map jest skalowaną wersją Javy z Matlab.util.Map interfejs. Ma dodatkową zaletę płynnej integracji ze wszystkimi typami Matlab (mapy Java nie mogą obsługiwać struktur Matlab na przykład), a także możliwość od Matlab 7.10 (R2010a) do określania typów danych.
Poważne implementacje Matlab wymagające map/słowników wartości klucza powinny nadal używać klas Map Javy ( java.util.EnumMap , HashMap, TreeMap, LinkedHashMap lub Hashtable), aby uzyskać dostęp do ich większej funkcjonalności, jeśli nie wydajności. Wersje Matlab wcześniejsze niż R2008b nie mają realnej alternatywy w żadnym wypadku i muszą używać klas Java.
Potencjalnym ograniczeniem korzystania ze zbiorów Javy jest ich niezdolność do przechowywania nie-prymitywnych typów Matlab, takich jak struktury. Aby to przezwyciężyć, albo Konwertuj typy w dół (np. używając struct2cell lub programowo), albo utwórz oddzielny obiekt Java, który przechowuje informacje użytkownika i przechowuje ten obiekt w kolekcji Java.
Możesz być również zainteresowany zbadaniem czysto obiektowej (opartej na klasach) implementacji Hashtable, która jest dostępna na wymianie Plików .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:50
Możesz użyć do tego Javy.
W matlab:
dict = java.util.Hashtable;
dict.put('a', 1);
dict.put('b', 2);
dict.put('c', 3);
dict.get('b')
Ale musiałbyś zrobić profilowanie, żeby zobaczyć, czy da ci to wzrost prędkości...Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-28 19:01:01
To trochę nieciekawe, ale dziwię się, że nikt nie zasugerował użycia struktur. Możesz uzyskać dostęp do dowolnego pola struktury za pomocą nazwy zmiennej jako struct.(var)
, Gdzie var
może być dowolną zmienną i zostanie odpowiednio rozwiązana.
dict.a = 1;
dict.b = 2;
var = 'a';
display( dict.(var) ); % prints 1
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-28 19:28:50
Możesz również skorzystać z nowego typu "Table". Możesz przechowywać różne rodzaje danych i uzyskiwać z nich statystyki naprawdę łatwo. Zobacz http://www.mathworks.com/help/matlab/tables.html aby uzyskać więcej informacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-13 21:21:38