我有
data = [1 1.2 1.3 1.5 1.8]
我想从这一点的数据中找到前后最接近的值,
b = 1.23
我该怎么做?
这是另一种方法。向量
data
无需排序,并且 b
可以为正值或负值。
[~,I] = min(abs(data-b));
c = data(I);
如果数据已排序,您可以使用 find:
i_lower = find(data <= b,1,'last');
i_higher = find(data >= b,1,'first');
lower_than_b = data(i_lower)
higher_than_b = data(i_higher)
怎么样
min(abs(data - b))
?
此方法概括了 Doubt 对您正在搜索的
b
中存在多个元素的情况的回答:
ind=knnsearch(data',b)
c=data(ind)
返回
ind
中与 data
中列出的元素最接近的一个或多个元素的索引(或索引数组)b
。
请注意,数据被转置,因为要搜索的集合需要是列向量。如果有多个元素那么它也应该是一个列向量。
此外,此方法可以推广为给出第二、第三、第四......最近的邻居(请参阅文档)。
它还推广到数据具有更高维度的情况(如果
d
维度,则 test
和 b
将具有 d
列)。
这可能有点老套且效率低下,但我使用
interp1
来查找单个最接近的值,如下所示:
nearestTo = @(x, xq) interp1(x, x, xq, 'nearest');
nearestTo([2 4 6 8 10], [pi 2*pi 3*pi]) % 4 6 10
nearestTo(sort([2 7 11 3 5]), abs(-3.5)) % 3
data = [1 1.2 1.3 1.5 1.8]
b = 1.23
find(abs(data-b)==min(abs(data-b)))