C 中的动态时间规整
Dynamic time warping in C
所以我可以在 python 的 DTW 上找到很多指南,它们可以正常工作。但是我需要将代码翻译成 C,但是我写 C 代码已经一年多了。
所以在 C 代码中我有这两个数组
static int codeLock[6][2] = {
{1, 0},
{2, 671},
{3, 1400},
{4, 2000},
{5, 2800},
};;
static int code[6][2] = {
{1, 0},
{2, 600},
{3, 1360},
{4, 1990},
{5, 2800},
};;
而且我要用 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))
这是我的输出
我也研究过 fastdtw
,然后我的测试看起来像这样
x = [0, 671, 1400, 2000, 2800]
y = [0, 600, 1360, 1990, 2800]
dtw_distance, warp_path = fastdtw(x, y, dist=euclidean)
print("\ndtw_distance")
print(dtw_distance)
这是我的输出
你们中有人知道哪里可能有关于如何在 C 中完成所有这些的 GitHub/guide 吗?因为那会对我有很大帮助。如果您愿意帮我翻译这段代码,我将不胜感激。
动态时间扭曲的 C 实现在 https://github.com/wannesm/dtaidistance/tree/master/dtaidistance/lib/DTAIDistanceC/DTAIDistanceC
您总是可以使用 Cython python 将 python 翻译成 C https://people.duke.edu/~ccc14/sta-663/FromPythonToC.html 但是生成的代码有时不起作用,完全重写更好
所以我可以在 python 的 DTW 上找到很多指南,它们可以正常工作。但是我需要将代码翻译成 C,但是我写 C 代码已经一年多了。
所以在 C 代码中我有这两个数组
static int codeLock[6][2] = {
{1, 0},
{2, 671},
{3, 1400},
{4, 2000},
{5, 2800},
};;
static int code[6][2] = {
{1, 0},
{2, 600},
{3, 1360},
{4, 1990},
{5, 2800},
};;
而且我要用 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))
这是我的输出
我也研究过 fastdtw
,然后我的测试看起来像这样
x = [0, 671, 1400, 2000, 2800]
y = [0, 600, 1360, 1990, 2800]
dtw_distance, warp_path = fastdtw(x, y, dist=euclidean)
print("\ndtw_distance")
print(dtw_distance)
这是我的输出
你们中有人知道哪里可能有关于如何在 C 中完成所有这些的 GitHub/guide 吗?因为那会对我有很大帮助。如果您愿意帮我翻译这段代码,我将不胜感激。
动态时间扭曲的 C 实现在 https://github.com/wannesm/dtaidistance/tree/master/dtaidistance/lib/DTAIDistanceC/DTAIDistanceC
您总是可以使用 Cython python 将 python 翻译成 C https://people.duke.edu/~ccc14/sta-663/FromPythonToC.html 但是生成的代码有时不起作用,完全重写更好