help-octave
[Top][All Lists]

## Re: vectorization problem

 From: Olaf Till Subject: Re: vectorization problem Date: Tue, 1 Nov 2011 20:04:43 +0100 User-agent: Mutt/1.5.20 (2009-06-14)

```On Tue, Nov 01, 2011 at 01:47:01PM -0400, John W. Eaton wrote:
> Is there an efficient way to replace all NaNs in each column of the
> following matrix by the last non-NaN value in the column?
>
> Example matrix:
>
>   M = [1   3   7
>        2   4   NaN
>        NaN 5   NaN
>        NaN 6   NaN];
>
> Desired result:
>
>       [1   3   7
>        2   4   7
>        2   5   7
>        2   6   7];
>
> For my purposes, I think it is safe to assume that all columns will
> have at least one value that is not NaN, but, as above, there may be
> some columns that do not have any NaN values at all.
>
> This code is needed for __patch__.m in Octave.  The current code to do
> this job is
>
>   nc = size (M, 2);
>   t1 = isnan (M);
>   if (any (t1(:)))

>     t2 = find (t1 != t1([2:end,end],:));

Maybe I'm thinking wrong, but replacing the last line with:

t2 = find (t1 != cat (1, t1([2:end],:), true(1,nc)));

should work (?)

Olaf

>     M(t1) = M(t2 (cell2mat (cellfun (@(x) x(1)*ones(1,x(2)),
>                                      mat2cell ([1:nc; sum(t1)], 2,
> ones(1,nc)),
>                                      "uniformoutput", false))));
>   endif
>
> This works as long as there is at least one NaN value in each column,
> but fails if there are any columns without NaN values.
>
> A loop that works is
>
>   t1 = isnan (M)
>   for i = find (any (t1))
>     first_idx_in_column = find (t1(:,i), 1);
>     M(first_idx_in_column:end,i) = M(first_idx_in_column-1,i);
>   endfor
>
> I've put this looping solution in place for now since it fixes the
> problem, but I'd like to use an efficient solution without loops if
> possible.
>
> OTOH, maybe it doesn't matter that this is a loop given the complexity
> and memory requirements of the solution that requires cell2mat,
> cellfun and mat2cell and doesn't work properly in all cases anyway.
>
> jwe
> _______________________________________________
> Help-octave mailing list