Czy MATLAB obsługuje tabele skrótów?
Jakieś tło
Pracuję nad problemem w Matlabie, który wymaga odwzorowania obrazu w skali. W tym celu należy utworzyć filtr 2-D Gaussa z wariancji sigma*s^k
za k
w pewnym przedziale., A potem wykorzystać każdą z nich z kolei do filtrowania obrazu. Teraz chcę jakieś mapowanie z k
do przefiltrowanego obrazu.
Gdyby k
zawsze była liczbą całkowitą, po prostu utworzyłbym tablicę 3D, która:
arr[k] = <image filtered with k-th guassian>
Jednak k
niekoniecznie jest liczbą całkowitą, więc nie mogę tego zrobić. Pomyślałem o utrzymaniu takiej tablicy k
, która:
arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian>
Na pierwszy rzut oka wydaje się to całkiem niezłe, z wyjątkiem tego, że przeprowadzę to wyszukiwanie potencjalnie kilka tysięcy razy z około 20 lub 30 wartościami k
i obawiam się, że zaszkodzi to wydajności.
Zastanawiam się, czy nie byłoby lepiej, gdyby robił to z jakąś tablicą mieszającą, tak żebym miał czas wyszukiwania, który wynosi O (1) zamiast O (n).
Teraz wiem, że nie powinienem optymalizować przedwcześnie i może w ogóle nie mam tego problemu, ale pamiętaj, że to tylko tło i mogą być przypadki, w których to naprawdę najlepsze rozwiązanie, niezależnie od tego, czy jest to najlepsze rozwiązanie mojego problemu.
Nowa klasa Containers.Map w Matlab R2008b (7.7) to pomniejszona wersja interfejsu java.util.Map w języku Matlab . Ma dodatkową zaletę w postaci bezproblemowej integracji ze wszystkimi typami Matlab ( na przykład mapy Java nie obsługują struktur Matlab ), a także możliwość określania typów danych od wersji Matlab 7.10 (R2010a) .
Poważne implementacje Matlab wymagające map / słowników klucz-wartość powinny nadal korzystać z klas Map Java ( java.util.EnumMap , HashMap , TreeMap , LinkedHashMap lub Hashtable ), aby uzyskać dostęp do ich większej funkcjonalności, jeśli nie wydajności. Wersje Matlaba wcześniejsze niż R2008b w żadnym wypadku nie mają alternatywy i muszą używać klas Java.
Potencjalnym ograniczeniem korzystania z kolekcji Java jest ich niezdolność do zawierania nieprymitywnych typów Matlab, takich jak struktury. Aby temu zaradzić, przekonwertuj typy w dół (np. Za pomocą struct2cell lub programowo) lub utwórz oddzielny obiekt Java, który będzie przechowywać Twoje informacje i przechowywać ten obiekt w Kolekcji Java.
Możesz również być zainteresowany zbadaniem zorientowanej obiektowo (opartej na klasach) implementacji Hashtable w czystym Matlabie, która jest dostępna w Wymiana plików .
źródło
Możesz do tego użyć 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ć pewne profilowanie, aby zobaczyć, czy daje ci to wzrost prędkości, jak sądzę ...
źródło
Jest trochę niezgrabny, ale jestem zaskoczony, że nikt nie zasugerował używania struktur. Możesz uzyskać dostęp do dowolnego pola struct przez nazwę zmiennej jako
struct.(var)
gdzievar
może być dowolna zmienna i będzie rozwiązać w odpowiedni sposób.dict.a = 1; dict.b = 2; var = 'a'; display( dict.(var) ); % prints 1
źródło
dict.('2')
:: mathworks.com/access/helpdesk/help/techdoc/matlab_prog/ ...dict.(['k',num2str(1)])
działa, aledict.(['k',num2str(1.1)])
zawodzi, a jeśli wartości są liczbami całkowitymi, możesz ich użyć do bezpośredniego indeksowania. Inaczej to fajny pomysł..
ze związkiem_
.dict.(genvarname(['k',num2str(1.1)]))
Możesz także skorzystać z nowego typu „Tabela”. Możesz przechowywać różne typy danych i uzyskiwać z nich statystyki naprawdę łatwo. Więcej informacji można znaleźć pod adresem http://www.mathworks.com/help/matlab/tables.html .
źródło