Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在matlab中访问和存储动态结构中的选定字段?_Matlab_Structure_Matlab Struct - Fatal编程技术网

如何在matlab中访问和存储动态结构中的选定字段?

如何在matlab中访问和存储动态结构中的选定字段?,matlab,structure,matlab-struct,Matlab,Structure,Matlab Struct,我有一个巨大的动态结构。它看起来像这样: 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.

我有一个巨大的动态结构。它看起来像这样:

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
错误:
动态结构引用的参数必须计算为有效的字段名。

有人能帮我完成这项任务吗


提前感谢您

您需要结构向量:

s(1) = struct()
s(1).name = 'Mr. Doe'

...

s(2) = struct()
s(2).name = 'Ms. Jane'
...
然后可以使用索引访问结构的向量:

snew = s(i)
如果您只需要前两名成员,可以执行以下操作:

snew = s(1:2)

您需要一个结构向量:

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{:});

对于两个字段,您可以直接执行此操作:

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

正如其他人所指出的,可能有更好的方法来组织数据,以简化此操作。

您可以将要复制的字段放入单元格数组中,然后循环该数组,并通过动态字段名访问结构字段

to_keep = {'one', 'two'};

out = struct();

for k = 1:numel(to_keep)
    out.(to_keep{k}) = s.(to_keep{k});
end

正如其他人所指出的,可能有更好的方法来组织数据,以简化此操作。

符号
s.(ii)
意味着
ii
是一个字符向量,包含您要访问的字段的名称,这就是代码生成所示错误的原因。如果您只访问
s.one
s.two
,您将得到一个结构,其中分别包含
s.one
s.two
中的四个字段。我不清楚您到底希望
snew
包含什么-您能告诉我们吗?符号
s.(ii)
意味着
ii
是一个字符向量,包含您想要访问的字段的名称,这就是为什么您的代码会生成显示的错误。如果您只访问
s.one
s.two
,您将得到一个结构,其中分别包含
s.one
s.two
中的四个字段。我不清楚你到底想要
snew
包含什么-你能告诉我们吗?你建议提问者首先改变他们存储数据的方式,如果他们可以这样做,这可能是个好主意,但在上面显示的示例数据中,
s
只有一个成员,而且他们似乎希望分别访问
s.one
s.two
中的所有字段。@nekomatic是的-以我建议的方式进行重组似乎比坚持原来的存储方法更好。你是在建议提问者改变方式吗他们首先要存储数据,如果他们能够这样做,这可能是个好主意,但是在上面显示的示例数据中,
s
只有一个成员,他们似乎想分别访问
s.one
s.two
中的所有字段。@nekomatic是的-以我建议的方式进行重组似乎比坚持原来的存储方法更好。非常感谢!非常感谢你!