2012-11-08 1 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

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のソリューションははるかに簡単です。

関連する問題