문제

다양한 길이의 구조 배열로 필드를 포함하는 구조 배열이 있습니다. 예를 들어:

's'는 's'의 구조 '데이터'입니다. 's'의 필드이며 구조 배열 자체이며

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

나는 모든 필드 s.data.timestamp에서 타임 스탬프를 취하는 배열을 prealloce하고 싶습니다. For Loop을 두 번 사용하지 않고이 작업을 수행하는 방법이 있습니까? 이것이 내가 지금까지 가지고있는 것입니다.

% 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 필드가 동일하고 행 벡터가 있습니다 (즉 1 x-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

위의 솔루션은 구조 배열의 단일 필드에 액세스하는 것이 a를 반환한다는 사실로 인해 작동합니다. 쉼표로 구분 된 목록.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top