How to efficiently replace NAN with Numirical value a reference vector

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;

답변 (2개)

Guillaume
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));
balandong
balandong 2019년 2월 8일

0 개 추천

Thanks for the quick response. While your approach look elegant, but it consume to much memory if the array become larger. As for my case, WithNan (50 * 500). However, I did not specify about the dimension issue in the original question. Anyhow, II really appreciate for your response.

카테고리

도움말 센터File Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

질문:

2019년 2월 8일

답변:

2019년 2월 8일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by