2012-11-08 9 views
13

미리 정의 된 20 개의 위치 배열이 내 몸통 20 개에 해당합니다. 관절에는 문자열 값 (예 : 'left_knee', 'head', 'left_eye'등)이 표시됩니다.Matlab - 문자열 값을 사용하여 배열 색인하기

첨부 된 문자열 값을 사용하여 배열 내의 특정 값을 참조하고자합니다. 예를 들어 관측 된 관절의 위치를 ​​저장하고 싶습니다. 처음 배열의 모든 위치는 (-1 , -1)이고, 어떤 관절을 발견하면 Joints('left_knee') = [100 200]과 같은 것을하고 싶습니다.

어떻게하면 Matlab에서이 작업을 수행 할 수 있습니까?

답변

9

내장 된 map containers을 사용하여 값을 고유 키에 매핑 할 수 있습니다. 여기 당신을 위해 간단한 예입니다 :

valueSet = {[-1, 1], [2, 3], [1,5], [1,8]}; 
keySet = {'left_knee', 'right_knee', 'left_eye', 'right_eye'}; 
Joints = containers.Map(keySet,valueSet); 
Joints('left_knee') 

ans = 
    -1  1 

당신은 값을 얻을 수 있습니다 /지도 개체의 키를 다음과 같이

values(Joints) 

ans = 
    [1x2 double] [1x2 double] [1x2 double] [1x2 double] 

keys(Joints) 

ans = 
    'left_eye' 'left_knee' 'right_eye' 'right_knee' 

이 이상 documentation '예와 방법'을 참조하십시오.

14

어때 대략 struct s?

Joints.left_knee = [100 200]; 
Joints.head  = [-1 -100]; 

동적과 같이 개별 항목을 참조 fieldnames 모든 필드를 받기 :

someVar = 'left_eye'; 
Joints.(someVar) = [200 250]; 

을 등 여러 관절이 일어날 경우, 모든 데이터의 동일한 종류를 필요로하지만, 그들은 모두에 속하는 동일한 시스템, 당신도 멀티 D 구조체를 만들 수 있습니다

0 :

그냥
Joints(1).left_knee = [100 200]; 
Joints(1).head  = [-1 -100]; 

Joints(2).left_knee = [200 450]; 
Joints(2).head  = [-10 -189]; 

Joints(3).left_knee = [-118 264]; 
Joints(3).head  = [+33 78]; 

당신에게 멀티 D 구조체의 맥락에서 유용한 몇 가지 기술을 보여

>> someVar = 'head'; 
>> Joints.(someVar)  % will be expanded cell-array, 1 entry for each dimension 
ans = 
    -1 -100 
ans = 
    -10 -189 
ans = 
    33 78 
>> [Joints.(someVar)] % will collect those data in regular array 
ans = 
    -1 -100 -10 -189 33 78 
>> {Joints.(someVar)} % will collect those data in cell array 
ans = 
    [1x2 double] [1x2 double] [1x2 double] 
>> [A,B,C] = deal(Joints.(someVar)); % will assign data to 3 separate vars 
A = 
    -1 -100 
B = 
    -10 -189 
C = 
    33 78 

help struct 자세한 내용은 관련 기능을 참조하십시오.

+0

+1 문자열 변수를 사용하여 구조체 필드를 참조 할 수 있는지 잘 모르겠습니다. –

2

@RodyOldenhuis 솔루션을 확장하려면 인덱스를 구조체 배열에 저장하고 데이터에 일반 매트릭스를 사용할 수도 있습니다. 당신은 여전히 ​​모든 데이터 vectorwise 정상 매트릭스 연산을 적용 할 수있는이 방법 : 내 예에서

idx.left_knee = 1; 
idx.right_knee = idx.left_knee + 1; 
idx.left_elbow = idx.right_knee+ 1; 
idx.right_elbow= idx.left_elbow+ 1; 

joint_pos = rand(4,8); 
t = linspace(0,1,8); 
joint_vel = diff(joint_pos,2)./diff(t); 

joint_vel(idx.right_knee,:) 

나는 나의 기술을 설명하기 위해 시간에 8 점의 위치와 4 개 관절의 속도에 대한 데이터 구조를 설정합니다.

다차원 데이터 세트를 사용할 때 더 쉽게 작업 할 수 있습니다. 물론 응용 프로그램에 따라 달라집니다. 예를 들어 상수를 저장하려는 경우 @RodyOldenhuis의 솔루션은 분명 간단합니다.