저는 카운터가있는 변수가있는 매트 파일을 읽고 있습니다. a1
, a2
, a3
, b
, c1
및 c2
.매트 파일의 변수를 이름으로 그룹화하고 구조로 수집하는 방법은 무엇입니까?
는 I "는"필드 이름을 가진 구조, "B"및 "C" a=[a1;a2;a3]
, b=b
및 c = [c1; c2]
에 데이터를 넣을.
알고리즘은 각 변수의 카운터의 최대 값이 무엇인지 알지 못해도이를 수행 할 수 있어야합니다. 어떻게해야합니까?
저는 카운터가있는 변수가있는 매트 파일을 읽고 있습니다. a1
, a2
, a3
, b
, c1
및 c2
.매트 파일의 변수를 이름으로 그룹화하고 구조로 수집하는 방법은 무엇입니까?
는 I "는"필드 이름을 가진 구조, "B"및 "C" a=[a1;a2;a3]
, b=b
및 c = [c1; c2]
에 데이터를 넣을.
알고리즘은 각 변수의 카운터의 최대 값이 무엇인지 알지 못해도이를 수행 할 수 있어야합니다. 어떻게해야합니까?
먼저 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])
을 수행하여 표시 방법을 여러 번 계산할 수 있습니다. 그런 다음, 우리 그룹이 수와 struct2cell
및 mat2cell
를 사용하여 셀 어레이에 구조 데이터 :
>> data = mat2cell(struct2cell(s), diff([0; inds]))
data =
{3x1 cell}
{1x1 cell}
{2x1 cell}
공지 사항 우리는 셀 어레이의 셀 어레이를 가지고있다. 각 문자열에 대한 항목의 각 세트는 (우리의 예에서와 같이)가 제대로 연결할 것을 확실히 알고 있다면, 당신은 다음과 같이 cellfun
및 cell2mat
를 사용하여 연결할 수 있습니다 :
>> data = cellfun(@cell2mat, data, 'UniformOutput', false)
data =
[3x5 double]
[]
[2x3 double]
이제 우리는 행렬의 셀 어레이를 가지고, cell2struct
을 사용하여 새로운 구조를 만들 수 있습니다.
>> snew = cell2struct(data, strs)
snew =
a: [3x5 double]
b: []
c: [2x3 double]
이 방법은 작동하지만 원본 구조는 사전 순이어야합니다. 이 경우가 아니라면 [strs, inds] = unique (regexprep (fieldnames (s), '\ d * $', ''), 'last'); [sortedInds, IX] = 정렬 (inds); data = mat2cell (struct2cell (s), diff ([0; sortedInds])); snew = cell2struct (data, strs (IX)); – barbar
@ user3097013 : 텍스트에서 ORDERFIELDS를 사용한다고 언급했지만 코드에 표시하지 않았습니다. 그 라인을 추가했습니다. – gnovice
정확하지만 "a1"과 "a2"사이에 "a10"이 있습니다. 첫 번째 명령에서와 같이 sort 명령을 사용하여 수행하는 경우는 그렇지 않습니다. – barbar