4

可変長の構造体配列としてフィールドを含む構造体配列があります。例えば:

's' は構造体 'data' は 's' 内のフィールドであり、構造体配列自体でもあり、

length(s(n).data) ~= length(s(m).data)

すべてのフィールド s.data.timestamp からタイムスタンプを取得する配列を事前に割り当てたいと考えています。forループを2回使わずにこれを行う方法はありますか? これは私がこれまでに持っているものです:

% 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」の長さと「data」の平均長に基づいて必要な長さを過大評価することを考えましたが、各「data」フィールド/サブ構造の実際の長さは大きく異なります。一体全体を過大評価し、後で結果の配列をトリミングする方がよいでしょうか? 私が扱っているデータセットではタイムスタンプをゼロにすることは不可能なので、問題にはなりません。

4

1 に答える 1

6

これは、すべての構造体配列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

上記の解決策は、構造体配列の単一フィールドにアクセスするとカンマ区切りのリストが返されるため機能します。

于 2009-11-18T16:38:34.667 に答える