2012-08-08 3 views
4
나는 다음과 같은 문제에 직면하고있어

필드은 matlab에

A.B(1,1).x = 'string' 
A.B(1,1).y = 12 
A.B(1,2).x = [] 
A.B(1,2).y = [] 
A.B(1,3).x = 'string2' 
A.B(1,3).y = 4 

을 그리고 난,이 구조에서 빈 2. 행을 제거하고 싶은에 있도록 끝 나는 (1,1)과 (1,3)을위한 필드를 얻는다. 셀로 변환하고 제거한 다음 구조로 돌아가려고했지만 필드의 이름을 다시 입력해야했습니다. 어떻게 할 수 있습니까? 구조물에서의 전환없이 할 수 있습니까?

tia! (대신 any를 사용 [0 1 0]

또는 모든 필드가 비어있는 경우 검사

empty_elems = arrayfun(@(s) all(structfun(@isempty,s)), A.B); 

:

empty_elems = arrayfun(@(s) isempty(s.x) & isempty(s.y),A.B) 

반환 :

답변

1

는 배열 요소가 비어있는 결정하기 위해 루프 또는 arrayfun를 사용하여 요소가 모두가 아니라 비어 있는지 확인하려면 all). 의견 문제에

A.B(empty_elems) = []; 

전체 솔루션을 :

그런 logical indexing를 사용하여 제거

% find array elements that have all fields empty: 
empty_elems = arrayfun(@(s) all(structfun(@isempty,s)), A.B); 

% copy non-empty elements to a new array `C`: 
C = A.B(~empty_elems); 

% find elements of C that have y field >3 
gt3_elems = arrayfun(@(s) s.y<3,C); 

% delete those form C: 
C(gt3_elems) = []; 

단계로이 코드 단계를 실행하고 무슨 일이 일어나고 있는지 이해하기 위해 중간 변수를 분석 할 수 있습니다. 그것은 분명해야합니다.

+0

x, y, z 등과 같은 필드가 더 있으면이 조건을 작성하는 효율적인 방법은 무엇입니까? 때문에 하나의 조건 isempty (sx) 그것은 빈 필드를 제거하지 않습니다 – beginh

+0

어쩌면 [structfun] (http://www.mathworks.nl/help/techdoc/ref/structfun.html) 적용 할 수 있습니다 ... –

+0

실제로 나는 다음에 대해 생각해 보겠습니다. 처음에는 AB 전체에 데이터가 있습니다. 그런 다음 A.B.() .y> 3에 대한 조건을 적용하고, 그렇다면 새로운 구조로 저장합니다.이 빈 A.B. (1,2)가 있습니다 (A.B. (1,2) .y = 2라고 가정 해 봅시다). 한 번에 구조의 빈 필드를 피하는 더 좋은 방법이 있을까요? – beginh