2013-08-01 1 views
2

I 문자열 vals 세트가없는 구조의 데이터에 액세스 :예컨대 루프

vals = {'AD', 'BC'} 

은 또한 내부에있는 배열 vals의 요소에 대응하는 필드에 중첩 구조체는, 구조체 info을 (이 예제에서 'AD'와 'BC'가 될 것입니다.) 각각은 차례로 lastcontract이라는 필드에 번호를 저장합니다.

for index = 1:length(vals) 
    info.(vals{index}).lastcontract 
end 

내가 원하는 모든 경우에 루프없이 가능한이 일을하는 방법을 찾기 위해,하지만 난 ':

나는이 같은 valslastcontract를 추출하기 위해 for 루프를 사용할 수 있습니다 운이 없다. 시도 :

info.(vals{1:2}).lastcontract 

성공하지 못했습니다. 내 생각에 arrayfun이 적절한 방법 일지 모르지만 올바른 구문을 이해할 수는 없습니다.

+5

'arrayfun'은 숨겨진 루프이며 명시적인 것보다 느립니다. – Oleg

+2

'for '루프를 두려워하지 마십시오. 때로는 완벽하게 훌륭하고 심지어 가장 적합한 솔루션이기도합니다. – horchler

+0

@OlegKomarov하지만 단순한 원 - 라이너에 유용 할 수 있습니다. –

답변

5

이 명시 적 루프 (도 arrayfun/cellfun)없이 관리하려면 여기를 사실 수 있습니다 :

C = struct2cell(info);     %// Convert to cell array 
idx = ismember(fieldnames(info), vals); %// Find fields 
C = [C{idx}];       %// Flatten to structure array 
result = [C.lastcontract];    %// Extract values 

PS
cellfun 당신이 (셀을 vals을 반복하기 때문에, arrayfun보다 여기에 더 적합 할 것 정렬). 연습을 위해서 cellfun의 해결책은 다음과 같습니다.

result = cellfun(@(x)info.(x).lastcontract, vals); 
+0

매우 똑똑하지만이 메모리와 성능면에서 얼마나 효율적입니까? – horchler

관련 문제