2012-10-10 1 views
2

나는 32x1 struct array입니다. 이 배열의 각 요소에는 여러 필드가 있습니다. 어떤 요소가 비어 있는지 확인하려고하는데, 비어 있지 않은 모든 요소가있는 벡터를 만들고 싶습니다.Matlab의 구조체 배열에서 빈 필드를 검사하고 비어 있지 않은 모든 벡터를 저장하려면 어떻게해야합니까?

예를 들어 나는, 그래서 satdata(i).SVIDstruct array 분야 SVID이 비어있는 경우 내가보고 싶은있는, satdata라고 있습니다. SVID는 다른 요소들에 대해 1에서 32까지 가야합니다. 그러나 누락 된 요소가있는 경우 [1:4 6:10 11:32]이 될 수 있습니다. 그래서 이것은 내가 지금까지 무엇을 가지고

[1;2;3;4;6;7;8;9;10;11;12;13;14;15;16;17;18;19...32]. 

(이 경우에) 인 열 벡터를 만들 : 올바르게 빈 슬롯을 검사

for i = 1:32 
    if isempty(satdata(i).SVID) 
     continue 
    else 
    svid = satdata(i).SVID; 
    svIdVec(i,:) = svid; 
    end 
end 

,하지만 내가 만들 때 벡터 나는 svIdVec = [0,2,3,4...32]처럼 보이는 것을 얻는다. 이 경우 첫 번째 요소 만 비어 있습니다. 따라서 [2,3,4...32]과 같은 31x1 벡터를 가져 오려고합니다.

답변

4

경우 : SVID 필드가 벡터 인 경우

svIdVec = {satdata.SVID}; 
[svIdVec{~cellfun(@isempty,svIdVec)}]'; % select only the non-empty values 

을하고 매트릭스가 집계 할은해야 다음 used (위의 스칼라 코드는 벡터 처리에 사용할 수 없음) :

svIdVec = {satdata.SVID}'; 
svid = ~cellfun(@isempty,svIdVec); 
svIdVec = cell2mat(svIdVec(svid)); 
1

귀하의 문제는 현재 svIdVec의 다시 여기 내가 교체해야

svIdVec(i,:) = svid; 

문자열

입니다.

가능한 해결 방법 당신은 루프가 필요하지 않습니다

svIdVec = []; 
for i = 1:32 
    if isempty(satdata(i).SVID) 
     continue 
    else 
    svid = satdata(i).SVID; 
    svIdVec = [svIdVec, svid]; 
    end 
end 
관련 문제