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

时间:2017-08-03 17:59:08

标签: matlab loops concatenation structure

我试图一次遍历多个结构,提取感兴趣的变量,并将它们组合成单个单元格数组。问题:所有变量都有相同的名称。我有一个工作伪代码 - 这是:

假设我在工作区中加载了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

我希望以包含单个单元结构中所有变量的串联的单元格数组结束。

你能帮我把我的伪代码/想法转换成脚本,还是指向可能有用的资源?

谢谢!

3 个答案:

答案 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