Detecting values in a vector that are different but very close to each other

13 visualizaciones (últimos 30 días)
Hello there:
I have a t vector (time, increasing values) like this:
t=[ 1 1.1 2 3 3.1 4.1 5 6 7.1 7.2]
to which corresponds y values
y=[ 10 12 10 9 1 12 12 4 9 12 ]
I would like to remove in x the values whose difference to the next one is <= 0.1, so I get a
t_new=[ 1 2 3 4.1 5 6 7.1] and then to make a corrspondenece to the new y, in a way that the y values correspondent to the similar x values are added, so:
y_new=[10+12 10 9+1 12 12 4 9+12]
Thanks in advance!!
Regards
  3 comentarios
J. Alex Lee
J. Alex Lee el 3 de Feb. de 2020
Then what is the rationale for rounding the 7.1 down to 7?
Might want to move your comment up to this thread
Paramonte
Paramonte el 3 de Feb. de 2020
sorry I did a mistake: i want to keep 7.1. I edited to correct this. Cheeers

Iniciar sesión para comentar.

Respuesta aceptada

Steven Lord
Steven Lord el 3 de Feb. de 2020
Use uniquetol to unique-ify the data with a tolerance. uniquetol can return a vector of indices that indicate to which of the unique values each original value corresponds. Then use accumarray to accumulate the corresponding values of the second vector together.
t=[ 1 1.1 2 3 3.1 4.1 5 6 7.1 7.2];
y=[ 10 12 10 9 1 12 12 4 9 12 ];
[t2, ~, ind2] = uniquetol(t, 0.11);
ynew = accumarray(ind2, y);
uniqueItemsWithValues = [t2.', ynew]
  2 comentarios
J. Alex Lee
J. Alex Lee el 3 de Feb. de 2020
Cool, never knew about uniquetol, but on looking at the doc, isn't there an ambiguity about which value (within a tolerance) is returned? If this can be used as answer to the original question, it suggests that uniquetol will always return the lowest value in the tolerance-group as "the unique" value...running the example, this appears true, and it does not appear to be a side effect of the original order of t. This decision doesn't seem like a unique obvious choice to me...I could imagine wanting the average of the tolerance-group, or the max...or in general wanting to apply some custom function.
Paramonte
Paramonte el 3 de Feb. de 2020
I must thak Image Analist and Steven Lord for your time and effot.
Steven reply worked perfectely.
many thanks indeed

Iniciar sesión para comentar.

Más respuestas (2)

Paramonte
Paramonte el 3 de Feb. de 2020
Thakn you for your reply.
Yes I want to keep the 4.1 since the next valu is 5 so, 5-4.1=0.9 which is over 0.1

Image Analyst
Image Analyst el 3 de Feb. de 2020
This works:
t=[ 1 1.1 2 3 3.1 4.1 5 6 7.1 7.2]
y=[ 10 12 10 9 1 12 12 4 9 12 ]
dt = diff(t)
bigDiff = dt >= 0.11 % Change according to what you think is a big enough difference.
badIndexes = find(~bigDiff) + 1
goodIndexes = [1, find(bigDiff) + 1]
yCopy = y;
yCopy(badIndexes - 1) = yCopy(badIndexes - 1) + yCopy(badIndexes)
t_new = t(goodIndexes)
y_new = yCopy(goodIndexes)
Adapt as needed.
  4 comentarios
Image Analyst
Image Analyst el 3 de Feb. de 2020
Not until you give me the t and y you used. Because for the original ones, as in my code, it works beautifully.
Paramonte
Paramonte el 3 de Feb. de 2020
you are right, only needed to transpode a vector. Cheers!!

Iniciar sesión para comentar.

Productos


Versión

R2019a

Community Treasure Hunt

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

Start Hunting!

Translated by