写在前面
由于工作上需要C++版的Normalized Cut代码,由于不想重复造轮子,于是爬遍几乎整个网络,找到了一个比较靠谱的版本,但期间各种配置,终于搞定,做下记录。
代码原始版在这里。
Linux系统下的配置
首先自己在Ubuntu系统上验证了下做了快速验证,步骤如下。
一、环境配置
1 先下载Boost Eigen3 两个库,放到/usr/include路径下(这两个是.h版的库,不需要安装);
2 安装依赖库arpack: sudo apt-get install libarpack2-dev libsuperlu3-dev;
3 git clone源码,进行make。
二、出现的问题及解决方法
make的时候出现错误: no declarations were found by argument-dependent lookup。
解决:跟进去发现找不到的是继承里的虚函数,在makefile里添加 -fpermissive make搞定。
Linux->Window的移植
自己的程序是在VS上编写的,所以需要移植到VS,但开源代码是Linux下的。成功移植的步骤如下:
一、移植ARPACK,参考的这篇文章,有以下几点需要注意。
1 现在已经淘汰FC=g77的Fortran的编译器,需要改为gfortran,修改文件 ARmake.inc:
FC = gfortran 注释掉FFLAGS = -O -cg89
2 修改 second.f 文件为:
SUBROUTINE SECOND( T ) REAL T CALL CPU_TIME(T) RETURN END
二、arcompp.h里加入 #define GNUG ,不然提示找不到 arcomplex标志 。
小注
这个C++版本的Normalized Cut代码和Matlab版的有些出入,作者在源码中也有些相应的说明,我自己在作者源码的基础上又做了些修改,最终聚类效果还不错。