2009-11-18 5 views
4

다양한 길이의 구조 배열로 필드를 포함하는 구조체 배열이 있습니다. 예를 들어MATLAB : 구조 배열로 필드를 사용하여 구조 배열의 전체 길이/크기 결정

의 '구조 '데이터 '필드가'S '에 있고, 또한 구조의 배열 자체는 및

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

I는 시간이 걸린다 배열을 미리 할당 할 모든 필드 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'와 '데이터'의 평균 길이의 길이에 따라 필요한 것 길이를 과대 평가에 대해 생각하지만, 각각의 실제 길이 '이것은 내가 지금까지 무엇을 가지고 데이터 '필드/하부 구조는 매우 다양합니다. 나는 그것의 지옥을 과대 평가하고 그 결과 배열을 트리밍하는 것이 나을 것인가? 내가 작업하고있는 데이터 세트로는 타임 스탬프가 제로가 불가능하기 때문에 문제가되지 않습니다. 모든 구조 배열 data가 동일한 필드를 가지며, 행 벡터 인 경우

답변

6

이 작동한다 (즉 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 

위의 솔루션으로 인해 하나의 접근 사실 일 구조 배열의 필드는 comma-separated list을 반환합니다.

+1

와우! 단지 두 라인 - 나는 "freakin '천재"라는 용어가 여기에 적용될 수 있다고 믿습니다. – Doresoom

+0

@doresoom : 쉼표로 구분 된 목록은 친구입니다. ;) – gnovice