2016-06-26 64 views
0

我有一個載體,例如A = [2.30 2.32 2.67 2.44 2.31 1.23] 我有興趣在這個向量中找到所有最接近(幾乎相等)的值。 上面的答案應該是指數1,2和5.如何在MATLAB中查找矢量內的所有最近值?

我不知道如何規定容差,但結果值應該幾乎相等。任何機構可以提供一個提示?

回答

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-neighbours來解決這個任務。

如果你只是尋找它最相似的價值觀:

  • 定義的閾值。比方說,0.01

  • 選擇向量的第一元素(XI,其中i = 0)

  • 選擇這是不喜所述第一元件(XJ,其中j = I + 1)

  • 比較xi和xj,例如dist = sqrt((xi-xj)^ 2)。如果 dist小於或等於您的閾值,則xi和xj非常相似,即

  • 增量XJ和比較再次

  • 如果XJ是在你的向量的末尾,增加喜

  • 這樣做,直到你比所有元素。
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

+0

我無法預測容差(EPSILON)嗎?另一個例子可能會有所不同。 – erbal

0

採取這種方法不需要任何定義的絕對公差,而不是相對於最小差異的公差是ne EDED。 它總是尋找數據中最接近的組。 在這種形式下,如果您的數據中有完全相同的重複值,您可以很容易地對其進行擴展,以便很好地處理這種情況。

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) 
+0

如果數據集中的兩個值恰好相同,則此代碼將忽略所有接近的較高/較低值。以及如何決定diffFactor? – erbal