📄 kernelproj_mex.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 + -