📄 sffisold.c
字号:
/* call matlab function */
mexCallMATLAB(1, &OUT, 1, &X, func);
out = mxGetScalar(OUT);
/* free allocated matrix */
mxDestroyArray(X);
mxDestroyArray(OUT);
/* return output */
return(out);
}
/* execute MATLAB function with a matrix input */
/* qualified MATLAB functions are min, sum, max, etc */
static void
#ifdef __STDC__
fisCallMatlabFcn1(double *x, int m, int n, char *func, double *out)
#else
fisCallMatlabFcn1(x, m, n, func, out)
double *x;
int m, n;
char *func;
double *out;
#endif
{
mxArray *X, *OUT;
int i;
/* allocate memory */
X = mxCreateDoubleMatrix(m, n, mxREAL);
/* transfer data in */
for (i = 0; i < m*n; i++)
mxGetPr(X)[i] = x[i];
/* call matlab function */
mexCallMATLAB(1, &OUT, 1, &X, func);
/* transfer data out */
if (m == 1)
out[0] = mxGetScalar(OUT);
else
for (i = 0; i < n; i++)
out[i] = mxGetPr(OUT)[i];
/* free allocated matrix */
mxDestroyArray(X);
mxDestroyArray(OUT);
}
/* execute MATLAB function with two matrix inputs */
/* qualified MATLAB functions are min, sum, max, etc */
static void
#ifdef __STDC__
fisCallMatlabFcn2(double *x, double *y, int m, int n, char *func, double *out)
#else
fisCallMatlabFcn2(x, y, m, n, func, out)
double *x, *y;
int m, n;
char *func;
double *out;
#endif
{
mxArray *X, *Y, *OUT, *prhs[2];
int i;
/* allocate memory */
X = mxCreateDoubleMatrix(m, n, mxREAL);
Y = mxCreateDoubleMatrix(m, n, mxREAL);
prhs[0] = X;
prhs[1] = Y;
/* transfer data in */
for (i = 0; i < m*n; i++) {
mxGetPr(X)[i] = x[i];
mxGetPr(Y)[i] = y[i];
}
/* call matlab function */
mexCallMATLAB(1, &OUT, 2, (mxArray **)prhs, func);
/* transfer data out */
for (i = 0; i < m*n; i++)
out[i] = mxGetPr(OUT)[i];
/* free allocated matrix */
mxDestroyArray(X);
mxDestroyArray(Y);
mxDestroyArray(OUT);
}
/* execute MATLAB function for defuzzification */
static double
#ifdef __STDC__
fisCallMatlabDefuzz(double *x, double *mf, int leng, char *defuzz_fcn)
#else
fisCallMatlabDefuzz(x, mf, leng, defuzz_fcn)
double *x, *mf;
int leng;
char *defuzz_fcn;
#endif
{
double out;
mxArray *X = mxCreateDoubleMatrix(leng, 1, mxREAL);
/* MF is used as type word in fis.h */
/* gcc is ok with MF being used here, but cc needs a different name */
mxArray *MF_ = mxCreateDoubleMatrix(leng, 1, mxREAL);
mxArray *OUT;
mxArray *prhs[2];
int i;
/* transfer data */
for (i = 0; i < leng; i++) {
mxGetPr(X)[i] = x[i];
mxGetPr(MF_)[i] = mf[i];
}
/* call matlab function */
prhs[0] = X;
prhs[1] = MF_;
mexCallMATLAB(1, &OUT, 2, (mxArray **)prhs, defuzz_fcn);
out = mxGetScalar(OUT);
/* free allocated matrix */
mxDestroyArray(X);
mxDestroyArray(MF_);
mxDestroyArray(OUT);
/* return output */
return(out);
}
#else
# define fisCallMatlabMf(x,para,mf_type) /* do nothing */
# define fisCallMatlabMf2(x, para, mf_type, leng, out) /* do nothing */
# define fisCallMatlabExist(variable) /* do nothing */
# define fisCallMatlabFcn(x, leng, func) /* do nothing */
# define fisCallMatlabFcn1(x, m, n, func, out) /* do nothing */
# define fisCallMatlabFcn2(x, y, m, n, func, out) /* do nothing */
# define fisCallMatlabDefuzz(x, mf, leng, defuzz_fcn) /* do nothing */
#endif /* MATLAB_MEX_FILE */
/***********************************************************************
Data structure: construction, printing, and destruction
**********************************************************************/
/* Copyright (c) 1994-98 by The MathWorks, Inc. */
/* $Revision: $ $Date: $ */
IO *
#ifdef __STDC__
fisBuildIoList(int node_n, int *mf_n)
#else
fisBuildIoList(node_n, mf_n)
int node_n;
int *mf_n;
#endif
{
IO *io_list;
int i, j;
io_list = (IO *)calloc(node_n, sizeof(MF));
for (i = 0; i < node_n; i++) {
io_list[i].mf_n = mf_n[i];
io_list[i].mf = (MF **)calloc(mf_n[i], sizeof(MF *));
if (mf_n[i] > 0) /* check if no MF at all */
io_list[i].mf[0] = (MF *)calloc(mf_n[i], sizeof(MF));
for (j = 0; j < mf_n[i]; j++)
io_list[i].mf[j] = io_list[i].mf[0] + j;
}
return(io_list);
}
/* Assign a MF pointer to each MF node based on the MF node's type */
void
#ifdef __STDC__
fisAssignMfPointer(FIS *fis)
#else
fisAssignMfPointer(fis)
FIS *fis;
#endif
{
int i, j, k, mfTypeN = 13, found;
MF *mf_node;
#ifdef __STDC__
struct command {
char *mfType;
double (*mfFcn)();
} dispatch[] = {
{ "trimf", fisTriangleMf },
{ "trapmf", fisTrapezoidMf },
{ "gaussmf", fisGaussianMf },
{ "gauss2mf", fisGaussian2Mf },
{ "sigmf", fisSigmoidMf },
{ "dsigmf", fisDifferenceSigmoidMf },
{ "psigmf", fisProductSigmoidMf },
{ "gbellmf", fisGeneralizedBellMf },
{ "smf", fisSMf },
{ "zmf", fisZMf },
{ "pimf", fisPiMf },
{ "linear", NULL },
{ "constant", NULL }
};
#else
struct command {
char mfType[20];
double (*mfFcn)();
} dispatch[20];
strcpy(dispatch[0].mfType, "trimf");
dispatch[0].mfFcn = fisTriangleMf;
strcpy(dispatch[1].mfType, "trapmf");
dispatch[1].mfFcn = fisTrapezoidMf;
strcpy(dispatch[2].mfType, "gaussmf");
dispatch[2].mfFcn = fisGaussianMf;
strcpy(dispatch[3].mfType, "gauss2mf");
dispatch[3].mfFcn = fisGaussian2Mf;
strcpy(dispatch[4].mfType, "sigmf");
dispatch[4].mfFcn = fisSigmoidMf;
strcpy(dispatch[5].mfType, "dsigmf");
dispatch[5].mfFcn = fisDifferenceSigmoidMf;
strcpy(dispatch[6].mfType, "psigmf");
dispatch[6].mfFcn = fisProductSigmoidMf;
strcpy(dispatch[7].mfType, "gbellmf");
dispatch[7].mfFcn = fisGeneralizedBellMf;
strcpy(dispatch[8].mfType, "smf");
dispatch[8].mfFcn = fisSMf;
strcpy(dispatch[9].mfType, "zmf");
dispatch[9].mfFcn = fisZMf;
strcpy(dispatch[10].mfType, "pimf");
dispatch[10].mfFcn = fisPiMf;
strcpy(dispatch[11].mfType, "linear");
dispatch[11].mfFcn = NULL;
strcpy(dispatch[12].mfType, "constant");
dispatch[12].mfFcn = NULL;
#endif
/* input MF's */
for (i = 0; i < fis->in_n; i++)
for (j = 0; j < fis->input[i]->mf_n; j++) {
mf_node = fis->input[i]->mf[j];
found = 0;
for (k = 0; k < mfTypeN-2; k++) {
if (strcmp(mf_node->type, dispatch[k].mfType) == 0) {
mf_node->mfFcn = dispatch[k].mfFcn;
found = 1;
break;
}
}
if (found == 0) {
#ifdef MATLAB_MEX_FILE
{
double function_type;
function_type = fisCallMatlabExist(mf_node->type);
if (function_type == 0) {
printf("MF '%s' does not exist!\n", mf_node->type);
fisError("Exiting ...");
}
if (function_type == 1) {
printf("MF '%s' is a MATLAB variable!\n", mf_node->type);
fisError("Exiting ...");
}
mf_node->userDefined = 1;
}
#else
#ifndef NO_PRINTF
printf("MF type '%s' for input %d is unknown.\n",
mf_node->type, i+1);
printf("Legal input MF types: ");
for (i = 0; i < mfTypeN-2; i++)
printf("%s ", dispatch[i].mfType);
/*
printf("\n\nIf '%s' is a customized MF, use M-file command FISEVAL1 or FISEVAL2 instead.\n", mf_node->type);
*/
printf("\n");
#endif
fisError("\n");
#endif
}
}
/* output MF's */
for (i = 0; i < fis->out_n; i++)
for (j = 0; j < fis->output[i]->mf_n; j++) {
mf_node = fis->output[i]->mf[j];
found = 0;
for (k = 0; k < mfTypeN; k++) {
if (strcmp(mf_node->type, dispatch[k].mfType) == 0) {
mf_node->mfFcn = dispatch[k].mfFcn;
found = 1;
break;
}
}
if (found == 0) {
#ifdef MATLAB_MEX_FILE
{
double function_type;
function_type = fisCallMatlabExist(mf_node->type);
if (function_type == 0) {
printf("MATLAB function '%s' does not exist!\n", mf_node->type);
fisError("Exiting ...");
}
if (function_type == 1) {
printf("'%s' is a MATLAB variable!\n", mf_node->type);
fisError("Exiting ...");
}
mf_node->userDefined = 1;
}
#else
#ifndef NO_PRINTF
printf("MF type '%s' for output %d is unknown.\n",
mf_node->type, i+1);
printf("Legal output MF types: ");
for (i = 0; i < mfTypeN-1; i++)
printf("%s ", dispatch[i].mfType);
/*
printf("\n\nIf '%s' is a customized MF, use M-file command FISEVAL1 or FISEVAL2 instead.\n", mf_node->type);
*/
printf("\n");
#endif
fisError("\n");
#endif
}
}
}
/* Assign a other function pointers */
void
#ifdef __STDC__
fisAssignFunctionPointer(FIS *fis)
#else
fisAssignFunctionPointer(fis)
FIS *fis;
#endif
{
/* assign andMethod function pointer */
if (strcmp(fis->andMethod, "prod") == 0)
fis->andFcn = fisProduct;
else if (strcmp(fis->andMethod, "min") == 0)
fis->andFcn = fisMin;
else {
#ifdef MATLAB_MEX_FILE
{
double function_type;
function_type = fisCallMatlabExist(fis->andMethod);
if (function_type == 0) {
printf("AND function '%s' does not exist!\n", fis->andMethod);
fisError("Exiting ...");
}
if (function_type == 1) {
printf("AND function '%s' is a MATLAB variable!\n", fis->andMethod);
fisError("Exiting ...");
}
fis->userDefinedAnd = 1;
}
#else
#ifndef NO_PRINTF
printf("Given andMethod %s is unknown.\n", fis->andMethod);
#endif
fisError("Legal andMethod: min, prod");
#endif
}
/* assign orMethod function pointer */
if (strcmp(fis->orMethod, "probor") == 0)
fis->orFcn = fisProbOr;
else if (strcmp(fis->orMethod, "max") == 0)
fis->orFcn = fisMax;
else {
#ifdef MATLAB_MEX_FILE
{
double function_type;
function_type = fisCallMatlabExist(fis->orMethod);
if (function_type == 0) {
printf("OR function '%s' does not exist!\n", fis->orMethod);
fisError("Exiting ...");
}
if (function_type == 1) {
printf("OR function '%s' is a MATLAB variable!\n", fis->orMethod);
fisError("Exiting ...");
}
fis->userDefinedOr = 1;
}
#else
#ifndef NO_PRINTF
printf("Given orMethod %s is unknown.\n", fis->orMethod);
#endif
fisError("Legal orMethod: max, probor");
#endif
}
/* assign impMethod function pointer */
if (strcmp(fis->impMethod, "prod") == 0)
fis->impFcn = fisProduct;
else if (strcmp(fis->impMethod, "min") == 0)
fis->impFcn = fisMin;
else {
#ifdef MATLAB_MEX_FILE
{
double function_type;
function_type = fisCallMatlabExist(fis->impMethod);
if (function_type == 0) {
printf("IMPLICATION function '%s' does not exist!\n", fis->impMethod);
fisError("Exiting ...");
}
if (function_type == 1) {
printf("IMPLICATION function '%s' is a MATLAB variable!\n", fis->impMethod);
fisError("Exiting ...");
}
fis->userDefinedImp = 1;
}
#else
#ifndef NO_PRINTF
printf("Given impMethod %s is unknown.\n", fis->impMethod);
#endif
fisError("Legal impMethod: min, prod");
#endif
}
/* assign aggMethod function pointer */
if (strcmp(fis->aggMethod, "max") == 0)
fis->aggFcn = fisMax;
else if (strcmp(fis->aggMethod, "probor") == 0)
fis->aggFcn = fisProbOr;
else if (strcmp(fis->aggMethod, "sum") == 0)
fis->aggFcn = fisSum;
else {
#ifdef MATLAB_MEX_FILE
{
double function_type;
function_type = fisCallMatlabExist(fis->aggMethod);
if (function_type == 0) {
printf("AGGREGATE function '%s' does not exist!\n", fis->aggMethod);
fisError("Exiting ...");
}
if (function_type == 1) {
printf("AGGREGATE function '%s' is a MATLAB variable!\n", fis->aggMethod);
fisError("Exiting ...");
}
fis->userDefinedAgg = 1;
}
#else
#ifndef NO_PRINTF
printf("Given aggMethod %s is unknown.\n", fis->aggMethod);
#endif
fisError("Legal aggMethod: max, probor, sum");
#endif
}
/* assign defuzzification function pointer */
if (strcmp(fis->defuzzMethod, "centroid") == 0)
fis->defuzzFcn = defuzzCentroid;
else if (strcmp(fis->defuzzMethod, "bisector") == 0)
fis->defuzzFcn = defuzzBisector;
else if (strcmp(fis->defuzzMethod, "mom") == 0)
fis->defuzzFcn = defuzzMeanOfMax;
else if (strcmp(fis->defuzzMethod, "som") == 0)
fis->defuzzFcn = defuzzSmallestOfMax;
else if (strcmp(fis->defuzzMethod, "lom") == 0)
fis->defuzzFcn = defuzzLargestOfMax;
else if (strcmp(fis->defuzzMethod, "wtaver") == 0)
;
else if (strcmp(fis->defuzzMethod, "wtsum") == 0)
;
else {
#ifdef MATLAB_MEX_FILE
{
double function_type;
function_type = fisCallMatlabExist(fis->defuzzMethod);
if (function_type == 0) {
printf("DEFUZZIFICATION function '%s' does not exist!\n", fis->defuzzMethod);
fisError("Exiting ...");
}
if (function_type == 1) {
printf("DEFUZZIFICATION function '%s' is a MATLAB variable!\n", fis->defuzzMethod);
fisError("Exiting ...");
}
fis->userDefinedDefuzz = 1;
}
#else
#ifndef NO_PRINTF
printf("Given defuzzification method %s is unknown.\n", fis->defuzzMethod);
#endif
fisError("Legal defuzzification methods: centroid, bisector, mom, som, lom, wtaver, wtsum");
#endif
}
}
#ifndef NO_PRINTF
static void
#ifdef __STDC__
fisPrintData(FIS *fis)
#else
fisPrintData(fis)
FIS *fis;
#endif
{
int i, j, k;
if (fis == NULL)
fisError("Given fis pointer is NULL, no data to print!");
printf("fis_name = %s\n", fis->name);
printf("fis_type = %s\n", fis->type);
printf("in_n = %d\n", fis->in_n);
printf("out_n = %d\n", fis->out_n);
printf("in_mf_n: ");
for (i = 0; i < fis->in_n; i++)
printf("%d ", fis->input[i]->mf_n);
printf("\n");
printf("out_mf_n: ");
for (i = 0; i < fis->out_n; i++)
printf("%d ", fis->output[i]->mf_n);
printf("\n");
printf("rule_n = %d\n", fis->rule_n);
printf("andMethod = %s\n", fis->andMethod);
printf("orMethod = %s\n", fis->orMethod);
printf("impMethod = %s\n", fis->impMethod);
printf("aggMethod = %s\n", fis->aggMethod);
printf("defuzzMethod = %s\n", fis->defuzzMethod);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -