2013-08-22 2 views
4

나는 열거를 사용하여 배열이나 사전의 요소에 액세스하지만 운이없는 것을 찾고 있습니다.열거 형을 MATLAB 벡터 또는 맵의 첨자로 사용할 수 있습니까?

열거 :

classdef Enumeration1 < uint32 
    enumeration 
     Left (1); 
     Right (2); 
     Neither (3); 
    end 
end 

사용법 : 나 여기에

directions(Enumeration1.Left) = 7; 

directions(1) = 7; 

으로 동일해야하지만 첨자 인덱스는 실제 양의 정수 여야합니다 '얻거나 논리적 인 '.

또는 containers.Map 개체를 사용하는 경우 표시되는 모든 예는 키를 문자열로 사용합니다. 열거 형을 사용할 때 '지정된 키 유형이이 컨테이너에 대해 예상되는 유형과 일치하지 않습니다.'라는 메시지가 나타납니다. help containers.Map에서 uint32는 수용 가능한 키 유형이라는 것을 알 수 있습니다.

열거 형 값을 사용하여 효과적으로 개체를 인덱싱하려면 어떻게해야합니까?

+0

사용하는 matlab에 어떤 버전 : 나는 색인 용어의 유형을 테스트 isa를 사용하지 않는 containers.Map/subsref 방법은 대신 오류 메시지를 설명 strcmp(class(obj),'..') 같은 것을 사용 생각하십니까? – Floris

+0

Floris 2010b를 사용하고 있습니다. –

답변

3

http://www.mathworks.com/help/matlab/matlab_oop/enumerations.html에서 주어진 예제를 보면 Enumeration1.Left 값이 1 값이 아니라 객체라는 것을 알 수 있습니다. 당신은 반환 된 개체를 검사하여 확인할 수 있습니다 :이 a 크기 108 bytes과 가치 Left로, 클래스 Enumeration1의 목적은 당신을 보여줍니다

a = Enumeration1.Left; 
whos a 
display(a) 

. 내가 matlab에 2012A를 사용할 때, 나는 실제로 당신이 위의이 구문을 사용할 수 있으며, matlab에하지 않습니다 - 흥미롭게도

directions(uint32(Enumeration1.Left)) = 7; 

을 : 1Left

b = uint32(a); 

이루어집니다로 변환 그래서 다음과 같은 작업을해야합니다 불평.

+0

아뇨, 모범생 오류, 실제 코드에서 열거 된 값은 벡터 색인에 대해 완전히 잘못된 값인 0에서 시작되었습니다. 그래도 도움을 주셔서 감사합니다, 2010b에서 문법도 작동합니다. –

+0

도와 드리겠습니다. 나는 문법이 바뀌 었다고 생각해서 놀랐다. 그러나 일어난 것으로 알려졌다 ... 나는 문제를 더 자세히 보면서 뭔가를 배웠다. 그래서 그것은 시간 낭비가 아니었다 :-) – Floris

2

일반적으로 use objects as indices에는 클래스에 대해 subsindex 메서드를 정의하십시오.

MATLAB의 모든 항목에 대해 subsindex은 0부터 시작하는 인덱스를 반환해야합니다.

classdef E < uint32 
    enumeration 
     Left (1); 
     Right (2); 
     Neither (3); 
    end 

    methods 
     function ind = subsindex(obj) 
      ind = uint32(obj) - 1; 
     end 
    end 
end 

예 :도 정의 subsindex 방법없이, 내장 타입에서 상속 클래스는 평소와 같이 인덱스 (적어도 내 R2013a 버전에서이 방법을 작동)로 작동합니다

>> x = 1:10; 
>> x(E.Right) 
ans = 
    2 

주 .


당신이 containers.Map 작업 할 경우

, 당신은 명시 적으로 uint32으로 열거 캐스팅해야합니다.

Error using containers.Map/subsref 
Specified key type does not match the type expected for this container. 
관련 문제