[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
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
> address@hidden
> https://mailman.cae.wisc.edu/listinfo/help-octave