How to efficiently replace NAN with Numirical value a reference vector
    조회 수: 7 (최근 30일)
  
       이전 댓글 표시
    
Dear User,
As per the title, may I know how to make the following code much compact and efficient. I wonder if the number of FOR-Loops can be reduced further?
Thanks in advance.
Refr=[1 20 1 4 5 2];
WithNan=[1 NaN 1 3 2 2;
    1 2 1 NaN 50 2;
    NaN NaN 4 9 NaN NaN;
    NaN NaN NaN 9 NaN NaN];
NoNan=zeros(size(WithNan,1),size(WithNan,2));
for f_x=1:size(WithNan,1)
    SelctCase=WithNan(f_x,:);
    NaNLoc=find (isnan(SelctCase));
    RefForNaN=Refr(NaNLoc);
    for f_xx=1:size(NaNLoc,2)
    SelctCase(NaNLoc(f_xx))=RefForNaN(f_xx);
    end
    NoNan(f_x,:)=SelctCase;
댓글 수: 0
답변 (2개)
  Guillaume
      
      
 2019년 2월 8일
        
      편집: Guillaume
      
      
 2019년 2월 8일
  
      Certainly, the inner for loop is unnecessary (and the find, use logical indexing). 
Refr=[1 20 1 4 5 2];
WithNan=[1 NaN 1 3 2 2;
    1 2 1 NaN 50 2;
    NaN NaN 4 9 NaN NaN;
    NaN NaN NaN 9 NaN NaN];
NoNan = WithNan;
for row = 1:size(WithNan, 1)
    toreplace = isnan(WithNan(row, :)); 
    NoNan(row, toreplace) = Refr(toreplace);
end
But loops are not needed at all:
NoNan = WithNan;
filler = repmat(Refr, size(NoNan, 1), 1);
NoNan(isnan(NoNan)) = filler(isnan(NoNan));
댓글 수: 0
참고 항목
카테고리
				Help Center 및 File Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
