Matlab - 使用字符串值索引数组

Sim*_*mon 13 matlab

我有一个20个位置的预定义数组,对应于我体内的20个关节.关节用字符串值标记(例如'left_knee','head','left_eye'等).

我想通过使用附加的字符串值来引用数组中的某个值.例如,我想存储观察到的关节的位置.最初阵列中的所有位置都是(-1 , -1),然后如果我发现某个关节,我想做类似的事情Joints('left_knee') = [100 200].

我怎样才能在Matlab中做到这一点?

Rod*_*uis 14

structs怎么样?

Joints.left_knee = [100 200];
Joints.head      = [-1 -100];
Run Code Online (Sandbox Code Playgroud)

获取所有字段fieldnames,动态引用单个条目,如下所示:

someVar = 'left_eye';
Joints.(someVar) = [200 250];
Run Code Online (Sandbox Code Playgroud)

如果碰巧有多个关节,都需要相同类型的数据,但它们都属于同一个系统,你也可以创建多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];
Run Code Online (Sandbox Code Playgroud)

只是为了向您展示一些在多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
Run Code Online (Sandbox Code Playgroud)

输入help struct更多的信息,了解相关的功能.


pet*_*hor 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
Run Code Online (Sandbox Code Playgroud)

您可以按如下方式获取地图对象的值/键:

values(Joints)

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

keys(Joints)

ans = 
    'left_eye'    'left_knee'    'right_eye'    'right_knee'
Run Code Online (Sandbox Code Playgroud)

有关更多"示例和方法",请参阅文档.