我有一个结构数组,其中包含不同长度的结构数组。例如:
'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”的长度和“数据”的平均长度过高估计我需要的长度,但每个“数据”字段/子结构的实际长度变化很大。我是否会更好地过高估计它的结果并在之后修剪得到的数组?使用我正在使用的数据集时,零时间戳是不可能的,所以这应该不是问题。
答案 0 :(得分:6)
如果每个结构数组data
具有相同的字段并且是行向量(即 1-by-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
上述解决方案的工作原因是访问结构数组的单个字段会返回comma-separated list。