Date: Jul 9, 2013 10:24 PM
Author: Derek Goring
Subject: Re: Replacing `find` with logical indexing

On Wednesday, July 10, 2013 1:20:34 PM UTC+12, dpb wrote:
> On 7/9/2013 7:44 PM, Jeff wrote:
>

> > I am trying to find the smallest nonzero magnitude element of a vector,
>
> > D. Note that D is not integers. I am eliminating nonzero entries using
>
> > the `find` command (first line below). The editor says to replace `find`
>
> > with logical indexing, but replacing `D(find(D))` with `D(D)` returns an
>
> > error. This is not slowing my code very much, but the editor's warning
>
> > is mildly bothersome. How do I use logical indexing to fix this?
>
> >
>
> > nonZeroD = abs(D(find(D)));
>
>
>
> nonZeroD = abs(D(D~-0));
>
>
>

> > lambda = max(nonZeroD(nonZeroD == min(nonZeroD)));
>
> > ICmode = find(D==lambda, 1, 'first');
>
> >
>
> > I also note that the editor doesn't complain about the second `find`.
>
>
>
> Depends on what's done w/ the result. In the second you're using the
>
> truncated version of returning only the first position so logical
>
> addressing doesn't work so cleanly.
>
>
>
> I'm not absolutely positive I follow what you're trying to do but why
>
> isn't it just
>
>
>
> DNZmin=min(abs(D(D~-0))); % ?
>
>
>
> What's the point of the max(DNZ(DNZ==min(DNZ)))? If you've only
>
> collected terms in the vector ==min(vector), then the max is the min by
>
> that selection process.
>
>
>
> --


Oh dpb, what a dreadful typist you are.......
It should be ~=, not ~-:
DNZmin=min(abs(D(D~=0)));

And with floating point numbers, shouldn't it be:
DNZmin=min(abs(D(abs(D)>tol)));
where tol is a small number like 1e-6