如何在MATLAB中找到矢量中所有最近的值?

时间:2016-06-26 14:34:46

标签: matlab vector

我有一个矢量,例如A = [2.30 2.32 2.67 2.44 2.31 1.23] 我有兴趣在这个向量中找到所有最接近(几乎相等)的值。 上面例子的答案应该是索引1,2和5。

我不知道如何规定公差,但结果值应该几乎相等。任何身体都可以提示吗?

3 个答案:

答案 0 :(得分:1)

我建议采用以下方法:

%initialize A 
A=[2.30 2.32 2.67 2.44 2.31 1.23];

%initilize an epsilon parameter which defines how close 2 values should be to one another to considered identical.
EPSILON = 0.05; 

%generates all possible lists of pairs coordinates from A
[p,q] = meshgrid(1:n);
mask = logical(tril(ones(n,n))-eye(n,n));
allPairs = [p(mask),q(mask)];

%find pairs with absolute difference below epsilon
validPairs = abs(A(allPairs(:,1))- A(allPairs(:,2))) < EPSILON;

%result - pairs of numbers which are close to one another
allPairs(validPairs,:)

结果:

ans =

 1     2
 1     5
 2     5

*生成所有可能对的代码取自@Lambdageek solution

答案 1 :(得分:0)

如果您想用数学术语表示距离,可以使用欧几里德距离。这是表达式:

enter image description here

如果你有更高的维度空间(你有),你可以从维基百科获得一些信息。但它仍然是直截了当的:

https://en.wikipedia.org/wiki/Euclidean_distance#n_dimensions

由于欧几里德距离不是高维空间中的最佳距离度量,因此有人建议余弦相似度:

https://en.wikipedia.org/wiki/Cosine_similarity

您还可以使用k-means或k-nearest-neighbors等算法来解决此任务。

如果您只是在寻找其中最相似的值:

  • 定义阈值。让我们说0.01

  • 选择向量的第一个元素(xi,其中i = 0)

  • 选择第一个不是xi的元素(xj,其中j = i + 1)

  • 比较xi和xj,例如,dist = sqrt((xi - xj)^ 2)。如果 dist小于或等于您的阈值,xi和xj非常小 类似

  • 增加xj并再次比较

  • 如果xj位于向量的末尾,则递增xi

  • 在比较所有元素之前,请执行此操作。

答案 2 :(得分:0)

这种方法不需要任何明确的绝对容差, 相反,需要相对于最小差异的公差。 它总是在数据中寻找最接近的组。 在此表单中,如果您的数据中包含完全重复的值,则无效 但是你可以很容易地扩展它以便很好地处理这种情况。

A=[2.30 2.32 2.67 2.44 2.31 1.23];
diffFactor=3;

Asorted=sort(A);
Adiff=abs(Asorted(1:end-1)-Asorted(2:end));
[minDiff,minInd]=min(Adiff);

commonValue=Asorted(minInd);

resultIndex=find(A>=commonValue-diffFactor*minDiff & A<=commonValue+diffFactor*minDiff)