Detecting values in a vector that are different but very close to each other
    12 次查看(过去 30 天)
  
       显示 更早的评论
    
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 个评论
  J. Alex Lee
      
 2020-2-3
				Then what is the rationale for rounding the 7.1 down to 7?
Might want to move your comment up to this thread
采纳的回答
  Steven Lord
    
      
 2020-2-3
        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 个评论
  J. Alex Lee
      
 2020-2-3
				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.
更多回答(2 个)
  Image Analyst
      
      
 2020-2-3
        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 个评论
  Image Analyst
      
      
 2020-2-3
				Not until you give me the t and y you used.  Because for the original ones, as in my code, it works beautifully.
另请参阅
类别
				在 Help Center 和 File Exchange 中查找有关 Logical 的更多信息
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!