C中的动态时间扭曲

问题描述

所以我可以找到很多关于 DTW 的 Python 指南,并且它们可以正常工作。但是我需要把代码翻译成C,但是我写C代码已经一年多了。

所以在 C 代码中我有这两个数组

static int codeLock[6][2] = {
{1,0},{2,671},{3,1400},{4,2000},{5,2800},};;

static int code[6][2] = {
{1,600},1360},1990},};;

我将使用 DTW 来比较数组 codeLock(n)(1) / code(m)(1) 的右侧,因此不应查看 1..5。

但是是的..

在 python 中,我有两个函数,一个用于 euclidean distance,即:

def compute_euclidean_distance_matrix(x,y) -> np.array:
    """Calculate distance matrix
    This method calcualtes the pairwise Euclidean distance between two sequences.
    The sequences can have different lengths.
    """
    dist = np.zeros((len(y),len(x)))
    for i in range(len(y)):
        for j in range(len(x)):
            dist[i,j] = (x[j]-y[i])**2
    return dist

另一个用于 accumulated cost

def compute_accumulated_cost_matrix(x,y) -> np.array:
    """Compute accumulated cost matrix for warp path using Euclidean distance
    """
    distances = compute_euclidean_distance_matrix(x,y)
    # Initialization
    cost = np.zeros((len(y),len(x)))
    cost[0,0] = distances[0,0]

    for i in range(1,len(y)):
        cost[i,0] = distances[i,0] + cost[i-1,0]  
        
    for j in range(1,len(x)):
        cost[0,j] = distances[0,j] + cost[0,j-1]  

    # Accumulated warp path cost
    for i in range(1,len(y)):
        for j in range(1,len(x)):
            cost[i,j] = min(
                cost[i-1,j],# insertion
                cost[i,j-1],# deletion
                cost[i-1,j-1]   # match
            ) + distances[i,j] 
            
    return cost

此代码来自我为了解 DTW 的工作原理而遵循的指南,但它是在 Python 中编写的,我需要在 C 中使用。

这可以很容易地在 python 中进行测试,如下所示:

x = [0,671,1400,2000,2800]
y = [0,600,1360,1990,2800]

compute_euclidean       = compute_euclidean_distance_matrix(x,y)
compute_accumulated     = compute_accumulated_cost_matrix(x,y)


print("\ncompute_euclidean_distance_matrix")
print(compute_euclidean)
print("\ncompute_accumulated_cost_matrix")
print(compute_accumulated)
print("\nflipud")
print(np.flipud(compute_accumulated))

这是我的输出

Console output

我也研究过 fastdtw,然后我的测试看起来像这样

x = [0,2800]

dtw_distance,warp_path = fastdtw(x,y,dist=euclidean)

print("\ndtw_distance")
print(dtw_distance)

这是我的输出

Console output

你们中有人知道哪里有关于如何用 C 完成所有这些操作的 GitHub/指南吗?因为那会对我有很大帮助。如果您愿意帮我翻译这段代码,我当然会很感激。

解决方法

动态时间扭曲的 C 实现在 documentation

你总是可以使用 Cython https://github.com/wannesm/dtaidistance/tree/master/dtaidistance/lib/DTAIDistanceC/DTAIDistanceC 将 python 翻译成 C 但是生成的代码有时不起作用,完全重写更好

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...