我有一个矢量,例如A = [2.30 2.32 2.67 2.44 2.31 1.23] 我有兴趣在这个向量中找到所有最接近(几乎相等)的值。 上面例子的答案应该是索引1,2和5。
我不知道如何规定公差,但结果值应该几乎相等。任何身体都可以提示吗?
答案 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)
如果您想用数学术语表示距离,可以使用欧几里德距离。这是表达式:
如果你有更高的维度空间(你有),你可以从维基百科获得一些信息。但它仍然是直截了当的:
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)