2012-11-08 14 views
13

Mam predefiniowaną tablicę 20 pozycji, które odpowiadają 20 stawom z mojego ciała. Połączenia są oznaczone wartościami ciągu (np. "Left_knee", "head", "left_eye", itp.).Matlab - Indeksowanie tablicy przy użyciu wartości łańcuchów

Chcę odwołać się do pewnej wartości w tablicy przy użyciu dołączonej wartości ciągu. Na przykład chcę zapisać pozycję obserwowanych stawów. Początkowo cała pozycja w tablicy to (-1 , -1), a następnie, gdy zauważę pewne połączenie, chcę zrobić coś takiego jak Joints('left_knee') = [100 200].

Jak mogę to zrobić w programie Matlab?

Odpowiedz

9

Możesz użyć wbudowanego map containers, aby odwzorować wartości na unikatowe klucze. Oto krótki przykład dla Ciebie:

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 

można uzyskać wartości/Klucze obiektu na mapie w następujący sposób:

values(Joints) 

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

keys(Joints) 

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

Zobacz documentation za więcej „przykładów i jak”.

14

Co powiecie na: struct s?

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

Uzyskaj wszystkie pola z fieldnames, odnoszą się do poszczególnych wpisów dynamicznie tak:

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

itd. Jeśli zdarzy ci się mieć wiele stawów, wszystkie wymagające tego samego rodzaju danych, ale wszystkie one należą do ten sam system, można dokonać multi-D konstrukcjom też:

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]; 

Wystarczy, aby pokazać kilka technik przydatnych w kontekście wielo-D elemencie:

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

Wpisz help struct, aby uzyskać więcej informacji i poznać odpowiednie funkcje.

+0

+1 Miło, nie wiedziałem, że możesz odwoływać się do pól strukturalnych ze zmienną łańcuchową. –

2

Aby rozwinąć rozwiązanie @RodyOldenhuis, można również przechowywać indeksy w tablicy struct i używać zwykłej macierzy dla danych. W ten sposób można nadal stosować normalne działanie matrycy do wszystkich vectorwise danych:

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,:) 

W moim przykładzie mogę skonfigurować strukturę danych o położeniu i prędkości 4 stawów na 8 punktów w czasie, aby zilustrować moją technikę.

Ułatwiam pracę z tymi wielowymiarowymi zbiorami danych. Oczywiście zależy to od twojej aplikacji, jeśli na przykład chcesz tylko przechowywać stałe, rozwiązanie @RodyOldenhuis jest oczywiście znacznie prostsze.

Powiązane problemy