如果兩個路徑的長度相同,說ñ,那麼他們在一個2N維空間真正指向。第一個位置確定前兩個維度,第二個位置確定下一個維度,依此類推。例如,如果我們只在您的示例中使用三個點,則路徑可以表示爲單個6維點(1,5,2,7,4,4)。如果我們想將它與另一個三點路徑進行比較,我們可以計算歐幾里德距離(兩點之間每維距離的平方和的平方根)或曼哈頓距離(每維度差的和)。
例如,所有三次停留在(0,0)的鑽孔路徑變爲6維點(0,0,0,0,0,0)。那麼這個點和你的例子路徑之間的歐幾里得距離是sqrt((1-0)^2 + (5-0)^2 + (2-0)^2 + (7-0)^2 + (4-0)^2 + (4-0)^2) = sqrt(111) = 10.54
。曼哈頓的距離是abs(1-0) + abs(5-0) + abs(2-0) + abs(7-0) + abs(4-0) + abs(4-0) = 23
。這些指標之間的差異並不罕見,因爲曼哈頓距離可證明至少與歐幾里得距離一樣大。
這種方法當然有一個問題,並不是所有的路徑長度都是相同的。但是,您可以很容易地將較長的路徑切割成與較短路徑相同的長度,或者考慮將兩條路徑中較短的一條留在同一位置或在測量結束後沿相同方向移動,直到兩條路徑長度相同。這兩種方法都會帶來一些不準確的結果,但無論你做什麼,你都必須處理這樣一個事實,即你在短路徑上缺少數據,必須以某種方式彌補它。
編輯:
假設path1
和path2
是包含點,我們可以切斷長列表相匹配的短名單既List<Tuple<int, int>>
對象:然後
// Enumerable.Zip stops when it finishes one of the sequences
List<Tuple<int, int, int, int>> matchingPoints = Enumerable.Zip(path1, path2,
(tupl1, tupl2) =>
Tuple.Create(tupl1.Item1, tupl1.Item2, tupl2.Item1, tupl2.Item2));
,你可以使用以下代碼查找曼哈頓距離:
int manhattanDistance = matchingPoints
.Sum(tupl => Math.Abs(tupl.Item1 - tupl.Item3)
+ Math.Abs(tupl.Item2 - tupl.Item4));
在相同的假設爲曼哈頓距離,我們可以生成歐氏距離爲:
int euclideanDistanceSquared = matchingPoints
.Sum(tupl => Math.Pow(tupl.Item1 - tupl.Item3, 2)
+ Math.Pow(tupl.Item2 - tupl.Item4, 2));
double euclideanDistance = Math.Sqrt(euclideanDistanceSquared);
這裏需要提供更多的信息。決定「匹配」的邏輯是什麼?如果我使用手勢識別的情況和例如繪製數字'6'的路徑的例子,則根據路徑的形狀(即:大6應該'匹配'小'6'縮放比例),路徑的拓撲結構(即小寫的希臘語「西格瑪」匹配'6'匹配'b'等),路徑的速度(即:快速繪製的6與慢速繪製的不匹配) - 你想達到什麼目的?以什麼準確度?用什麼重量?像這樣的問題需要更多的參數。 – 2012-01-17 19:31:44