我有一個載體,例如A = [2.30 2.32 2.67 2.44 2.31 1.23] 我有興趣在這個向量中找到所有最接近(幾乎相等)的值。 上面的答案應該是指數1,2和5.如何在MATLAB中查找矢量內的所有最近值?
我不知道如何規定容差,但結果值應該幾乎相等。任何機構可以提供一個提示?
我有一個載體,例如A = [2.30 2.32 2.67 2.44 2.31 1.23] 我有興趣在這個向量中找到所有最接近(幾乎相等)的值。 上面的答案應該是指數1,2和5.如何在MATLAB中查找矢量內的所有最近值?
我不知道如何規定容差,但結果值應該幾乎相等。任何機構可以提供一個提示?
如果要用數學術語表示距離,可以使用歐幾里得距離。這裏是表達:
如果你有一個高維空間(你),你可以從維基百科的一些信息。但它仍然是直截了當:
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是在你的向量的末尾,增加喜
我建議以下方法:
%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
採取這種方法不需要任何定義的絕對公差,而不是相對於最小差異的公差是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)
如果數據集中的兩個值恰好相同,則此代碼將忽略所有接近的較高/較低值。以及如何決定diffFactor? – erbal
我無法預測容差(EPSILON)嗎?另一個例子可能會有所不同。 – erbal