【问题标题】:How to find all nearest values within a vector in MATLAB?如何在MATLAB中找到向量内的所有最近值?
【发布时间】:2016-06-26 14:34:45
【问题描述】:

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

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

【问题讨论】:

    标签: matlab vector


    【解决方案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

    【讨论】:

    • 我无法提前猜到公差 (EPSILON)?另一个例子可能会有所不同。
    【解决方案2】:

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

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

    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)

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

    • 增加 xj 并再次比较

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

    • 执行此操作,直到您比较了所有元素。

    【讨论】:

      【解决方案3】:

      这种方法不需要任何定义的绝对公差, 相反,需要相对于最小差异的容差。 它总是在数据中寻找最接近的组。 如果您的数据中有完全重复的值,在这种形式中它将不起作用, 但您也可以轻松扩展它以很好地处理这种情况。

      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)
      

      【讨论】:

      • 如果数据集中的两个值恰好相同,则此代码将忽略所有更接近的更高/更低值。以及如何决定diffFactor?
      猜你喜欢
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      • 2011-02-22
      • 2015-01-10
      • 1970-01-01
      • 2019-06-01
      相关资源
      最近更新 更多