代码在网上可以找到,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库,博客地址:...
- 在MATLAB中通过菜单操作添加路径:`File -> Set Path -> Add with Subfolders...`,然后找到刚才解压的`libsvm-mat-2.83-1`文件夹位置,并点击保存,最后关闭窗口。 ##### 3. 配置编译器 - 打开MATLAB命令窗口,...
matlab使用Libsvm例子,本人技术小白,刚开始也在如何安装和使用libsvm上出现了很多问题,是为了毕设的一个分类问题,希望可以与大家共同进步。资源中包括java、matlab、python与c++。
安装LIBSVM并在MATLAB中读入数据集的操作主要涉及以下步骤:访问LIBSVM官方网站下载MATLAB版本的LIBSVM包,解压缩并将文件放置在MATLAB的toolbox目录下,设置MATLAB的工作路径以包含LIBSVM的文件夹,下载并保存所需...
在MATLAB中安装libsvm(支持向量机)是一个常见的任务,特别是在进行机器学习和数据挖掘项目时。libsvm是一个著名的开源库,由Chih-Chung Chang和Chih-Jen Lin开发,它提供了高效的SVM(支持向量机)算法实现。下面...
首先,`libsvm的matlab代码`是LibSVM为MATLAB用户提供的接口,使得用户能够在MATLAB环境中直接调用SVM算法进行数据处理。这个压缩包`libsvm-mat-2.86-1`很可能包含了LibSVM MATLAB接口的源码、示例脚本以及相关的...
libSVM.rarlibSVM.rarlibSVM.rarlibSVM.rarlibSVM.rarlibSVM.rarlibSVM.rarlibSVM.rar
在MATLAB R2018b中配置LIBSVM(Library for Support Vector Machines)工具箱是一项常见的任务,特别是在进行机器学习研究和应用时。LIBSVM是一个强大的、免费的开源软件,它提供了支持向量机(SVM)的实现,支持...
标题中的“MATLAB替换式libsvm安装”指的是在MATLAB环境中使用libsvm库的一种方法,这种方法通常是通过将编译好的libsvm源代码直接替换MATLAB工作空间中的相应文件来实现的。libsvm是一个广泛使用的支持向量机(SVM...
在libSVM的MATLAB接口中,用户可以方便地调用预定义的函数来训练SVM模型、进行预测以及调整参数。 在压缩包内的文件中,可能包括以下内容: 1. **数据集**:用于训练和测试SVM回归模型的样本数据,可能以`.mat`格式...
百度上的添加办法是把整个libsvm库下载下来,并且你需要用matlab调用C++程序,然后才能使用这个库。 作者经过一系列的百度搜索并经过了一系列的错误后,才明白整个过程的核心其实就是需要把这个库的上述四个程序文件...
提供的"模式识别课程作业 matlab与libsvm环境 基于svm的人脸识别程序.pdf"文件很可能包含了详细步骤、代码示例以及实验结果分析,可以帮助我们深入了解如何在实际操作中应用上述理论知识。通过这个作业,学生可以...
用户需要先编译libsvm的源代码,生成相应的MEX文件,然后在MATLAB脚本或函数中调用这些MEX函数进行模型训练和预测。 关于“rice11m”标签,这可能是指一个特定的数据集,比如Rice University的11M数据集,它可能被...
在MATLAB2013a中使用LIBsvm3.17,用户首先需要将解压后的libsvm文件夹放置在MATLAB的工作路径中,然后就可以直接加载和调用相关函数。例如,以下是一个简单的示例,演示如何使用`svmtrain`训练一个SVM模型: ```...
安装libsvm-mat是在MATLAB平台下使用libsvm的前提,如果没有安装好也就无法使用,在MATLAB平台下安装libsvm-mat一般有以下几个大步骤: 1. 将libsvm-mat所在工具箱添加到matlab工作搜索目录 (File ——》 Set Path...
在Matlab环境中,LibSVM为用户提供了方便的接口,使得在Matlab中进行SVM模型的训练和预测变得更加容易。 "speederq"可能是提到的一种特定的优化或加速库,但具体细节未在标题和描述中明确给出。通常,这样的工具...
首先,libsvm-mat-2.89-3是针对Matlab平台的libsvm版本,它包含了实现SVM算法所需的函数和脚本,使得用户可以在Matlab环境中方便地进行SVM模型的训练与预测。此版本为2.89-3,意味着它是经过多次迭代优化后的稳定...
在实际应用libsvm-3.11时,用户需要了解如何在MATLAB中加载和调用库文件,以及如何设置和优化SVM模型的参数。此外,还需要掌握数据预处理技巧,如特征选择、归一化等,以提升模型的性能。在VC6.0编译的libsvm-3.11...
以下是一份详细的libsvm在Matlab中的安装教程,特别针对64位Windows系统的Matlab 2016b和2017a。 首先,你需要安装一个C++编译器来编译libsvm所需的源代码。推荐使用TDM-GCC,可以从...
Matlab的libsvm工具包(LIBSVM——支持向量机的库) [libsvm-3.23.zip是还未编译的;libsvm-3.23(matlab).zip是Matab编译过的] 包括使用指南(guide.pdf)