【问题标题】:DTW Algorithm OCT-fileDTW 算法 OCT 文件
【发布时间】:2016-08-09 02:44:32
【问题描述】:

我正在尝试创建一个动态时间规整 (DTW) 函数,该函数将计算提供给它的两个信号之间的最小距离。它基于以下算法,

DTW 算法:-

int DTWDistance(s: array [1..n], t: array [1..m]) {
    DTW := array [0..n, 0..m]

    w := abs(n-m)// adapt window size (*)

    for i := 0 to n
        for j:= 0 to m
            DTW[i, j] := infinity
    DTW[0, 0] := 0

    for i := 1 to n
        for j := max(1, i-w) to min(m, i+w)
            cost := d(s[i], t[j])
            DTW[i, j] := cost + minimum(DTW[i-1, j  ],    // insertion
                                        DTW[i, j-1],    // deletion
                                        DTW[i-1, j-1])    // match

    return DTW[n, m]

更多信息DTW Algorithm

现在我能够创建该算法的 Octave 函数并使其正常工作。

八度函数:-

function dtw_distance = dtw2(a,b)

length_a = length(a);
length_b = length(b);

an=zeros(length_a+1,length_b+1);
an(:,:)=9999;
an(1,1)=0;
cost=0;

#Here we have also implemented the window size.
w=abs(length_a-length_b);

for i=1:length_a
    for j=max(1,i-w):min(length_b,i+w)
        cost=abs(a(i)-b(j));
        an(i+1,j+1)=cost+min([an(i,j+1),an(i+1,j),an(i,j)]);
    end
end

an;
dtw_distance=an(length_a+1,length_b+1);

现在这段代码的计算时间随着参数大小的增加而增加。因此,我正在尝试创建用 C++ 编写的 OCT 文件以加快执行速度。

C++ OCT 文件:-

#include <octave/oct.h>

octave_idx_type getMax(octave_idx_type a, octave_idx_type b){
    return (a>b)?a:b;
}

octave_idx_type getMin(octave_idx_type a, octave_idx_type b){
    return (a<b)?a:b;
}

DEFUN_DLD (dtw3, args, , "Find DTW of two Signals With Window")
{

int nargin = args.length();

if (nargin != 2)
    print_usage();
else
{

    NDArray A = args(0).array_value();
    NDArray B = args(1).array_value();

    octave_stdout << "Size of A is" << A.length();
    octave_stdout << "Size of B is" << B.length();

    if (! error_state)
    {
        octave_idx_type row = A.length()+1;
        octave_idx_type col = B.length()+1;

        Matrix results (row,col);

        for(octave_idx_type i = 0; i <= row ; i++)
        {
            for(octave_idx_type j=0; j<= col ; j++)
            {
                results(i,j)=9999;
            }
        }

        octave_stdout << "row col" << results.dim1() << results.dim2() ;
        octave_stdout << "row end" << results(row,0) ;
        octave_stdout << "col end" << results(0,col) ;

        results(0,0)=0;

        octave_idx_type win = (row>col)?(row-col):(col-row);

        octave_idx_type cost = 0;

        for(octave_idx_type i = 1 ; i <= row ; i++)
        {
            for(octave_idx_type j = getMax(1,i-win) ; j <= getMin(col,i+win) ; j++)
            {
                cost=(A(i)>B(j))?(A(i)-B(j)):(B(j)-A(i));
                results(i,j)= cost + getMin(getMin(results(i-1,j),results(i,j-1)),results(i-1,j-1));

            }
        }
        octave_stdout << "Ans is: " << results(row,col);
        return octave_value(results(row,col));
    }

}

}

示例输入/输出

  1. 输入 - Arg1:[1 2 3 4 5],Arg2:[1 2 3 4 5 6 7]

    输出:

    对于八度函数: Ans 是 3

    对于 OCT 文件: * /usr/lib/x86_64-linux-gnu/octave/4.0.0/exec/x86_64-pc-linux-gnu/octave-gui': double free or corruption (!prev): 0x00007f24e81eb0a0 *** panic: Aborted -- stopping myself... *** Error in/usr/lib/x86_64-linux-gnu/octave/4.0.0/exec/x86_64-pc-linux-gnu/octave-gui' 中的错误:malloc():内存损坏:0x00007f24e81eb230 *

  2. 输入:Arg1:A=rand(1,221),Args2:B=rand(1,299)

    输出

    对于八度函数:Ans 是 72.63

    对于 OCT 文件:

    * `/usr/lib/x86_64-linux-gnu/octave/4.0.0/exec/x86_64-pc-linux-gnu/octave-gui' 中的错误:双重释放或损坏 (!prev) : 0x00007f57a06ad940 * 恐慌:中止 - 阻止自己...... A 的大小是221B 的大小是299row col222300row end9999col end9999Ans 是:1 试图将变量保存到'octave-workspace'... 保存到“octave-workspace”完成 中止(核心转储)

我的问题:

  1. 首先,我在使用 OCT 文件时遇到的这种双重免费损坏错误是什么?

  2. Octave 文件和 OCT 文件的答案不同,OCT 文件的错误是什么导致的?

谢谢。

【问题讨论】:

标签: c++ linux algorithm octave


【解决方案1】:

首先,您应该阅读如何调试 oct 文件 (http://wiki.octave.org/Debugging_Octave#Debugging_oct-files)

然后你会发现这部分:

Matrix results (row,col);
for(octave_idx_type i = 0; i <= row ; i++)
{
    for(octave_idx_type j=0; j<= col ; j++)
    {
        results(i,j)=9999;
    }
}

矩阵结果具有维度行 col,但您正在写入直到 i&lt;=row and j&lt;=col 超出界限 1。试试i&lt;rowj&lt;col

您的代码中有太多问题无法描述,这里是我的更改。我已经替换了一些内置函数:

#include <octave/oct.h>

DEFUN_DLD (dtw3, args, , "Find DTW of two signals with window")
{

  int nargin = args.length();

  if (nargin != 2)
    print_usage();

  Matrix A = args(0).array_value();
  Matrix B = args(1).array_value();

  octave_stdout << "Size of A is " << A.length() << std::endl;;
  octave_stdout << "Size of B is " << B.length() << std::endl;

  if (! error_state)
    {
      octave_idx_type n = A.length();
      octave_idx_type m = B.length();

      Matrix results (n + 1, m + 1);

      for(octave_idx_type i = 0; i <= n ; i++)
        for(octave_idx_type j = 0; j <= m ; j++)
          results(i, j) = octave_Inf;
      results(0, 0) = 0;

      octave_idx_type win = abs (n-m);

      double cost = 0;

      for(octave_idx_type i = 1 ; i <= n ; i++)
        for(octave_idx_type j = std::max(1, i-win) ; j <= std::min(m, i+win) ; j++)
          {
            cost = abs(A(i-1) - B(j-1));
            results(i, j) = cost + std::min(std::min(results(i-1,j),results(i,j-1)),results(i-1,j-1));
          }

      //octave_stdout << results << std::endl;
      return ovl(results(n, m));
    }
}

【讨论】:

  • 谢谢。只是一个小的编辑,简单地使用 abs 会导致错误,而 std::abs 正在工作。
  • 有趣,我用“mkoctfile -v -g dwt3.cc”编译它没有问题。你用的是什么编译器?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
相关资源
最近更新 更多