也许我应该在Mathoverflow中问这个问题,但是在这里:
我有2个数据集(x和y坐标集),具有不同数量的元素。我必须通过拉伸其中一个数据集(将所有x乘以 m 因子并将所有y乘以 n 因子)并移动来找到它们之间的最佳匹配它(分别将 p 和 q 添加到所有x和y)。
基本上这两组代表不同的曲线,我必须将曲线B(其中元素较少)拟合到曲线A的某些部分(其中包含更多元素)。
如何找到最接近匹配的值 m , n , p 和 q ?
答案可以是伪代码,C,Java或Python。感谢。
答案 0 :(得分:0)
以下是在转换第一条曲线后找到m,n,p和q值的解决方案,它与第二条曲线的一部分完全匹配:
基本上,我们必须解决以下矩阵方程:
[m n][x y]' + [p q]' = [X Y]' ...... (1)
其中[x y]'和[X Y]'分别是第一和第二曲线的坐标。假设第一条曲线具有总l个坐标数,第二条曲线具有总h个坐标数。
(1) implies,
[mx+p ny+1]' = [X Y]'
即我们必须解决:
mx_1+p = X_k, mx_2+p = X_{k+1}, ..., mx_l+p = X_{k+l-1}
ny_1+q = Y_k, ny_2+q = Y_{k+1}, ..., ny_l+q = Y_{k+l-1}
where k+l-1 <= h-l
我们可以通过以下天真的方式解决它:
for (i=1 to h-l){
(m,p) = SOLVE(x1, X_i, x2, X_{i+1})// 2 unknowns, 2 equations
(n,q) = SOLVE(y1, Y_i, y2, Y_{i+1})// 2 unknowns, 2 equations
for (j=3 to l){
if(m*x[j]+p != m*X[i+2]+p)break;//value of m, p found from 1st 2 doesn't work for rest
if(n*y[j]+q != n*Y[i+2]+q)break;//value of n, q found from 1st 2 doesn't work for rest
}
if(j==l){//match found
return i;//returns the smallest index of 2nd curves' coordinates where we found a match
}
}
return -1;//no match found
我不确定是否可以有优化版本。