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

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

'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 Ответ

6 голосов
/ 18 ноября 2009

Это будет работать, если каждый структурный массив data имеет одинаковые поля и являются строками-векторами (т.е. 1 на N ):

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

Если структурные массивы data являются векторами столбцов (т. Е. N-на-1 ), вам необходимо использовать vertcat вместо:

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

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

...