?? hmmutils.cpp
字號:
/*** File: hmmutils.cpp** 功能:HMM文件的讀寫等操作*/
#include "StdAfx.h"#include <stdio.h>#include <stdlib.h>#include <math.h>#include "nrutil.h"#include "hmm.h"
/**********************************************************************
** 函數名稱:ReadHMM
** 功能:讀取HMM結構
** 參數:fp:文件指針
** phmm:HMM結構指針,保存HMM結構
** 返回值:無
**/void ReadHMM(FILE *fp, HMM *phmm){ int i, j, k; fscanf(fp, "M= %d\n", &(phmm->M)); fscanf(fp, "N= %d\n", &(phmm->N)); fscanf(fp, "A:\n"); phmm->A = (double **) dmatrix(1, phmm->N, 1, phmm->N); for (i = 1; i <= phmm->N; i++) { for (j = 1; j <= phmm->N; j++) { fscanf(fp, "%lf", &(phmm->A[i][j])); } fscanf(fp,"\n"); } fscanf(fp, "B:\n"); phmm->B = (double **) dmatrix(1, phmm->N, 1, phmm->M); for (j = 1; j <= phmm->N; j++) { for (k = 1; k <= phmm->M; k++) { fscanf(fp, "%lf", &(phmm->B[j][k])); } fscanf(fp,"\n"); } fscanf(fp, "pi:\n"); phmm->pi = (double *) dvector(1, phmm->N); for (i = 1; i <= phmm->N; i++) fscanf(fp, "%lf", &(phmm->pi[i])); }
/**********************************************************************
** 函數名稱:FreeHMM
** 功能:釋放HMM結構
** 參數:phmm:HMM結構指針
** 返回值:無
**/void FreeHMM(HMM *phmm){ free_dmatrix(phmm->A, 1, phmm->N, 1, phmm->N); free_dmatrix(phmm->B, 1, phmm->N, 1, phmm->M); free_dvector(phmm->pi, 1, phmm->N);}/**********************************************************************
** 函數名稱:InitHMM
** 功能:初始化HMM結構
** 參數:phmm:HMM結構指針
** N:狀態(tài)數
** M:可觀察值得個數
** seed:隨機數種子
** 返回值:無
**/void InitHMM(HMM *phmm, int N, int M, int seed){ int i, j, k; double sum; /* 初始化隨機數發(fā)生器 */ hmmsetseed(seed); phmm->M = M; phmm->N = N; phmm->A = (double **) dmatrix(1, phmm->N, 1, phmm->N); for (i = 1; i <= phmm->N; i++)
{ sum = 0.0; for (j = 1; j <= phmm->N; j++)
{ phmm->A[i][j] = hmmgetrand(); sum += phmm->A[i][j]; } for (j = 1; j <= phmm->N; j++) phmm->A[i][j] /= sum; } phmm->B = (double **) dmatrix(1, phmm->N, 1, phmm->M); for (j = 1; j <= phmm->N; j++)
{ sum = 0.0; for (k = 1; k <= phmm->M; k++)
{ phmm->B[j][k] = hmmgetrand(); sum += phmm->B[j][k]; } for (k = 1; k <= phmm->M; k++) phmm->B[j][k] /= sum; } phmm->pi = (double *) dvector(1, phmm->N); sum = 0.0; for (i = 1; i <= phmm->N; i++)
{ phmm->pi[i] = hmmgetrand(); sum += phmm->pi[i];
}
for (i = 1; i <= phmm->N; i++) phmm->pi[i] /= sum;}
/**********************************************************************
** 函數名稱:CopyHMM
** 功能:拷貝HMM結構
** 參數:phmm1:HMM結構指針
** phmm2:HMM結構指針
** 返回值:無
**/void CopyHMM(HMM *phmm1, HMM *phmm2){ int i, j, k; phmm2->M = phmm1->M; phmm2->N = phmm1->N; phmm2->A = (double **) dmatrix(1, phmm2->N, 1, phmm2->N); for (i = 1; i <= phmm2->N; i++) for (j = 1; j <= phmm2->N; j++) phmm2->A[i][j] = phmm1->A[i][j]; phmm2->B = (double **) dmatrix(1, phmm2->N, 1, phmm2->M); for (j = 1; j <= phmm2->N; j++) for (k = 1; k <= phmm2->M; k++) phmm2->B[j][k] = phmm1->B[j][k]; phmm2->pi = (double *) dvector(1, phmm2->N);
for (i = 1; i <= phmm2->N; i++) phmm2->pi[i] = phmm1->pi[i]; }
/**********************************************************************
** 函數名稱:PrintHMM
** 功能:保存HMM結構
** 參數:fp:文件指針
** phmm:HMM結構指針
** 返回值:無
**/void PrintHMM(FILE *fp, HMM *phmm){ int i, j, k; fprintf(fp, "M= %d\n", phmm->M); fprintf(fp, "N= %d\n", phmm->N); fprintf(fp, "A:\n"); for (i = 1; i <= phmm->N; i++)
{ for (j = 1; j <= phmm->N; j++)
{ fprintf(fp, "%f ", phmm->A[i][j] ); } fprintf(fp, "\n"); } fprintf(fp, "B:\n"); for (j = 1; j <= phmm->N; j++)
{ for (k = 1; k <= phmm->M; k++)
{ fprintf(fp, "%f ", phmm->B[j][k]); } fprintf(fp, "\n"); } fprintf(fp, "pi:\n"); for (i = 1; i <= phmm->N; i++)
{ fprintf(fp, "%f ", phmm->pi[i]); }
fprintf(fp, "\n\n");}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -