环境
Windows 2010
MATLAB R2017b
MATLAB R2021b(切换默认的C\C++编译器需要额外下载补丁文件)
KDE Toolbox R13 (下载地址,已经不再更新版本了)(此外,后来又找到大神对该工具箱自行debug后发布的版本,github地址,本人暂未尝试,下述安装过程均按照第一个老版本进行)
安装过程
首先要确保你的win10系统里存在C++的编译器(系统没有自带)。KDE类是用于k维核密度估计的通用matlab类。 它是用matlab“.m”文件和MEX / C ++代码混合编写的。因此,要使用它,你需要能够为Matlab编译C ++代码。 请注意,Windows的默认编译器不支持C ++,因此您需要在Linux下使用GCC,或者在Windows下使用GCC或Visual C ++。
通过在系统命令窗口中输入指令gcc -v
查看是否安装了gcc及其安装位置和版本(我这里是安装了MinGW 64 8.1, 由于之前安装过VS Studio, 所以我系统里也有MS VisualC++,详情看下面“编译问题”部分)
接下来下载KDE包,解压后将@kde
文件夹放入到一个新的文件夹中,然后将这个文件夹放到...\MATLAB\toolbox
文件夹中,如我新建了一个kde
文件夹,这一步很重要!!! 因为@kde
这个文件夹名称不能直接放到<设置路径>中,但又不能改名字
之后打开MATLAB,从MATLAB左侧“当前文件夹”栏一路双击进入...\MATLAB\toolbox\kde\@kde\mex
文件夹中,将makemex.m
文件拖入中间命令行窗口,回车运行,开始编译(关于此处使用的编译器问题后文会讲)。
正常会报错,如图
在@kde\mex\cpp\BallTreeDensityClass.cc
中的第470行, type = (BallTreeDensity::KernelType) mxGetScalar(mxGetField(structure,0,”type” ));
由于VS2013不支持枚举类型和double类型数的直接转化,因此在编译时会报错,可以先将double类型强制转化为int类型,然后再转化到枚举类型,即:type = (BallTreeDensity::KernelType) (int)mxGetScalar(mxGetField
(structure, 0,”type”));
解决方案来源:https://blog.csdn.net/lvfeiya/article/details/72860695
重新编译一次,耐心等候编译完成,最后将...\MATLAB\toolbox\kde
放入到<设置路径>中,选择包括其子文件
测试一下
编译问题
很可能编译成功,但之后运行@kde工具箱时可能会报错
或其他错误,如错误使用 class CLASS 函数必须从类构造函数内调用。
等,这是因为编译时使用的是==Microsoft Visual C++==进行编译,这个是有BUG的,工具箱作者有说,
所以要使用MinGW编译器
,对C和C++进行编译。MinGW编译器具体的安装过程和配置环境变量过程网上很多,此处略过,接下来介绍如何在MATLAB中配置MinGW编译器来编译C和C++.
- Matlab 2017将MinGW编译器添加到MATLAB中,在命令行窗口输入
setenv('MW_MINGW64_LOC','folder')
,folder为MinGW的安装位置(跟环境变量路径一致即可)
但在新本版的Matlab中,需要下载(下载地址)一个补丁文件configuremingw.p
,放到matlab的安装根目录中(~\MATLAB\R2021b\
),即和toolbox、bin等文件夹同目录。然后在matlab中找到该文件夹右击运行,在跳出的窗口中选择你安装MinGW的文件夹位置,选择mingw64
文件夹即可,不需要深入选择bin等其他文件。 - 查看并选择MATLAB的C的编译器
3.按照指示更改编译器
4.同理,按照指示命令修改C++的编译器
5 重新编译makemex.m
文件文件
Done