MATLAB:使用字段作为结构数组确定结构数组的总长度/大小

Dor*_*oom 4 arrays matlab memory-management matlab-struct

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

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

length(s(n).data) ~= length(s(m).data)
Run Code Online (Sandbox Code Playgroud)

我想预先分配一个数组,该数组从每个字段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
Run Code Online (Sandbox Code Playgroud)

我想过根据's'的长度和'数据'的平均长度过高估计我需要的长度,但每个'数据'字段/子结构的实际长度变化很大.我是否会更好地过高估计它的结果并在之后修剪得到的数组?使用我正在使用的数据集时,零时间戳是不可能的,所以这应该不是问题.

gno*_*ice 6

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

allData = [s.data];               %# Concatenate all data arrays into one
timestamp = [allData.timestamp];  %# Collect all the time stamps
Run Code Online (Sandbox Code Playgroud)

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

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

上述解决方案的工作原因是访问结构数组的单个字段会返回逗号分隔的列表.