[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: vectorization problem
From: |
Jordi Gutiérrez Hermoso |
Subject: |
Re: vectorization problem |
Date: |
Tue, 1 Nov 2011 18:23:22 -0400 |
On 1 November 2011 13:47, John W. Eaton <address@hidden> 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];
How about the following?
nanpos = isnan (m);
nancols = find (any (nanpos) & ! all (nanpos));
if (any (nancols))
[i, j] = find(nanpos);
minrows = [i(1); i(find (diff (j)) + 1)]';
## If the whole column is nan, ignore it
minrows(minrows == 1) = [];
idx = sub2ind (size (m), minrows - 1, nancols);
vals = m(idx);
m(nanpos) = vals (lookup (nancols, j));
endif
It seems faster on my machine and seems to have a smaller memory
footprint than the existing solution. It's fairly stingy about
creating large intermediate temporaries.
HTH,
- Jordi G. H.