2016-04-17 29 views
2

我想創建一個動態時間規整(DTW)函數,它將計算提供給它的兩個信號之間的最小距離。它是基於以下算法,DTW算法OCT文件

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

現在我能創造這個算法的八度音功能和它的正常工作。

八度音功能 -

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]

    輸出:

    對於倍頻功能:答是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 /倍頻程的GUI':malloc()函數:內存破壞:0x00007f24e81eb230 *

  2. 輸入:ARG1:A =蘭特(1221),Args2:B =蘭特(1299)

    輸出

    對於八度音功能:答是72.63

    對於OCT文件:

    *錯誤在`/ usr/lib中/ x86_64的-Linux的GNU /倍頻程/4.0.0/exec/x86_64-pc-linux-gnu/octave-gui':雙重空閒或損壞(!prev):0x00007f57a06ad940 * 恐慌:中止 - 停止自己... A的大小是B的21221大小is299row col222300ro w end9999col end9999Ans是:1嘗試將變量保存到'octave-workspace'... 保存到「八度,工作空間」完整 中止(核心轉儲)

我的問題:

  1. 首先,這是什麼雙重釋放損壞錯誤我使用OCT時獲得文件?

  2. Octave文件和OCT文件的答案是不同的,OCT文件中的錯誤是什麼造成的?

謝謝。

回答

3

首先,你應該閱讀如何調試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; 
    } 
} 

矩陣結果具有尺寸行,列,但你寫,直到i<=row and j<=col這是超越界限的1。嘗試i<rowj<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)); 
    } 
} 
+0

謝謝。只是一個小編輯,使用簡單的abs會導致錯誤,而std :: abs正在工作。 – Mohit

+0

有趣的是,我用「mkoctfile -v -g dwt3.cc」編譯它沒有任何問題。你在用什麼編譯器? – Andy