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

📄 kernelproj_mex.c

📁 SVM matlab GUI可视化界面 直观形象 代码解释比较详细 对GUI学习和svm学习都有帮助
💻 C
字号:
/* --------------------------------------------------------------------
 kernelproj_mex.c: 是MEX文件,实现核函数映射
 将非线性可分的数据映射到高维特征空间中,使得可以值需要计算非线性变换的点积
 说明:
  Y = kernelproj_mex(X, Alpha, b, sv_X, ker, arg )

输入:
   X [dim x num_data] 要映射的数据集向量
   Alpha [nsv x new_dim] 拉格朗日乘子
   b [new_dim x 1] 偏差
   sv_X [dim x nsv] 支持矢量
   ker [string] 识别核函数
   arg [1 x narg] 核函数变量

输出:
   Y [new_dim x num_data] 经过映射的数据集

 -------------------------------------------------------------------- */

#include "mex.h"
#include "matrix.h"
#include <math.h>
#include <stdlib.h>
#include "kernel_fun.h"

/* ==============================================================
 MEX主函数,Matlab与其他应用程序的接口函数
============================================================== */
void mexFunction( int nlhs, mxArray *plhs[],
		  int nrhs, const mxArray *prhs[] )
{
   long i, j, k, m;
   long nsv, new_dim, num_data;
   double *Alpha;
   double *b;
   double *Y;
   double k_ij;

  
   ker_cnt = 0;

   /* Y = kernelproj_mex(X, Alpha, b, sv_X, ker, arg ) */
   /* ------------------------------------------- */
   if( nrhs == 6) 
   {
      /* 数据矩阵 [dim x num_data] */
      if( !mxIsNumeric(prhs[0]) || !mxIsDouble(prhs[0]) ||
        mxIsEmpty(prhs[0])    || mxIsComplex(prhs[0]) )
        mexErrMsgTxt("输入数据必须是实矩阵.");

      /* 拉格朗日乘子 Alpha [nsv  x new_dim] */
      if( !mxIsNumeric(prhs[1]) || !mxIsDouble(prhs[1]) ||
        mxIsEmpty(prhs[1])    || mxIsComplex(prhs[1]) )
        mexErrMsgTxt("输入的Alpha必须是实矩阵.");

      /* 向量 b [nsv  x 1] */
      if( !mxIsNumeric(prhs[2]) || !mxIsDouble(prhs[2]) ||
        mxIsEmpty(prhs[2])    || mxIsComplex(prhs[2]) )
        mexErrMsgTxt("输入b必须实一个实向量.");

      /* 识别核函数 */
      ker = kernel_id( prhs[4] );
      if( ker == -1 ) 
        mexErrMsgTxt("不合理的核函数标识.");
      
     /*  获取指向 arguments 的指针 */
     arg1 = mxGetPr(prhs[5]);

     /* 获取指向输入数据向量的指针 */
     dataA = mxGetPr(prhs[0]);   
     Alpha = mxGetPr(prhs[1]);
     b = mxGetPr(prhs[2]);
     dataB = mxGetPr(prhs[3]);  

     /* 获取数据集的维数 */ 
     dim = mxGetM(prhs[0]);      
     num_data = mxGetN(prhs[0]);       
     nsv = mxGetM(prhs[1]);
     new_dim = mxGetN(prhs[1]);

     if( mxGetM(prhs[2]) != new_dim)
        mexErrMsgTxt("Alpha的行数必须与向量b的尺寸相等 .");

     /* 创建输出核函数矩阵 */
     plhs[0] = mxCreateDoubleMatrix(new_dim,num_data,mxREAL);
     Y = mxGetPr(plhs[0]);

     /* 计算核函数映射 */
     for( i = 0; i < num_data; i++ ) {

       for( k = 0; k < new_dim; k++) { 
         Y[k+i*new_dim] = b[k]; 
       }

       for( j = 0; j < nsv; j++ ) {
         k_ij = kernel(i,j);

         for( k = 0; k < new_dim; k++) { 
           if(Alpha[j+k*nsv] != 0 )
              Y[k+i*new_dim] += k_ij*Alpha[j+k*nsv]; 
         }
       }
     }
   } 
   else
   {
      mexErrMsgTxt("输入参数错误.");
   }

   return;
}

⌨️ 快捷键说明

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