MATLAB: определить общую длину / размер массива структуры с полями в качестве структурных массивов

У меня есть структурный массив, содержащий поля в качестве структурных массивов различной длины. Например:

'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' и средней длины 'данных', но фактическая длина каждого поля / подструктуры 'данных' сильно варьируется. Было бы лучше, если бы я переоценил все это, а потом урезал получившийся массив? Нулевые метки времени невозможны с набором данных, с которым я работаю, так что это не должно быть проблемой.

1 ответ

Решение

Это будет работать, если каждый структурный массив 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

Вышеуказанные решения работают из-за того, что доступ к одному полю структурного массива возвращает список через запятую.

Другие вопросы по тегам