如何循环遍历多个结构并执行相同的操作[Matlab]

How to loop through multiple structures and perform the same operations [Matlab]

我试图一次遍历多个结构,提取感兴趣的变量,并将它们组合成一个元胞数组。问题:所有变量都具有相同的名称。我有一个有效的伪代码——在这里:

假设我在工作区中加载了 i 个结构。现在我想遍历每个结构,并从每个结构中提取时间和位置数据。

首先,我加载我的结构。像...

data_1
data_2
data_3

然后,我创建适当大小的元胞数组。

time{i,:} = zeros(size(structures));
position{i,:} = zeros(size(structures));

最后,我遍历结构以提取元胞数组并创建单个数组。

for i = 1:size(structures)
   time_i= data_i.numbers.time;
   position_i= data_i.numbers.position;
   time {i,:} = time_i;
   position{i,:} = position_i;
end

我想以一个元胞数组结束,该元胞数组包含单个元胞结构中所有变量的串联。

能否请您帮助将我的伪 code/ideas 转换为脚本,或者为我指出可能有用的资源?

谢谢!

...
   eval(['time_',num2str(i),'= data_',num2str(i),'.numbers.time;'])
   eval(['position_',num2str(i),'= data_',num2str(i),'.numbers.position;'])
...

您最好将数据加载到循环内部并将其存储到单元格或结构中,而不是尝试处理工作区中的迭代命名变量。在几乎所有情况下,eval 都是一种明显的代码异味,尤其是因为 MATLAB 的 JIT 编译器忽略了 eval 语句,因此您获得了引擎优化的 none。 eval 语句也很难解析、调试和维护。

更强大方法的示例:

for ii = 1:nfiles
    tmp = load(thefilenames{ii});  % Or use output of dir

    trialstr = sprintf('trial_%u', ii);  % Generate trial string
    data.(trialstr).time = tmp.numbers.time;
    data.(trialstr).position = tmp.numbers.position;
end

最后的数据结构为:

data
  trial_n
    time
    position

以后更容易迭代。

任何感兴趣的人的最终剧本:

for i = 1:4 %for 4 structures that I am looping through
    eval(['time_',num2str(i),'= data_',num2str(i),'.numbers.time;']);
    eval(['position_',num2str(i),'= data_',num2str(i),'.numbers.position;']);
    %concatenate data into a single cell array here
    time{i} = {eval(['time_',num2str(i)])};
    position{i} = {eval(['position_',num2str(i)])};
end