2016-10-06 2 views
0

나는 다음과 같은 구조를 가지고 :한 줄의 동적 구조 참조를 사용하여 MATLAB 구조를 평평하게

myStruct.A.var = 'abc'; 
myStruct.B.var = '123'; 
myStruct.C.var = 7; 
... 

나는 모든 값을 얻기 위해 구조를 평탄화 소형 (1-2 라인) 방법을 찾고 있어요 'VAR'의 서브 필드로 예를 들면 다음과 같습니다

flattened_var = {'abc', '123', 7} 

, 아래 라인 같은 (슬프게도 작동하지 않는) :

inBetweenFields = {'A', 'B', 'C'}; 
flattened_var = myStruct.(inBetweenFields{:}).var; 
+3

왜 1-2 라인을해야합니까? – excaza

+0

소형화를 위해. –

+4

@ChrisOreinos 일반적으로 가독성은 성능 이점이있는 경우를 제외하고는 간결합니다. – Suever

답변

3

간단한 루프가 적절한 이상입니다 :

% Set up data 
myStruct.A.var = 'abc'; 
myStruct.B.var = '123'; 
myStruct.C.var = 7; 

% Extract data 
substructs = fieldnames(myStruct); % Get substructure names 
nsubs = numel(substructs); % Get number of substructures 
flatteneddata = cell(nsubs, 1); % Preallocate cell array 

% Extract data 
for ii = 1:nsubs 
    flatteneddata{ii} = myStruct.(substructs{ii}).var; 
end 

이것은 또한 매우 거의 항상 해당하는 루프보다 느린 cellfun와 호환 트위터를 만들 수 있습니다.

% Set up data 
myStruct.A.var = 'abc'; 
myStruct.B.var = '123'; 
myStruct.C.var = 7; 

flatteneddata = cellfun(@(x) myStruct.(x).var, fieldnames(myStruct), 'UniformOutput', false); 

두 가지 접근법이 원하는 출력을 생성합니다

flatteneddata = 

    3×1 cell array 

    'abc' 
    '123' 
    [ 7] 
+1

트위터 호환 솔루션의 경우 +1입니다. 그것은 코드 골프와 비슷하지만 문자 메시지에서는 D – Adriaan

2

이 시도 :

cellfun(@struct2cell,struct2cell(myStruct)) 
+1

@ Adriaan 내가 잘못 생각할 수도 있지만이 솔루션은 매개 변수 'UniformOutPut'없이 작동하는 것 같습니다. – obchardon

+1

@Adriaan 여기 옥타브에서 테스트 한 온라인 데모입니다 : http://rextester.com/DQEF8827 – rahnema1

+0

@ rahnema1 : 문제 귀하의 접근 방식에서 구조체에 관심이없는 다른 필드가있는 경우에는 myStruct.A라고 말합니다.anotherVar = 'ghj'이면 중첩 된 struct2cell 호출은 'var'또는 'anotherVar'노드 필드 이름을 구별하지 않고 구조체를 병합합니다. –