2013-06-04 5 views
2

지금 Matlab에 문제가 있습니다. 나는 현재 3806 x 122 크기의 대형 셀 어레이에서 모든 NaN을 제거하려고합니다. 비슷한 문제의 솔루션을보고 있었고, 함께 생각해 냈습니다. 그것은이Cellfun이 NaN을 지울 때 행렬을 재정렬합니다.

(ex). 
1 2 3 4 5 5 NaN 
6 5 2 5 6 7 NaN 
2 3 4 5 6 7 NaN 
NaN NaN NaN NaN NaN NaN NaN 

처럼 보이기 때문에

data(cellfun(@(x) any(isnan(x(:))), data)) = []; 

내 매트릭스 내 문제는 내가 배열에 위의 코드의 라인을 적용 할 때 더 NaN을이의 출력을 얻을 것입니다 가지 이상이다.

1 2 3 4 5 5 6 5 2 5 6 7 2 3 4 5 6 7 etc... 

왜 이렇게하는지 이해할 수 없습니다. 또한 각 열에는 해당 제목이 있으므로 열을 삭제하는 데주의해야하며 열을 섞어서는 안됩니다. 어떻게 든 열과 행에 NaN이 있는지 색인을 붙일 수 있으면 도움이 될 것입니다. 따라서 해당 제목을 삭제할 수 있습니다.

결국 제목과 데이터를 다음과 같은 데이터 세트 구조에 넣고 싶습니다.

(ex). 
'title1' 'title2' 'title3' 'title4' 'title5' 'title6' 
1   2   3   4   5   5 
6   5   2   5   6   7 
2   3   4   5   6   7 

모든 도움을 주시면 감사하겠습니다.

안부, 조나단

+0

는'NaN'의 항상 마지막 행과 마지막 열에서, 또는 그들이 주변에 퍼져있는 것이다 것 더 효율적인 방법은? 숫자와 'Nan'이있는 행/열이 있습니까 (마지막 행/열 제외)? –

+0

Robert, NaN의 대다수는 위에 표시된 것처럼 배열의 아래쪽과 측면에 있지만 NaN의 일부 열이 데이터 전체에 분산되어 있습니다. –

답변

1

및 인덱싱

I = ~cellfun(@isnan, data); 
data = data(I(:,1), I(1,:)); 

에 대한 논리적 인덱스의 당신은뿐만 아니라 인덱스에 제목을 I(1,:)를 사용할 수 있습니다.

Irow = ~cellfun(@isnan, data(:,1)); 
Icol = ~cellfun(@isnan, data(1,:)); 
data = data(Irow, Icol); 
+0

도움에 감사드립니다. 이것은 내가 필요한 것일 뿐이었다! –

0

나는 이것보다 더 나은 방법이 확신하지만, 여기에 내가 생각 해낸거야. 예를 들어, 비어 있지 않은 항목을 빈 항목으로 바꾸 겠지만, 귀하의 경우를 조정할 수 있어야합니다. 각 셀은 하나의 요소가있는 경우에 당신은 항상 당신이 첫 번째 행과 열을 사용할 수 있습니다 NaN이의 전체 행이나 열이 있음을 확신하는 경우, 당신은 cellfun(@isnan, data) 대신 cellfun(@(x) any(isnan(x(:))), data)

로 사용할 수 있습니다

d = cell(10,4); 
d{1} = 5; 
d{4} = 10; 
d 
ix = cellfun(@(x) numel(x)>0,d); 
d(ix) = cell(1,numel(sum(ix(:)))); 
d 
관련 문제