4

我有一个结构数组,其中包含作为不同长度的结构数组的字段。例如:

's' 是一个结构体 'data' 是 's' 中的一个字段,也是一个结构体数组本身和

length(s(n).data) ~= length(s(m).data)

我想预先分配一个数组,该数组从每个字段 s.data.timestamp 中获取时间戳。有没有办法在不使用 for 循环两次的情况下做到这一点?这是我到目前为止所拥有的:

% find the total length
count=0;
for x=1:length(s)
  count=count+length(s(x).data);
end
% preallocate timestamp array
timestamp=zeros(1,count);
% populate timestamp array
index=1;
for x=1:length(s)
   for y=1:length(s(x).data)
      timestamp(index)=s(x).data(y).timestamp;
      index=index+1;
   end
end

我考虑过根据“s”的长度和“数据”的平均长度高估我需要的长度,但每个“数据”字段/子结构的实际长度差异很大。我是否会更好地高估它的结果并随后修剪结果数组?对于我正在使用的数据集,零时间戳是不可能的,所以这应该不是问题。

4

1 回答 1

6

如果每个结构数组data都具有相同的字段并且是行向量(即1×N),这将起作用:

allData = [s.data];               %# Concatenate all data arrays into one
timestamp = [allData.timestamp];  %# Collect all the time stamps

如果data结构数组是列向量(即N-by-1),则需要vertcat改用:

allData = vertcat(s.data);        %# Concatenate all data arrays into one
timestamp = [allData.timestamp];  %# Collect all the time stamps

上述解决方案之所以有效,是因为访问结构数组的单个字段会返回一个逗号分隔的列表

于 2009-11-18T16:38:34.667 回答