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

📄 file_io.c

📁 VQ压缩算法
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include "vq_model.h"
#define MaxLen 2048        /* temp buffer length */

/*-------------------------------------------------------------*/
int scan_file(FILE *datafile, Info_Type *DataInfo) {

   int Len, Class, Dim;
   int VecCnt, Cnt;
   int FindFlag, TotalClass = 0;
   char Vector[MaxLen], Ch;

   do {

       fscanf(datafile, "%d %d %d\n", &Len, &Class, &Dim);

       /*---------------------*/
       /* find existing class */
       /*---------------------*/
       FindFlag = 0;
       for (Cnt=0; Cnt<TotalClass; Cnt++)
	  if (DataInfo[Cnt].ID == Class) {
	     FindFlag = 1;
	     break;
	  }

       if (FindFlag) {
	  if (DataInfo[Cnt].VecDim != Dim) {
	     fprintf (stderr, "inconsistent dimension in data file\n");
	     exit(-1);
	  }
	  DataInfo[Cnt].VecNum += Len;
       }
       else {                           /* new class */
	  DataInfo[TotalClass].VecNum = Len;
	  DataInfo[TotalClass].VecDim = Dim;
	  DataInfo[TotalClass].ID = Class;
	  TotalClass++;
       }

       /*-----------------------------*/
       /* ignore following vectors    */
       /*-----------------------------*/
       for (VecCnt=0; VecCnt<Len; VecCnt++) {
	 fgets(Vector, MaxLen, datafile);
       }

       Ch = fgetc(datafile);
       ungetc(Ch, datafile);
   } while (!feof(datafile) );

   return (TotalClass);
};

/*-------------------------------------------------------------*/
int load_data(FILE *datafile, DType *DataHead, int TotalClass) {

   int TotalVector=0;
   int ClassCnt, VecCnt, DimCnt;
   int Len, Class, Dim;
   int *CurrLen;
   float TmpFloat;
   char Ch;

   MArray_1D(CurrLen, TotalClass, int, "CurrLen");

   do {

       fscanf(datafile, "%d %d %d\n", &Len, &Class, &Dim);
       TotalVector += Len;

       /*---------------------*/
       /* find existing class */
       /*---------------------*/
       for (ClassCnt=0; ClassCnt<TotalClass; ClassCnt++)
	  if (DataHead[ClassCnt].ID == Class) break;

       if (ClassCnt == TotalClass) {
	 fprintf (stderr, "ERROR: wrong data/code file!\n");
	 exit(-1);
       }
       /*----------------------------*/
       /* load data of this pattern  */
       /*----------------------------*/
       for (VecCnt=0; VecCnt<Len; VecCnt++) {
	 for (DimCnt=0; DimCnt<Dim; DimCnt++) {
	   fscanf(datafile, "%f ", &TmpFloat);
	   DataHead[ClassCnt].Mat[ CurrLen[ClassCnt] ][DimCnt] = TmpFloat;
	 }
	 fscanf(datafile, "\n");

	 CurrLen[ClassCnt]++;
       }      /* for (VecCnt) */

       Ch = fgetc(datafile);
       ungetc(Ch, datafile);
   } while (!feof(datafile) );


   /*----------------------------------------*/
   /* verifying the number of loaded vectors */
   /*----------------------------------------*/
   for (ClassCnt=0; ClassCnt<TotalClass; ClassCnt++) {
     if (CurrLen[ClassCnt] != DataHead[ClassCnt].VecNum)
	fprintf (stderr, "Warning: not all data loaded!\n");
   }

   MFree_1D(CurrLen);
   return(TotalVector);

};


/*-------------------------------------------------------------*/
void save_code(FILE *codefile, DType *CodeHead, int TotalClass) {

   int ClassCnt, VecCnt, DimCnt;

   for (ClassCnt=0; ClassCnt<TotalClass; ClassCnt++) {

       fprintf(codefile, "%d %d %d\n", CodeHead[ClassCnt].VecNum,
	   CodeHead[ClassCnt].ID, CodeHead[ClassCnt].VecDim);

       for (VecCnt=0; VecCnt<CodeHead[ClassCnt].VecNum; VecCnt++) {
	 for (DimCnt=0; DimCnt<CodeHead[ClassCnt].VecDim; DimCnt++)
	   fprintf(codefile, "%7.4f ", CodeHead[ClassCnt].Mat[VecCnt][DimCnt]);

	 fprintf(codefile, "\n");
       }      /* for (VecCnt) */

   }          /* for (ClassCnt) */

};


/*-------------------------------------------------------------*/
DType *load_codebook(FILE *codefile) {

    DType *CodeHead = NULL, *CodeCurr, *CodeEnd;
    int Len, ClassID, Dim;
    int VecCnt, DimCnt;
    float TmpFloat;
    char Ch;


    do {

       fscanf(codefile, "%d %d %d\n", &Len, &ClassID, &Dim);
       MArray_1D(CodeCurr, 1, DType, "CodeCurr");
       CodeCurr->ID     = ClassID;
       CodeCurr->VecNum = Len;
       CodeCurr->VecDim = Dim;
       CodeCurr->Next   = NULL;
       MArray_2D(CodeCurr->Mat, Len, Dim, float, "CodeCurr->Mat");

       /*----------------------------*/
       /* load data of this pattern  */
       /*----------------------------*/
       for (VecCnt=0; VecCnt<Len; VecCnt++) {
	 for (DimCnt=0; DimCnt<Dim; DimCnt++) {
	   fscanf(codefile, "%f ", &TmpFloat);
	   CodeCurr->Mat[VecCnt][DimCnt] = TmpFloat;
	 }
	 fscanf(codefile, "\n");
       }      /* for (VecCnt) */

       /*------------------------------------------*/
       /* Link this model to the list              */
       /*------------------------------------------*/
       if (CodeHead == NULL) {          /* first model */
	  CodeHead   = CodeCurr;
	  CodeEnd    = CodeCurr;
       }
       else {         /* add pattern to the link list */
	  CodeEnd->Next  = CodeCurr;
	  CodeEnd        = CodeCurr;
       }

       Ch = fgetc(codefile);
       ungetc(Ch, codefile);
   } while (!feof(codefile) );

   return (CodeHead);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -