Effacer les filtres
Effacer les filtres

Find multiple values closest to zero

18 vues (au cours des 30 derniers jours)
Daniel
Daniel le 12 Août 2020
Modifié(e) : Cris LaPierre le 13 Août 2020
I have a series of vectors all with multiple zero-crossings, but not always the same number. I've tried this, this, this, and this. The problem I'm having is that while some of these methods do identify the zero-crossings, they don't identify the element that is actually nearest to zero. Here's one example of my values:
values = [-0.0263, -0.0271, -0.0275, -0.0282, -0.0294, -0.0309, -0.0329, -0.0354, -0.0384, -0.0421, -0.0464, -0.0515, -0.0641, 0.2518, 0.4427, 0.4327, 0.4815, 0.4355, 0.3909, 0.4520, 0.4081, 0.3172, 0.3184, -0.0160, -0.0682, -0.0296, 0.1749, 0.3400, 0.3742, 0.4142, 0.3927, 0.4292, 0.4517, 0.4163, 0.4437, 0.3968, -0.0689, -0.0462, -0.0399, -0.0347, -0.0304, -0.0267, -0.0236, -0.0210, -0.0188, -0.0170, -0.0154, -0.0141];
If I've tried these methods correctly, they yield indices 13, 23, 26, and 36. I want it to yield 13, 24, 26, and 37 as 24 is closer to zero than 23 and 37 is closer to zero than 36. Is there a one line way to do this or do I have to try one of these other methods and then check nearby values?
Brief update:
I've gotten the result I want with the addition of an if loop. I used find(diff(sign(x)))+1, which identifies the first index after the change in sign. The if loop checks this value against the one before it to see which is closer to zero. Is there a one line version of this?

Réponse acceptée

John D'Errico
John D'Errico le 12 Août 2020
Modifié(e) : John D'Errico le 12 Août 2020
So, you are telling us that you know how to use a fragment like
ind = find(diff(sign(values)))+1
ind =
14 24 27 37
which returns locations of zero crossings. And now, you need to decide which side of that zero crossing is the smaller? Why would you need to use a loop? :)
ind = ind - (abs(values(ind)) > abs(values(ind-1)))
ind =
13 24 26 37
Get used to the idea of using MATLAB to perform vectorized operations. On something like this, there is no need for a loop.

Plus de réponses (1)

Cris LaPierre
Cris LaPierre le 12 Août 2020
Modifié(e) : Cris LaPierre le 13 Août 2020
Here's something that works with your sample data.
ind = find(sign(values(1:end-1))~=sign(values(2:end)));
ind = ind + double((values(ind)-values(ind+1))>0)

Catégories

En savoir plus sur Time Series Events dans Help Center et File Exchange

Produits


Version

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by