MATLAB이 해시 테이블을 지원합니까?
일부 배경
이미지의 스케일 공간 표현이 필요한 Matlab의 문제를 해결 중입니다. 이를 sigma*s^k
위해 k
특정 범위에 대한 분산 이 있는 2D 가우스 필터를 만든 다음 각각을 차례로 사용하여 이미지를 필터링합니다. 이제 k
필터링 된 이미지 에서 일종의 매핑을 원합니다 .
k
항상 정수인 경우 다음과 같은 3D 배열을 생성합니다.
arr[k] = <image filtered with k-th guassian>
그러나 k
반드시 정수는 아니므로이 작업을 수행 할 수 없습니다. 내가하려고 생각한 k
것은 다음과 같은 배열을 유지하는 것 입니다.
arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian>
처음에는 꽤 괜찮은 것 같지만, 약 20 또는 30 개의 값으로 잠재적으로이 조회를 수천 번 수행 할 것이며 이것이 성능에 영향을 미칠 k
까봐 걱정됩니다.
나는 O (n) 대신 O (1) 조회 시간을 가질 수 있도록 일종의 해시 테이블로 이것을 수행하는 것이 더 좋지 않을지 궁금합니다.
자, 저는 제가 조기에 최적화해서는 안된다는 것을 알고 있으며,이 문제가 전혀 발생하지 않을 수도 있습니다. 그러나 이것은 단지 배경 일 뿐이며 이것이 실제로 최선의 해결책 인 경우가있을 수 있습니다. 내 문제에 대한 최고의 솔루션 .
답변
Matlab은 해시 테이블을 지원하지 않습니다. r2010a까지 편집 , 즉; @Amro 의 대답을 참조하십시오 .
조회 속도를 높이려면을 삭제하고 LOGICAL INDEXING을find
사용할 수 있습니다 .
arr{array_of_ks==k} = <image filtered with k-th Gaussian>
또는
arr(:,:,array_of_ks==k) = <image filtered with k-th Gaussian>
그러나 Matlab에 대한 모든 경험에서 나는 병목 현상을 찾아 본 적이 없습니다 .
특정 문제의 속도를 높이려면 증분 필터링을 사용하는 것이 좋습니다.
arr{i} = GaussFilter(arr{i-1},sigma*s^(array_of_ks(i)) - sigma*s^(array_of_ks(i-1)))
가정 array_of_ks
이 오름차순으로 정렬되고 GaussFilter는 분산 (물론 2 개의 1D 필터 사용)을 기반으로 필터 마스크 크기를 계산하거나 큰 이미지에 특히 유용하며 분산이 다음과 같은 경우 푸리에 공간에서 필터링 할 수 있습니다. 균등 한 간격으로 배치됩니다 (아쉽게도 그렇지 않을 가능성이 높습니다).
답변
MATLAB의지도 클래스 인 container.Map을 사용해보십시오 . 다음은 간략한 개요입니다.
-
창조:
>> 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
-
조회 :
x = rainfallMap('Jan');
-
양수인:
rainfallMap('Jan') = 0;
-
더하다:
rainfallMap('Total') = 999;
-
없애다:
rainfallMap.remove('Total')
-
검사 :
values = rainfallMap.values; keys = rainfallMap.keys; sz = rainfallMap.size;
-
확인 키 :
if rainfallMap.isKey('Today') ... end
답변
Matlab R2008b (7.7)의 새로운 container.Map 클래스는 java.util.Map 인터페이스 의 축소 된 Matlab 버전입니다 . Matlab 7.10 (R2010a) 이후 데이터 유형 을 지정 하는 기능뿐만 아니라 모든 Matlab 유형 (예 : Java Maps에서 Matlab 구조체 를 처리 할 수 없음) 과의 원활한 통합이라는 추가 이점이 있습니다 .
키-값 맵 / 사전이 필요한 심각한 Matlab 구현은 여전히 Java의 Map 클래스 ( java.util.EnumMap , HashMap , TreeMap , LinkedHashMap 또는 Hashtable )를 사용하여 성능이 아닌 경우 더 큰 기능에 액세스해야합니다. R2008b 이전의 Matlab 버전은 어떠한 경우에도 실제 대안이 없으며 Java 클래스를 사용해야합니다.
Java 컬렉션 사용의 잠재적 인 제한 사항은 구조체와 같은 비 원시 Matlab 유형을 포함 할 수 없다는 것입니다. 이를 극복하려면 유형을 다운 변환 (예 : struct2cell 또는 프로그래밍 방식으로 사용)하거나 정보를 보유하고이 객체를 Java 컬렉션에 저장할 별도의 Java 객체를 만듭니다.
File Exchange에서 사용할 수 있는 순수 Matlab 객체 지향 (클래스 기반) Hashtable 구현을 살펴 보는 것도 좋습니다.
답변
Java를 사용할 수 있습니다.
MATLAB에서 :
dict = java.util.Hashtable;
dict.put('a', 1);
dict.put('b', 2);
dict.put('c', 3);
dict.get('b')
그러나 속도 향상을 제공하는지 확인하려면 프로파일 링을 수행해야합니다.
답변
조금 어색하지만 아무도 구조체 사용을 제안하지 않은 것에 놀랐습니다. 당신은 변수 이름으로 모든 구조체 필드를 액세스 할 수있는 struct.(var)
경우 var
어떤 변수가 될 수 있으며, 적절하게 해결됩니다.
dict.a = 1;
dict.b = 2;
var = 'a';
display( dict.(var) ); % prints 1
답변
새로운 유형의 “테이블”을 활용할 수도 있습니다. 다양한 유형의 데이터를 저장하고 통계를 쉽게 얻을 수 있습니다. 자세한 내용은 http://www.mathworks.com/help/matlab/tables.html 을 참조 하십시오 .