C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[43227] Dynamic 알고리즘 보실 줄 아시는 분 '';
이성제 [14dia] 1549 읽음    2006-01-09 17:07
음성인식 공부 하신 분은 아시겠지만

DTW 알고리즘 입니다.

음성과는 직접적인 관련은 없는데요 '';

그냥 DTW 알고리즘 일 뿐입니다.

설명을 좀 드리자면, 두 숫자 사이에

최단 거리를 구하는게 DTW 알고리즘이죠.

두 숫자가 19 까지는 잘 작동 하는데

20 부터는 뻗어 버리는 특징이 있네요 '';

어디가 문제가 됬는지좀 알려주세요.







//---------------------------------------------------------------------------

#include <vcl.h>
#include <math.h>
#pragma hdrstop

#define MAX_FLOAT 1e10
int Tx;
int Ty;
int no_path=3;
struct points{
    int ix;
    int iy;
} s_points[1000];
int no_step[3]={2,1,2};
int dx[3][2]={
    { -1, -2 },
    { -1, 0 },
    { 0, -1 }
};
int dy[3][2]={
    { 0, -1 },
    { -1, 0 },
    { -1, -2 }
};
int cnt;
float che[100000][3];
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
float calc_distance(int ix,int iy)
{
    float f1,f2;
    f1= sin(3.1416/Tx*ix);
    f2= sin(3.1416/Ty*iy);
    return (f2-f1)*(f2-f1);
}
//---------------------------------------------------------------------------
float dtw(int ix, int iy, int depth )
{
    int i,j;
    int ixp;
    int iyp;
    float val;
    float min_val;
    int min1,max1,min2,max2;
    float d_local;
    int flag;
    int new_depth;
                int buf;

    if(ix==1 && iy==1) return 0;
    min_val=MAX_FLOAT;
    for(i=0;i<no_path;i++)
    {
        d_local=0;
        flag=1;
        for(j=0;j<no_step[i];j++)
        {
            ixp=ix+dx[i][j]; iyp=iy+dy[i][j];  
                                                min1=1+(ixp-1)/4;
            max1=1+(ixp-1)*4;
            min2=Ty+(ixp-Tx)*4;
            max2=Ty+(ixp-Tx)/4;
            if( iyp >= min1 && iyp <=max1 && iyp >= min2 && iyp <=max2 && ixp<= Tx && iyp <=Ty)
            {
                d_local += calc_distance(ixp,iyp);
            }
            else
            {
                d_local=MAX_FLOAT;
                flag=0;
            }
        }
        d_local=d_local/no_step[i];
        new_depth=depth+1;
        if(flag==1)
        {
           
            val = d_local+dtw(ixp,iyp,new_depth);
        }
        else
        {
                      val=MAX_FLOAT;
        }

        if( val < min_val )
            min_val=val;
    }

    return min_val;
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    float val;

    Tx=StrToInt(Edit1->Text);
    Ty=StrToInt(Edit2->Text);
    val=dtw(Tx,Ty,0);
    Memo1->Clear();
    Memo1->Lines->Add(" min val= "+FloatToStr(val));
}
//---------------------------------------------------------------------------

+ -

관련 글 리스트
43227 Dynamic 알고리즘 보실 줄 아시는 분 ''; 이성제 1549 2006/01/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.