我试图一次遍历多个结构,提取感兴趣的变量,并将它们组合成单个单元格数组。问题:所有变量都有相同的名称。我有一个工作伪代码 - 这是:
假设我在工作区中加载了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
我希望以包含单个单元结构中所有变量的串联的单元格数组结束。
你能帮我把我的伪代码/想法转换成脚本,还是指向可能有用的资源?
谢谢!
答案 0 :(得分:1)
...
eval(['time_',num2str(i),'= data_',num2str(i),'.numbers.time;'])
eval(['position_',num2str(i),'= data_',num2str(i),'.numbers.position;'])
...
答案 1 :(得分:1)
您可能会更好地将数据内部加载到循环中并将其存储到单元格或结构中,而不是尝试在工作区中处理迭代命名的变量。在几乎所有情况下,eval
都是一个重要的代码气味,尤其是因为MATLAB的JIT编译器会忽略eval
语句,因此您无法获得引擎的优化。 <{1}}语句也难以解析,调试和维护。
更强有力的方法的一个例子:
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
以后更容易迭代。
答案 2 :(得分:1)
我感兴趣的人的最终剧本:
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