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

📄 clusttool.cpp

📁 一OCR的相关资料。.希望对研究OCR的朋友有所帮助.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************** **	Filename:	clustertool.c **	Purpose:	Misc. tools for use with the clustering routines **	Author:		Dan Johnson **	History:	6/6/89, DSJ, Created. ** **	(c) Copyright Hewlett-Packard Company, 1988. ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. ** You may obtain a copy of the License at ** http://www.apache.org/licenses/LICENSE-2.0 ** Unless required by applicable law or agreed to in writing, software ** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the License for the specific language governing permissions and ** limitations under the License. ******************************************************************************///--------------------------Include Files----------------------------------#include "clusttool.h"#include "const.h"#include "danerror.h"#include "emalloc.h"#include "scanutils.h"#include <stdio.h>#include <math.h>//---------------Global Data Definitions and Declarations--------------------#define TOKENSIZE 80             //max size of tokens read from an input file#define MAXSAMPLESIZE 65535      //max num of dimensions in feature space//#define MAXBLOCKSIZE  65535   //max num of samples in a character (block size)/*---------------------------------------------------------------------------          Public Code-----------------------------------------------------------------------------*//** ReadSampleSize ***********************************************************Parameters:	File	open text file to read sample size fromGlobals:	NoneOperation:	This routine reads a single integer from the specified      file and checks to ensure that it is between 0 and      MAXSAMPLESIZE.Return:		Sample sizeExceptions:	ILLEGALSAMPLESIZE	illegal format or rangeHistory:	6/6/89, DSJ, Created.******************************************************************************/UINT16 ReadSampleSize(FILE *File) {   int SampleSize;  if ((fscanf (File, "%d", &SampleSize) != 1) ||    (SampleSize < 0) || (SampleSize > MAXSAMPLESIZE))    DoError (ILLEGALSAMPLESIZE, "Illegal sample size");  return (SampleSize);}                                // ReadSampleSize/** ReadParamDesc *************************************************************Parameters:	File	open text file to read N parameter descriptions from      N	number of parameter descriptions to readGlobals:	NoneOperation:	This routine reads textual descriptions of sets of parameters      which describe the characteristics of feature dimensions.Return:		Pointer to an array of parameter descriptors.Exceptions:	ILLEGALCIRCULARSPEC      ILLEGALESSENTIALSPEC      ILLEGALMINMAXSPECHistory:	6/6/89, DSJ, Created.******************************************************************************/PARAM_DESC *ReadParamDesc(FILE *File, UINT16 N) {   int i;  PARAM_DESC *ParamDesc;  char Token[TOKENSIZE];    ParamDesc = (PARAM_DESC *) Emalloc (N * sizeof (PARAM_DESC));  for (i = 0; i < N; i++) {    if (fscanf (File, "%s", Token) != 1)      DoError (ILLEGALCIRCULARSPEC,        "Illegal circular/linear specification");    if (Token[0] == 'c')      ParamDesc[i].Circular = TRUE;    else      ParamDesc[i].Circular = FALSE;    if (fscanf (File, "%s", Token) != 1)       DoError (ILLEGALESSENTIALSPEC,        "Illegal essential/non-essential spec");    if (Token[0] == 'e')      ParamDesc[i].NonEssential = FALSE;    else      ParamDesc[i].NonEssential = TRUE;    if (fscanf (File, "%f%f", &(ParamDesc[i].Min), &(ParamDesc[i].Max)) !=      2)      DoError (ILLEGALMINMAXSPEC, "Illegal min or max specification");    ParamDesc[i].Range = ParamDesc[i].Max - ParamDesc[i].Min;    ParamDesc[i].HalfRange = ParamDesc[i].Range / 2;    ParamDesc[i].MidRange = (ParamDesc[i].Max + ParamDesc[i].Min) / 2;  }  return (ParamDesc);}                                // ReadParamDesc/** ReadPrototype *************************************************************Parameters:	File	open text file to read prototype from      N	number of dimensions used in prototypeGlobals:	NoneOperation:	This routine reads a textual description of a prototype from      the specified file.Return:		List of prototypesExceptions:	ILLEGALSIGNIFICANCESPEC      ILLEGALSAMPLECOUNT      ILLEGALMEANSPEC      ILLEGALVARIANCESPEC      ILLEGALDISTRIBUTIONHistory:	6/6/89, DSJ, Created.******************************************************************************/PROTOTYPE *ReadPrototype(FILE *File, UINT16 N) {   char Token[TOKENSIZE];  int Status;  PROTOTYPE *Proto;  int SampleCount;  int i;  if ((Status = fscanf (File, "%s", Token)) == 1) {    Proto = (PROTOTYPE *) Emalloc (sizeof (PROTOTYPE));    Proto->Cluster = NULL;    if (Token[0] == 's')      Proto->Significant = TRUE;    else      Proto->Significant = FALSE;    Proto->Style = ReadProtoStyle (File);    if ((fscanf (File, "%d", &SampleCount) != 1) || (SampleCount < 0))      DoError (ILLEGALSAMPLECOUNT, "Illegal sample count");    Proto->NumSamples = SampleCount;    Proto->Mean = ReadNFloats (File, N, NULL);    if (Proto->Mean == NULL)      DoError (ILLEGALMEANSPEC, "Illegal prototype mean");    switch (Proto->Style) {      case spherical:        if (ReadNFloats (File, 1, &(Proto->Variance.Spherical)) == NULL)          DoError (ILLEGALVARIANCESPEC, "Illegal prototype variance");        Proto->Magnitude.Spherical =          1.0 / sqrt ((double) (2.0 * PI * Proto->Variance.Spherical));        Proto->TotalMagnitude =          pow (Proto->Magnitude.Spherical, (double) N);        Proto->LogMagnitude = log ((double) Proto->TotalMagnitude);        Proto->Weight.Spherical = 1.0 / Proto->Variance.Spherical;        Proto->Distrib = NULL;        break;      case elliptical:        Proto->Variance.Elliptical = ReadNFloats (File, N, NULL);        if (Proto->Variance.Elliptical == NULL)          DoError (ILLEGALVARIANCESPEC, "Illegal prototype variance");        Proto->Magnitude.Elliptical =          (FLOAT32 *) Emalloc (N * sizeof (FLOAT32));        Proto->Weight.Elliptical =          (FLOAT32 *) Emalloc (N * sizeof (FLOAT32));        Proto->TotalMagnitude = 1.0;        for (i = 0; i < N; i++) {          Proto->Magnitude.Elliptical[i] =            1.0 /            sqrt ((double) (2.0 * PI * Proto->Variance.Elliptical[i]));          Proto->Weight.Elliptical[i] =            1.0 / Proto->Variance.Elliptical[i];          Proto->TotalMagnitude *= Proto->Magnitude.Elliptical[i];        }        Proto->LogMagnitude = log ((double) Proto->TotalMagnitude);        Proto->Distrib = NULL;        break;      case mixed:        Proto->Distrib =          (DISTRIBUTION *) Emalloc (N * sizeof (DISTRIBUTION));        for (i = 0; i < N; i++) {          if (fscanf (File, "%s", Token) != 1)            DoError (ILLEGALDISTRIBUTION,              "Illegal prototype distribution");          switch (Token[0]) {            case 'n':              Proto->Distrib[i] = normal;              break;            case 'u':              Proto->Distrib[i] = uniform;              break;            case 'r':              Proto->Distrib[i] = D_random;              break;            default:              DoError (ILLEGALDISTRIBUTION,                "Illegal prototype distribution");          }        }        Proto->Variance.Elliptical = ReadNFloats (File, N, NULL);        if (Proto->Variance.Elliptical == NULL)          DoError (ILLEGALVARIANCESPEC, "Illegal prototype variance");        Proto->Magnitude.Elliptical =          (FLOAT32 *) Emalloc (N * sizeof (FLOAT32));        Proto->Weight.Elliptical =          (FLOAT32 *) Emalloc (N * sizeof (FLOAT32));        Proto->TotalMagnitude = 1.0;        for (i = 0; i < N; i++) {          switch (Proto->Distrib[i]) {            case normal:              Proto->Magnitude.Elliptical[i] = 1.0 /                sqrt ((double)                (2.0 * PI * Proto->Variance.Elliptical[i]));              Proto->Weight.Elliptical[i] =                1.0 / Proto->Variance.Elliptical[i];              break;            case uniform:            case D_random:              Proto->Magnitude.Elliptical[i] = 1.0 /                (2.0 * Proto->Variance.Elliptical[i]);              break;          }          Proto->TotalMagnitude *= Proto->Magnitude.Elliptical[i];        }        Proto->LogMagnitude = log ((double) Proto->TotalMagnitude);        break;    }    return (Proto);  }  else if (Status == EOF)    return (NULL);  else {    DoError (ILLEGALSIGNIFICANCESPEC, "Illegal significance specification");    return (NULL);  }}                                // ReadPrototype/* ReadProtoStyle *************************************************************Parameters:	File	open text file to read prototype style fromGlobals:	NoneOperation:	This routine reads an single token from the specified      text file and interprets it as a prototype specification.Return:		Prototype style read from text fileExceptions:	ILLEGALSTYLESPEC	illegal prototype style specificationHistory:	6/8/89, DSJ, Created.*******************************************************************************/PROTOSTYLE ReadProtoStyle(FILE *File) {   char Token[TOKENSIZE];  PROTOSTYLE Style;  if (fscanf (File, "%s", Token) != 1)    DoError (ILLEGALSTYLESPEC, "Illegal prototype style specification");  switch (Token[0]) {    case 's':      Style = spherical;      break;    case 'e':      Style = elliptical;      break;

⌨️ 快捷键说明

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