2014-01-17 10 views
1

저는 카운터가있는 변수가있는 매트 파일을 읽고 있습니다. a1, a2, a3, b, c1c2.매트 파일의 변수를 이름으로 그룹화하고 구조로 수집하는 방법은 무엇입니까?

는 I "는"필드 이름을 가진 구조, "B"및 "C" a=[a1;a2;a3], b=bc = [c1; c2]에 데이터를 넣을.

알고리즘은 각 변수의 카운터의 최대 값이 무엇인지 알지 못해도이를 수행 할 수 있어야합니다. 어떻게해야합니까?

답변

1

먼저 load 함수를 사용하여 매트 파일 데이터를로드하여 구조에 배치합니다.

>> s = struct('a1',1:5,'b',[],'a2',1:5,'a3',1:5,'c1',1:3,'c2',3:5) 
s = 
    a1: [1 2 3 4 5] 
    b: [] 
    a2: [1 2 3 4 5] 
    a3: [1 2 3 4 5] 
    c1: [1 2 3] 
    c2: [3 4 5] 
다음

, 우리는 다음 필드 이름의 떨어져 모든 후행 번호를 제거하는 regexprep를 사용 fieldnames를 사용하여 필드 이름을 찾을 순 orderfields를 사용하여 필드를 주문할 수 있습니다 :의 당신에게 다음과 같은 샘플 데이터를 준 가정 해 봅시다 unique를 사용하여 고유의 문자열을 얻을 :

>> s = orderfields(s); 
>> [strs, inds] = unique(regexprep(fieldnames(s), '\d*$', ''), 'last') 
strs = 
    'a' 
    'b' 
    'c' 

inds = 
    3 
    4 
    6 

unique에 의해 반환 된 인덱스를 사용하여, 우리는 각각의 문자열이 diff([0; inds])을 수행하여 표시 방법을 여러 번 계산할 수 있습니다. 그런 다음, 우리 그룹이 수와 struct2cellmat2cell를 사용하여 셀 어레이에 구조 데이터 :

>> data = mat2cell(struct2cell(s), diff([0; inds])) 
data = 
    {3x1 cell} 
    {1x1 cell} 
    {2x1 cell} 

공지 사항 우리는 셀 어레이의 셀 어레이를 가지고있다. 각 문자열에 대한 항목의 각 세트는 (우리의 예에서와 같이)가 제대로 연결할 것을 확실히 알고 있다면, 당신은 다음과 같이 cellfuncell2mat를 사용하여 연결할 수 있습니다 :

>> data = cellfun(@cell2mat, data, 'UniformOutput', false) 
data = 
    [3x5 double] 
    [] 
    [2x3 double] 

이제 우리는 행렬의 셀 어레이를 가지고, cell2struct을 사용하여 새로운 구조를 만들 수 있습니다.

>> snew = cell2struct(data, strs) 
snew = 
    a: [3x5 double] 
    b: [] 
    c: [2x3 double] 
+0

이 방법은 작동하지만 원본 구조는 사전 순이어야합니다. 이 경우가 아니라면 [strs, inds] = unique (regexprep (fieldnames (s), '\ d * $', ''), 'last'); [sortedInds, IX] = 정렬 (inds); data = mat2cell (struct2cell (s), diff ([0; sortedInds])); snew = cell2struct (data, strs (IX)); – barbar

+0

@ user3097013 : 텍스트에서 ORDERFIELDS를 사용한다고 언급했지만 코드에 표시하지 않았습니다. 그 라인을 추가했습니다. – gnovice

+0

정확하지만 "a1"과 "a2"사이에 "a10"이 있습니다. 첫 번째 명령에서와 같이 sort 명령을 사용하여 수행하는 경우는 그렇지 않습니다. – barbar