代码在网上可以找到,savemodel.c与loadmodel.c 我把网上的引用放在下面
最近一直在用matlab和libsvm,发现libsvm库用起来还是很方便的,就是没有模型直接保存到文件和读取模型的matlab接口(C++的接口有)。由于有会用的Opencv等C/C++库,所以数据交换比较麻烦。看了一下libsvm的svm.h、svm.cpp文件,发现有svm_save_model(),svm_load_model()等函数。于是乎用mex小做封装,写了两个matlab可以直接调用的接口。
保存svm model到文件:(savemodel.c)
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #include "svm.h"
- #include "mex.h"
- #include "svm_model_matlab.h"
- void exit_with_help()
- {
- mexPrintf(
- "Usage: savemodel('filename', model);\n"
- );
- }
- int savemodel(const char *filename, const mxArray *matlab_struct)
- {
- const char *error_msg;
- struct svm_model* model;
- int result;
- model = matlab_matrix_to_model(matlab_struct, &error_msg);
- if (model == NULL)
- {
- mexPrintf("Error: can't read model: %s\n", error_msg);
- }
- result = svm_save_model(filename, model);
- if( result != 0 )
- {
- mexPrintf("Error: can't write model to file!\n");
- }
- return result;
- }
- void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
- {
- if(nrhs == 2)
- {
- char filename[256];
- int *result;
- mxGetString(prhs[0], filename, mxGetN(prhs[0])+1);
- plhs[0] = mxCreateNumericMatrix(1, 1, mxINT8_CLASS, 0);
- result = mxGetPr(plhs[0]);
- *result = savemodel(filename, prhs[1]);
- }
- else
- {
- exit_with_help();
- return;
- }
- }
读取文件中的svm model:( loadmodel.c )
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #include "svm.h"
- #include "mex.h"
- #include "svm_model_matlab.h"
- void exit_with_help()
- {
- mexPrintf(
- "Usage: model = loadmodel('filename', num_of_feature);\n"
- );
- }
- void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
- {
- if(nrhs == 2)
- {
- char filename[256];
- int num_of_feature;
- struct svm_model* model;
- int featurenum;
- const char *error_msg;
- mxGetString(prhs[0], filename, mxGetN(prhs[0])+1);
- model = svm_load_model(filename);
- if(model == NULL)
- {
- mexPrintf("Error: can't read the model file!\n");
- return;
- }
- featurenum = *(mxGetPr(prhs[1]));
- error_msg = model_to_matlab_structure(plhs, featurenum, model);
- if(error_msg)
- mexPrintf("Error: can't convert libsvm model to matrix structure: %s\n", error_msg);
- svm_free_and_destroy_model(&model);
- }
- else
- {
- exit_with_help();
- return;
- }
- }
这两个文件放入libsvm-3.1/matlab目录下,然后打开同目录下的make.m文件,添加如下两行(红色部分):
mex -O -largeArrayDims -I..\ -c ..\svm.cpp
mex -O -largeArrayDims -I..\ -c svm_model_matlab.c
mex -O -largeArrayDims -I..\ svmtrain.c svm.obj svm_model_matlab.obj
mex -O -largeArrayDims -I..\ svmpredict.c svm.obj svm_model_matlab.obj
mex -O -largeArrayDims -I..\ savemodel.c svm.obj svm_model_matlab.obj
mex -O -largeArrayDims -I..\ loadmodel.c svm.obj svm_model_matlab.obj
最后在matlab中,libsvm-3.1/matlab目录下运行“make”,等到编译完成后,生成savemodel.mexw32、loadmodel.mexw32两个文件。(64位的系统生成的两个文件扩展名不一样)
此时就可以在matlab中使用savemodel('filename', model)和model = loadmodel('filename', num)来读取和保存训练好的svm模型了。
注意:loadmodel接口中的第二个参数num是向量的维度(特征数),即500个30维的样本,num=30.
(貌似多了这个参数是因为matlab调用了model_to_matlab_structure这个接口的缘故,在c/c++中读写模型就不需用num这个参数了)
如果需要在c/c++程序中调用libsvm的模型文件,就直接用svm_save_model(),svm_load_model()等函数进行操作了。
我用的版本是libsvm 2.91,savemodel.c没有问题,loadmodel需要做如下修改
svm_free_and_destroy_model(&model); 修改为 svm_destroy_model(model);
完美运行
相关推荐
matlab使用libsvm进行分类代码实例, 这里包括一个数据集合, 一个代码(包括详细注释),而且代码经过修改,已经符合最新的libsvm调用格式,不会出错,用于SVM分类。 首先通过博客,安装好libsvm库,博客地址:...
matlab7.1安装libsvm步骤,以及出现的问题和解决方法
matlab使用Libsvm例子,本人技术小白,刚开始也在如何安装和使用libsvm上出现了很多问题,是为了毕设的一个分类问题,希望可以与大家共同进步。资源中包括java、matlab、python与c++。
libSVM.rarlibSVM.rarlibSVM.rarlibSVM.rarlibSVM.rarlibSVM.rarlibSVM.rarlibSVM.rar
模式识别课程作业 matlab与libsvm环境 基于svm的人脸识别程序。 模式识别课程作业,利用pca与svm进行人脸识别。 matlab与libsvm环境 人脸识别
百度上的添加办法是把整个libsvm库下载下来,并且你需要用matlab调用C++程序,然后才能使用这个库。 作者经过一系列的百度搜索并经过了一系列的错误后,才明白整个过程的核心其实就是需要把这个库的上述四个程序文件...
安装libsvm-mat是在MATLAB平台下使用libsvm的前提,如果没有安装好也就无法使用,在MATLAB平台下安装libsvm-mat一般有以下几个大步骤: 1. 将libsvm-mat所在工具箱添加到matlab工作搜索目录 (File ——》 Set Path...
libsvm的matlab代码 可添加到matlab中运行使用
这是我自己写的一个在matlab里安装libsvm的东西,安装需要的装的软件里面都有,大家直接按我写的步骤安装就可以。
libsvm回归算法使用源码与数据,使用matlab语言实现
Matlab的libsvm工具包(LIBSVM——支持向量机的库) [libsvm-3.23.zip是还未编译的;libsvm-3.23(matlab).zip是Matab编译过的] 包括使用指南(guide.pdf)
用MATLAB支持向量机对图像进行分类时用到了libsvm,于是就用了该文件libsvm的安装过程,我的MATLAB是R2016b版本Windows7系统。
在支持向量机的众多程序包中,最著名的当属台湾大学林智仁老师开发的 libsvm 了,当初我学习支持向量机,代码实现的时候选择用 R 语言实现,因为 libsvm 已经在“e1071”包中。 我也曾经尝试了不下三次给 Matlab ...
用于MATLABR2018R配置LIBSVM工具箱时,mex无法编译
台湾林智仁Matlab的libsvm工具箱-libsvm-mat-2[1].89-3.zip 学习了SVM视频,找了个林智仁的工具箱分享下
支持向量机(SVM)matlab 代码,附有详细的使用说明及举例讲解。
matlab13 LIBSVM参数实例详解
应用libsvmpredict,libsvmtrain函数时需要libsvm库,这里是libsvm-3.23版本。
LIBSVM3.23版本不再提供matlab的heart_scale.mat数据,且LIBSVM3.23版本无法打开老版本的heart_scale.mat数据。因此根据老版本数据重新生成新版本的数据,可直接打开使用。
matlab编写的支持向量程序,主要由于预测libsvm-2.81,很好用