📄 linear_model_matlab.c
字号:
#include <stdlib.h>#include <string.h>#include "linear.h"#include "mex.h"#if MX_API_VER < 0x07030000typedef int mwIndex;#endif#define Malloc(type,n) (type *)malloc((n)*sizeof(type))#define NUM_OF_RETURN_FIELD 6static const char *field_names[] = { "Parameters", "nr_class", "nr_feature", "bias", "Label", "w",};const char *model_to_matlab_structure(mxArray *plhs[], int num_of_feature, struct model *model_){ int i, j; int nr_classifier; double *ptr; mxArray *return_model, **rhs; int out_id = 0; int n; rhs = (mxArray **)mxMalloc(sizeof(mxArray *)*NUM_OF_RETURN_FIELD); // Parameters // for now, only solver_type is needed rhs[out_id] = mxCreateDoubleMatrix(1, 1, mxREAL); ptr = mxGetPr(rhs[out_id]); ptr[0] = model_->param.solver_type; out_id++; // nr_class rhs[out_id] = mxCreateDoubleMatrix(1, 1, mxREAL); ptr = mxGetPr(rhs[out_id]); ptr[0] = model_->nr_class; out_id++; if(model_->nr_class==2) nr_classifier=1; else nr_classifier=model_->nr_class; // nr_feature rhs[out_id] = mxCreateDoubleMatrix(1, 1, mxREAL); ptr = mxGetPr(rhs[out_id]); ptr[0] = model_->nr_feature; out_id++; // bias rhs[out_id] = mxCreateDoubleMatrix(1, 1, mxREAL); ptr = mxGetPr(rhs[out_id]); ptr[0] = model_->bias; out_id++; if(model_->bias>=0) n=model_->nr_feature+1; else n=model_->nr_feature; // Label if(model_->label) { rhs[out_id] = mxCreateDoubleMatrix(model_->nr_class, 1, mxREAL); ptr = mxGetPr(rhs[out_id]); for(i = 0; i < model_->nr_class; i++) ptr[i] = model_->label[i]; } else rhs[out_id] = mxCreateDoubleMatrix(0, 0, mxREAL); out_id++; // w rhs[out_id] = mxCreateDoubleMatrix(n, nr_classifier, mxREAL); ptr = mxGetPr(rhs[out_id]); for(i=0, j=n*nr_classifier; i<j; i++) ptr[i]=model_->w[i]; out_id++; /* Create a struct matrix contains NUM_OF_RETURN_FIELD fields */ return_model = mxCreateStructMatrix(1, 1, NUM_OF_RETURN_FIELD, field_names); /* Fill struct matrix with input arguments */ for(i = 0; i < NUM_OF_RETURN_FIELD; i++) mxSetField(return_model,0,field_names[i],mxDuplicateArray(rhs[i])); /* return */ plhs[0] = return_model; mxFree(rhs); return NULL;}const char *matlab_matrix_to_model(struct model *model_, const mxArray *matlab_struct){ int i, j, num_of_fields; int nr_classifier; double *ptr; int id = 0; int n; mxArray **rhs; num_of_fields = mxGetNumberOfFields(matlab_struct); rhs = (mxArray **) mxMalloc(sizeof(mxArray *)*num_of_fields); for(i=0;i<num_of_fields;i++) rhs[i] = mxGetFieldByNumber(matlab_struct, 0, i); model_->nr_class=0; nr_classifier=0; model_->nr_feature=0; model_->w=NULL; model_->label=NULL; // Parameters ptr = mxGetPr(rhs[id]); model_->param.solver_type = (int)ptr[0]; id++; // nr_class ptr = mxGetPr(rhs[id]); model_->nr_class = (int)ptr[0]; id++; if(model_->nr_class==2) nr_classifier=1; else nr_classifier=model_->nr_class; // nr_feature ptr = mxGetPr(rhs[id]); model_->nr_feature = (int)ptr[0]; id++; // bias ptr = mxGetPr(rhs[id]); model_->bias = (int)ptr[0]; id++; if(model_->bias>=0) n=model_->nr_feature+1; else n=model_->nr_feature; ptr = mxGetPr(rhs[id]); model_->label=Malloc(int, model_->nr_class); for(i=0; i<model_->nr_class; i++) model_->label[i]=(int)ptr[i]; id++; ptr = mxGetPr(rhs[id]); model_->w=Malloc(double, nr_classifier*n); for(i=0, j=nr_classifier*n; i<j; i++) model_->w[i]=ptr[i]; id++; mxFree(rhs); return NULL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -