如何从 matlab 中的动态结构访问和存储选定字段?
How to access and store selected fields from a dynamic structure in matlab?
我有一个巨大的动态结构。它看起来像这样:
s.one.name = 'Mr. Doe';
s.one.time = '12:00';
s.one.ID = '209';
s.one.data = 'Data1';
s.two.name = 'Ms. Jane';
s.two.time = '13:00';
s.two.ID = '210';
s.two.data = 'Data2';
s.three.name = 'Ms. Alice';
s.three.time = '14:00';
s.three.ID = '212';
s.three.data = 'Data3';
s.four.name = 'Mr. Smith';
s.four.time = '14:00';
s.four.ID = '212';
s.four.data = 'Data4';
现在,我只想访问和存储前两个字段 one
和 two
(在所有给定字段中)及其相应的数据到一个新的动态结构中 snew
.
我试过做以下事情:
for ii = 1:2
snew = [s.(ii)];
end
错误:Argument to dynamic structure reference must evaluate to a valid field name.
谁能帮我完成这个任务?
提前致谢
你想要一个结构向量:
s(1) = struct()
s(1).name = 'Mr. Doe'
...
s(2) = struct()
s(2).name = 'Ms. Jane'
...
然后您可以使用索引访问结构向量:
snew = s(i)
如果您只想要前两个 成员,您可以这样做:
snew = s(1:2)
对于两个字段,您可以直接进行:
snew = struct('one', s.one, 'two', s.two);
对于可变数量的字段(比如 k),您可以按以下方式进行:
names = fieldnames(s);
vals = struct2cell(s);
list = [names(1:k) vals(1:k)]';
snew = struct(list{:});
您可以将要复制的字段放在元胞数组中,然后遍历该数组并通过动态字段名称访问结构字段。
to_keep = {'one', 'two'};
out = struct();
for k = 1:numel(to_keep)
out.(to_keep{k}) = s.(to_keep{k});
end
正如其他人所指出的,可能有更好的方法来组织您的数据以简化此操作。
我有一个巨大的动态结构。它看起来像这样:
s.one.name = 'Mr. Doe';
s.one.time = '12:00';
s.one.ID = '209';
s.one.data = 'Data1';
s.two.name = 'Ms. Jane';
s.two.time = '13:00';
s.two.ID = '210';
s.two.data = 'Data2';
s.three.name = 'Ms. Alice';
s.three.time = '14:00';
s.three.ID = '212';
s.three.data = 'Data3';
s.four.name = 'Mr. Smith';
s.four.time = '14:00';
s.four.ID = '212';
s.four.data = 'Data4';
现在,我只想访问和存储前两个字段 one
和 two
(在所有给定字段中)及其相应的数据到一个新的动态结构中 snew
.
我试过做以下事情:
for ii = 1:2
snew = [s.(ii)];
end
错误:Argument to dynamic structure reference must evaluate to a valid field name.
谁能帮我完成这个任务?
提前致谢
你想要一个结构向量:
s(1) = struct()
s(1).name = 'Mr. Doe'
...
s(2) = struct()
s(2).name = 'Ms. Jane'
...
然后您可以使用索引访问结构向量:
snew = s(i)
如果您只想要前两个 成员,您可以这样做:
snew = s(1:2)
对于两个字段,您可以直接进行:
snew = struct('one', s.one, 'two', s.two);
对于可变数量的字段(比如 k),您可以按以下方式进行:
names = fieldnames(s);
vals = struct2cell(s);
list = [names(1:k) vals(1:k)]';
snew = struct(list{:});
您可以将要复制的字段放在元胞数组中,然后遍历该数组并通过动态字段名称访问结构字段。
to_keep = {'one', 'two'};
out = struct();
for k = 1:numel(to_keep)
out.(to_keep{k}) = s.(to_keep{k});
end
正如其他人所指出的,可能有更好的方法来组织您的数据以简化此操作。