如何循环遍历多个结构并执行相同的操作[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
我试图一次遍历多个结构,提取感兴趣的变量,并将它们组合成一个元胞数组。问题:所有变量都具有相同的名称。我有一个有效的伪代码——在这里:
假设我在工作区中加载了 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