我有一个预定义的 20 个位置数组,对应于我身体的 20 个关节。关节标有字符串值(例如“left_knee”、“head”、“left_eye”等)。
我想通过使用附加的字符串值来引用数组中的某个值。例如,我想存储观察到的关节的位置。最初数组中的所有位置都是(-1 , -1)
,然后如果我发现某个关节,我想做类似Joints('left_knee') = [100 200]
.
我怎样才能在 Matlab 中做到这一点?
我有一个预定义的 20 个位置数组,对应于我身体的 20 个关节。关节标有字符串值(例如“left_knee”、“head”、“left_eye”等)。
我想通过使用附加的字符串值来引用数组中的某个值。例如,我想存储观察到的关节的位置。最初数组中的所有位置都是(-1 , -1)
,然后如果我发现某个关节,我想做类似Joints('left_knee') = [100 200]
.
我怎样才能在 Matlab 中做到这一点?
s怎么样struct
?
Joints.left_knee = [100 200];
Joints.head = [-1 -100];
获取所有字段fieldnames
,动态引用单个条目,如下所示:
someVar = 'left_eye';
Joints.(someVar) = [200 250];
等等如果你碰巧有多个关节,都需要相同类型的数据,但它们都属于同一个系统,你也可以制作多维结构:
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
以获取更多信息并了解相关功能。
您可以使用内置映射容器将值映射到唯一键。这是一个简单的例子:
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'
有关更多“示例和操作方法”,请参阅文档。
要扩展@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 的解决方案显然要简单得多。