⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hmmutils.cpp

📁 隐马尔可夫模型的C语言实现
💻 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:状态数
**       M:可观察值得个数
**       seed:随机数种子
** 返回值:无
**/void InitHMM(HMM *phmm, int N, int M, int seed){	int i, j, k;	double sum;	/* 初始化随机数发生器 */	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 + -