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.

Author: Matthew Simoneau, 2010-08-28

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).

 14
Author: Jonas,
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
    
 117
Author: Amro,
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 .

 24
Author: Yair Altman,
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...
 18
Author: tauran,
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
 11
Author: Mark Elliot,
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.

 1
Author: Lei Zhang,
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