MATLAB: Filling nans between two values

nan

Hi,
I have matrices in which I want to fill the nans with the last available number. for example: A=[ 1 nan;nan 3;nan 2;4 nan;nan nan]; I want it to become A=[ 1 nan;1 3;1 2;4 2;4 2]; Is there an easy way of replacing these nans without running a loop. I have large matrices and I need to do this frequently. So,I am wondering if an easy command exists.

Best Answer

A=[ 1 nan;nan 3;nan 2;4 nan;nan nan]
A(A==0)=inf;
A0 = A;
A0(isnan(A0)) = 0;
n0 = A0~=0;
A1 = A0(n0);
idn = cumsum(n0);
idn(idn==0)=nan;
idx = bsxfun(@plus,idn,[0 idn(end,1:end-1)]);
idx2 = idx;
tnn = isnan(idx2);
idx2(tnn)=1;
out = A1(idx2);
out(tnn)=nan;
out(isinf(out))=0;
small corrections
Aoz = A==A;
A1 = A(Aoz);
i1 = cumsum(Aoz);
im = bsxfun(@plus,[0 i1(end,1:end-1)]);
out = A1(im);
out(i1==0)=nan;
last variant
Aoz = A==A;
A1 = A(Aoz);
i1 = cumsum(Aoz);
im = bsxfun(@plus,i1,[0 cumsum(i1(end,1:end-1))]);
out = A1(im+(im==0));
out(i1==0)=nan;
more variant with use reshape
>> A
A =
NaN 0 NaN 0
6 NaN 6 2
0 3 6 NaN
NaN 6 3 NaN
NaN 6 5 6
>> Aoz = A==A;
A1 = A(Aoz);
i2 = reshape(cumsum(Aoz(:)),size(Aoz));
out = A1(i2+(i2==0));
out(cumsum(Aoz)==0)=nan
out =
NaN 0 NaN 0
6 0 6 2
0 3 6 2
0 6 3 2
0 6 5 6
>>