根据个人经验,这个问题注意以下几点即可解决。
1、软件版本问题
首先要认清自己Matlab的版本,这与第二个问题密切相关。
2、编译器问题
在Matlab的命令行中输入,mex -setup
如果正常执行,会跳出编译器选项给你选择。如果没有编译器,则会告诉你没有合适的编译器。
那么,如果没有编译器,就需要下载安装一个。
下载安装前,请到以下网址查看自己的Matlab支持哪些编译器。
https://ww2.mathworks.cn/support/sysreq/previous_releases.html
不同版本的Matlab支持的编译器是不同的,例如
我们可以看到Matlab2014a对于VS只支持到2013。因此我虽然装了VS2017,但也用不上,所以又装了一个VS2013才解决。
3、重新编译文件
将Matlab的文件路径设置为F:\libsvm-3.22\matlab(此处用的是我的盘符),即进入libsvm软件包的matlab文件夹。
安装好编译器后,在命令行输入 mex -setup 。
接着在命令行输入 make
等文件编译好后,你会发现在libsvm软件包的matlab文件下多出了一些文件,主要是
'libsvmread.mex', 'libsvmwrite.mex', 'svmtrain.mex',和'svmpredict.mex'
简单粗暴一点,全部复制。
粘贴到F:\libsvm-3.22\windows,即粘贴到libsvm软件包的windows文件夹中,报重复则替换。
最好将'svmtrain.mex',和'svmpredict.mex'重命名为libsvmtrain.mex和libsvmpredict.mex,避免和Matlab自带的重名。
4、测试
[heart_scale_label,heart_scale_inst] = libsvmread('F:/libsvm-3.22/heart_scale');
model = libsvmtrain(heart_scale_label,heart_scale_inst,'-c 1 -g 0.07');
[predict_label, accuracy,dec_values] = libsvmpredict(heart_scale_label,heart_scale_inst,model);
结果为
*
optimization finished, #iter = 134
nu = 0.433785
obj = -101.855060, rho = 0.426412
nSV = 130, nBSV = 107
Total nSV = 130
Accuracy = 86.6667% (234/270) (classification)
到这,libsvm就能正常使用了。
5、一些小发现
a.其实,libsvm-3.22中已经为我们编译好了文件,但不知为何就是用不了,会出现libsvmtrain.mexw64无效的错误。所以,我们需要重新编译。
b.我起初觉得再装一个VS2013觉得麻烦,就在朋友电脑上编译了下,再把文件拷过来,结果在我电脑上能用。可是换另一台就不能用了,Matlab的版本是一样的,但是Windows的版本不一样,所以应该和系统版本也有关系。
c.所以还是不偷懒了,哪台电脑用,就在哪台电脑上编译。
希望对大家有帮助!