LIBSVM 是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包。

不少做机器学习的小伙伴需要把它编译并用在 Matlab 的环境,尤其是在 Windows 系统下,特别多麻烦。

下面我归纳出来的安装方法,适用于 Windows + GCC

安装 TDM-GCC

LIBSVM 毕竟是一个 C语言 写的库,因此需要使用编译器编译出接口让 Matlab 调用。

Matlabmex 支持多种编译器。在 Windows 上支持 Visual Studio,但是我已经安装了最新的 Visual Studio,不想再去折腾旧版的VS。因此我选择使用 GCC 的方案。

Windows 下可以使用的 GCC 编译链 有 MinGW64CygWinTDM-GCC
很可惜的是,老是折腾不上 MinGW64,最终就选择了 Matlab 推荐的 TDM-GCC

如果你是正版的 Matlab (好比说我),直接可以去 Mathworks 官网下载,一键安装
https://www.mathworks.com/matlabcentral/fileexchange/52848-matlab-support-for-mingw-w64-c-c-compiler

如果你是盗版的 Matlab,就需要手动来安装啦。 直接去 TDM-GCC 的官网下载: http://tdm-gcc.tdragon.net/download
最新版也是可以用于 Matlab 的。下载好了,直接按流程安装就OK了。

此处有个需要注意的地方,如果你需要使用 OpenMP 做并行计算,请记得在安装功能的时候勾上!!!

安装完了还没结束,请到系统的环境变量那里,变量名设置 MW_MINGW64_LOC,变量值为你的 TDM-GCC 的安装目录,好比说:C:/TDM-GCC-64。设置完了重开一次 Matlab 就可以使用 mex 编译啦。

测试 mex

Matlab 的命令行窗口(Command Window)处输入:mex -setup

看到输出 MEX configured to use 'MinGW64 Compiler (C) 差不多的话,就说明安装成功啦。

编译 LIBSVM

LIBSVM 的 Github 页面,在 Release 处下载最新版的源代码压缩包。

下载完成后,建议把压缩包解压到 Matlab 的安装目录下的 toolbox 目录。
然后使用 主页 - 设置路径 里面的 添加文件夹,把刚刚我们解压到 toolboxLIBSVM 文件夹下的 matlab 文件夹加入。
最后加入的搜索路径大概长这个样子:

1
C:\Matlab\toolbox\libsvm\matlab

完成这个事情之后,就可以切换 Matlab 的工作目录到上面的目录了。只需要一个命令就可以完成编译:

1
make

make 其实运行的是 make.m 那个编译脚本

如果你是 Windows 系统,这样是肯定编译不了的,会出现下面的错误。

1
2
3
4
5
使用 'MinGW64 Compiler (C)' 编译。
Error: C:\matlab\toolbox\libsvm\matlab\make.m failed (line 13)
gcc: error: \-fexceptions: No such file or directory
=> Please check README for detailed instructions.

怎么解决呢?网上写的解决方法都是不好的,那个改 COMPFLAGSIssue 并不是最好的,因为丢了 CFLAGS

下面是我总结出来的独家的解决方法:

其实问题在于 Windows 下的 $ 是没有语义的,因此不需要 \$ 做转义。因此!只需要把 make.m 下面的 \$CFLAGS 全部替换为 $CFLAGS,也就是删掉 \ 就可以在保留 CFLAGS 的基础上编译通过了。

下面是可以直接编译成功的 make.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
% This make.m is for MATLAB and OCTAVE under Windows, Mac, and Unix
function make()
try
% This part is for OCTAVE
if (exist ('OCTAVE_VERSION', 'builtin'))
mex libsvmread.c
mex libsvmwrite.c
mex -I.. svmtrain.c ../svm.cpp svm_model_matlab.c
mex -I.. svmpredict.c ../svm.cpp svm_model_matlab.c
% This part is for MATLAB
% Add -largeArrayDims on 64-bit machines of MATLAB
else
mex CFLAGS="$CFLAGS -std=c99" -largeArrayDims libsvmread.c
mex CFLAGS="$CFLAGS -std=c99" -largeArrayDims libsvmwrite.c
mex CFLAGS="$CFLAGS -std=c99" -I.. -largeArrayDims svmtrain.c ../svm.cpp svm_model_matlab.c
mex CFLAGS="$CFLAGS -std=c99" -I.. -largeArrayDims svmpredict.c ../svm.cpp svm_model_matlab.c
end
catch err
fprintf('Error: %s failed (line %d)\n', err.stack(1).file, err.stack(1).line);
disp(err.message);
fprintf('=> Please check README for detailed instructions.\n');
end

改完之后再运行一次 make 就可以啦。

测试 LIBSVM

将 LIBSVM 文件夹下的测试数据集 heart_scale libsvm\matlab 下。

切换工作目录到 libsvm\matlab 目录,在命令窗口(Command Window)运行以下命令。

1
2
3
[heart_scale_label,heart_scale_inst] = libsvmread('heart_scale');
model = svmtrain(heart_scale_label, heart_scale_inst) ;
[predict_label,accuracy,dec_values] = svmpredict(heart_scale_label, heart_scale_inst, model);

看到输出 Accuracy = 86.6667% 类似的文字就说明你的 LIBSVM 成功编译并可以使用啦!

除非注明,麦麦小家文章均为原创,转载请以链接形式标明本文地址。

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

本文地址:https://blog.micblo.com/2019/04/22/Matlab-下-libsvm-的编译与坑/