12

体の 20 の関節に対応する 20 の位置の事前定義された配列があります。ジョイントは文字列値でマークされます (例: 'left_knee'、'head'、'left_eye' など)。

添付された文字列値を使用して、配列内の特定の値を参照したい。たとえば、観察した関節の位置を保存したいとします。最初は配列内のすべての位置が(-1 , -1)あり、特定のジョイントを見つけたら、次のようなことをしたいと思いますJoints('left_knee') = [100 200]

Matlabでこれを行うにはどうすればよいですか?

4

3 に答える 3

13

sはどうstructですか?

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

ですべてのフィールドを取得しfieldnames、次のように個々のエントリを動的に参照します。

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

複数のジョイントがあり、すべてが同じ種類のデータを必要とするが、それらはすべて同じシステムに属している場合、マルチ D 構造体も作成できます。

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詳細を入力して、関連する機能について学びます。

于 2012-11-08T09:29:24.800 に答える
9

組み込みのマップ コンテナーを使用して、値を一意のキーにマップできます。簡単な例を次に示します。

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'

より多くの「例と方法」については、ドキュメントを参照してください。

于 2012-11-08T09:46:46.390 に答える
2

@RodyOldenhuis ソリューションを拡張するために、インデックスを構造体配列に格納し、データにプレーン マトリックスを使用することもできます。このようにして、通常の行列演算をすべてのデータにベクトル的に適用できます。

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

于 2012-11-08T09:43:54.183 に答える