关于算法:将一条曲线拟合到另一条曲线的某个段

Fitting a curve to some segment of another curve

也许我应该在 Mathoverflow 中问这个问题,但它是这样的:

我有 2 个元素数量不同的数据集(x 和 y 坐标集)。我必须通过拉伸其中一个数据集(将所有 x 乘以 m 因子和所有 y 乘以 n 因子)并移动它(将 p 和 q 分别添加到所有 x 和 y)来找到它们之间的最佳匹配.

基本上这两组代表不同的曲线,我必须将曲线 B(元素较少)拟合到曲线 A 的某些部分(元素更多)。

如何找到最接近匹配的值 m、n、p 和 q?

答案可以是伪代码、C、Java 或 Python。谢谢。


以下是在转换第一条曲线后与第二条曲线的一部分完全匹配时找到值 m、n、p 和 q 的解决方案:

基本上,我们必须求解以下矩阵方程:

1
[m n][x y]' + [p q]' = [X Y]' ...... (1)

其中[x y]\\'和[X Y]\\'分别是第一条和第二条曲线的坐标。让我们假设第一条曲线的坐标总数为 l,第二条曲线的坐标总数为 h。

1
2
(1) implies,
[mx+p ny+1]' = [X Y]'

即我们必须解决:

1
2
3
4
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

我们可以通过以下幼稚的方式来解决它:

1
2
3
4
5
6
7
8
9
10
11
12
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

我不确定是否有优化版本。