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