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