2012-11-08 20 views
13

Ho una matrice predefinita di 20 posizioni che corrisponde a 20 articolazioni del mio corpo. I giunti sono contrassegnati con valori stringa (ad esempio "left_knee", "head", "left_eye", ecc.).Matlab - Indicizzazione di una matrice utilizzando i valori stringa

Desidero fare riferimento a un determinato valore all'interno della matrice utilizzando il valore di stringa associato. Ad esempio, voglio memorizzare la posizione delle articolazioni osservate. Inizialmente tutte le posizioni all'interno dell'array sono (-1 , -1) e quindi se vedo un determinato giunto voglio fare qualcosa come Joints('left_knee') = [100 200].

Come posso farlo in Matlab?

risposta

9

È possibile utilizzare lo map containers integrato per mappare i valori su chiavi univoche. Ecco un rapido esempio per voi:

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 

È possibile ottenere i valori/chiavi dell'oggetto mappa come segue:

values(Joints) 

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

keys(Joints) 

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

Vedere la documentation per ulteriori 'esempi e come'.

14

Che ne dici di struct s?

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

Ottenere tutti i campi con fieldnames, fare riferimento alle singole voci come dinamicamente in modo da:

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

ecc Se vi capita di avere più articolazioni, tutto ha bisogno lo stesso tipo di dati, ma tutti appartengono alla lo stesso sistema, è possibile effettuare le strutture multi-D, troppo:

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

solo per mostrarvi alcune tecniche utili nel contesto di struct multi-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 

Digitare help struct per ulteriori informazioni e informazioni sulle funzioni rilevanti.

+0

+1 Bello, non sapevo che si potesse fare riferimento ai campi struct con una variabile stringa. –

2

Per espandere la soluzione @RodyOldenhuis, è inoltre possibile memorizzare gli indici in un array struct e utilizzare una matrice semplice per i dati. In questo modo è ancora possibile applicare il normale funzionamento della matrice di tutti i dati 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,:) 

Nell'esempio ho istituito una struttura di dati per la posizione e la velocità di 4 nodi a 8 punti nel tempo per illustrare la tecnica.

Trovo che sia più facile lavorare con i dataset multidimensionali. Naturalmente dipende dalla tua applicazione, se per esempio vuoi solo memorizzare costanti, la soluzione di @RodyOldenhuis è ovviamente molto più semplice.

Problemi correlati