2014-04-22 2 views
4

NaN 값을 가진 34 x 1096 배열이 있습니다.배열에서 NaN 값을 제거하고 왼쪽으로 시프트

A = 
NaN 0.2500  NaN 0.3750  NaN 
NaN 0.1100  NaN 0.4310  0.1250 
NaN 0.1250 0.2500 0.3750  0.4310 

내가

A = 
0.2500 0.3750  NaN  NaN  NaN 
0.1100 0.4310  0.1250 NaN  NaN 
0.1250 0.2500  0.3750 0.4310  NaN  

을하고자하는 간단한 방법이 뭐죠 할까?

+0

하단 행이 아닌 대부분의 NaN 값을 가지며, 상단이 상기 비 - 앤 값을 갖는다. 위에서 아래로 때로는 비 (non) - 나노 (nan) 값을 얻지 만 때로는 비 (non) - 나노 값의 개수도 동일하게 유지됩니다. – user758114

+0

회신, 답변 주셔서 감사합니다. 내가 물어 본 직후에 알아 냈으므로 이미 내 질문을 삭제했습니다. 죄송합니다. –

답변

1

간단한 방법은 예를 들어, 각 행에 ~isnan와 루프를 사용하는 것입니다 : 당신이해야하는 경우

B=NaN(size(A)); 
for n=1:size(A,1) 
    B(n,1:sum(~isnan(A(n,:))))=A(n,~isnan(A(n,:))); 
end  

B = 
0.2500 0.3750  NaN  NaN  NaN 
0.1100 0.4310 0.1250  NaN  NaN 
0.1250 0.2500 0.3750 0.4310  NaN 

당신이 다음 A=B을 할당 할 수 있습니다 ... 그리고 네이의없이 할 수 루프, but why bother in this case?

+0

좋은 링크. +1. 그러나 텍스트가 보여 주듯이, 루프를 피하기위한 좋은 이유가 있습니다. –

+0

yea 나는 동의한다. 그리고 그 기사는 2012 년이다. 그래서 나는 TMW를 개선했다. 현재 릴리스에서는 JIT가 향상되었다. 또한 잘못 이해하지 마십시오. 벡터화에 큰 즐거움이 있습니다. 그러나 for-loop는 이해하기 쉽고 "bsxfun"은 적습니다. – bla

1

코드

A = [ 
NaN 0.2500  NaN 0.3750  NaN 
NaN 0.1100  NaN 0.4310  0.1250 
NaN 0.1250 0.2500 0.3750  0.4310] 

[M,N] = size(A) 
[~,col1] = sort(~isnan(A),2,'descend') 

row1 = repmat(1:M,N,1)'; %%//' 
restructured_indices = sub2ind(size(A),row1(:),col1(:)) 
A = reshape(A(restructured_indices),M,N) 

출력

A = 
    0.2500 0.3750  NaN  NaN  NaN 
    0.1100 0.4310 0.1250  NaN  NaN 
    0.1250 0.2500 0.3750 0.4310  NaN 
+0

나 같은 그러나 5 초 더 일찍 대답하기위한 +1 :-) –

+0

예 꽤 유사! 너의 것이 더 짧지 만 :) +1 너의 것;) 그리고 우리는 루프를 싫어하지 마라! : D – Divakar

+0

우리는 대단히! :-) –

2
[~, jj] = sort(isnan(A), 2); 
B = A(bsxfun(@plus, (1:size(A,1)).', (jj-1)*size(A,1))); 
+0

'.'' 뭐하는거야? –

+0

@Jigg'.''은 단지 전 환일뿐입니다. –

+0

그래,'''와 동일합니까? –

관련 문제