稀疏表示中KL1p库的配置及Demo
最近打算在研究中尝试稀疏编码。稀疏表示的理论知识这里不具体补充,有兴趣的可以查看下面这篇用稀疏表示做人脸识别的文章,讲得很清楚。
http://blog.csdn.net/xiaoshengforever/article/details/14002843
稀疏表示中的关键是求解L2范数或者L1范数。L2范数的求解很简单,一个公式就搞定了; L1范数的求解就要复杂多了,求解的方式也有很多种。笔者做了实验后发现用L1求解出的结果确实比用L2求解出的结果稀疏多了。
通常求解L1范数都要借助第三方包。网上求解L1的MATLAB包比较多,但是C++包却相对很少,搜索后发现了KL1p这个好东西。
kl1p是一个压缩感知方面的C++库,里面封装了很多压缩感知方法,在稀疏表(SRC)示中主要是借助它来求取l1范数最小化问题。它的官方:http://kl1p.sourceforge.net/home.html 目前的版本是0.4.2
KL1p的配置
- 下载
从上述官网下载KL1p包,不能访问的话可以从这里下载。下载后解压到D:\KL1p-0.4.2目录下。 - 编译生成库文件
在目录D:\KL1p-0.4.2\build\win下用VS2010打开KLab.vcxproj文件进行编译,注意在Debug模式和Release模式下都要进行编译。编译成功后在D:\KL1p-0.4.2\bin\win目录会生成两个库文件,分别是KLab.lib和KLab_d.lib。带_d的库文件表示用于Debug。
- 配置VS
配置主要分为头文件配置和库文件配置。
配置头文件:新建一个项目,然后点击项目属性,在“配置属性->C/C++->常规”中找到附加包含目录。然后添加如下图所示的几个目录。
配置库文件: 在属性对话框“配置属性->连接器->常规”中找到“附加库目录”,在其中加入以下条目:D: \KL1p-0.4.2\bin\win;
然后在属性对话框“配置属性->链接器->输入”的“附加依赖项”中,加入以下条目:
KLab_d.lib(Release中则用KLab.lib)
至此,配置已经完成,可以直接编代码测试了!!! - 修改运行时库(可选)
在完成前面三部的配置后,有可能编译代码时出现链接错误,编译不成功的情况。此时还需要修改一下运行时库。在属性对话框中“配置属性->C/C++ ->代码生成”中找到“运行库“,选择“多线程调试 (/MTd)”
说明:从KL1p的配置可以看到,在KL1p在求解矩阵时实际上是通过Armadillo库来实现的,关于Armadillo库的矩阵操作手册可在这个网站查询:
http://arma.sourceforge.net/docs.html
最后给一个完整Demo程序
//KL1p Demo
#include"armadillo"
#include <KL1pInclude.h>
#include <KL1p.h>using namespace std;
using namespace kl1p;
using namespace arma;
int main()
{arma::mat featureMat; //839*156featureMat.load("LBPPCANorFeatures.csv",csv_ascii); arma::mat x0; //1*156x0.load("test.csv",csv_ascii);//在读取的两个csv文件中,一个样本的特征占一行,所以需要取转置arma::mat A1 = featureMat.t(); arma::mat y = x0.t();std::cout<<"Start of KL1p compressed-sensing example."<<std::endl;std::cout<<"Try to determine a sparse vector x "<<std::endl;std::cout<<"from an underdetermined set of linear measurements y=A*x, "<<std::endl;std::cout<<"where A is a random gaussian i.i.d sensing matrix."<<std::endl;klab::UInt32 n = A1.n_rows; // Size of the original signal x0.klab::DoubleReal alpha = 0.5; // Ratio of the cs-measurements.klab::DoubleReal rho = 0.1; // Ratio of the sparsity of the signal x0.klab::UInt32 m = klab::UInt32(alpha*n); // Number of cs-measurements.klab::UInt32 k = klab::UInt32(rho*n); // Sparsity of the signal x0 (number of non-zero elements).klab::UInt64 seed = 0; // Seed used for random number generation (0 if regenerate random numbers on each launch).bool bWrite = true; // Write signals to files ?// Display signal informations.std::cout<<"=============================="<<std::endl;std::cout<<"N="<<n<<" (signal size)"<<std::endl;std::cout<<"M="<<m<<"="<<std::setprecision(5)<<(alpha*100.0)<<"% (number of measurements)"<<std::endl;std::cout<<"K="<<k<<"="<<std::setprecision(5)<<(rho*100.0)<<"% (signal sparsity)"<<std::endl;std::cout<<"=============================="<<std::endl;kl1p::TMatrixOperator<klab::DoubleReal> * matrix = new kl1p::TMatrixOperator<klab::DoubleReal>(A1);klab::TSmartPointer<kl1p::TOperator<klab::DoubleReal, klab::DoubleReal> > * A2 =new klab::TSmartPointer<kl1p::TOperator<klab::DoubleReal, klab::DoubleReal> >(matrix);klab::TSmartPointer<kl1p::TOperator<klab::DoubleReal, klab::DoubleReal> > A = *A2;klab::DoubleReal tolerance = 1e-3; // Tolerance of the solution.arma::Col<klab::DoubleReal> x; // Will contain the solution of the reconstruction.klab::KTimer timer;// Compute Basis-Pursuit.std::cout<<"[BasisPursuit] Start."<<std::endl;timer.start();kl1p::TBasisPursuitSolver<klab::DoubleReal> bp(tolerance);bp.solve(y, A, x);timer.stop();std::cout<<"[BasisPursuit] Done - SNR="<<std::setprecision(5)<<klab::SNR(x, x0)<<" - "<<"Time="<<klab::UInt32(timer.durationInMilliseconds())<<"ms"<<" - "<<"Iterations="<<bp.iterations()<<std::endl;if(bWrite)x.save("BasisPursuit-Signal.csv",csv_ascii); // Write solution to a file.// Compute OMP.std::cout<<"------------------------------"<<std::endl;std::cout<<"[OMP] Start."<<std::endl;timer.start();kl1p::TOMPSolver<klab::DoubleReal> omp(tolerance);omp.solve(y, A, k, x);timer.stop();std::cout<<"[OMP] Done - SNR="<<std::setprecision(5)<<klab::SNR(x, x0)<<" - "<<"Time="<<klab::UInt32(timer.durationInMilliseconds())<<"ms"<<" - "<<"Iterations="<<omp.iterations()<<std::endl;if(bWrite)x.save("OMP-Signal.csv",csv_ascii); // Write solution to a file.// Compute ROMP.std::cout<<"------------------------------"<<std::endl;std::cout<<"[ROMP] Start."<<std::endl;timer.start();kl1p::TROMPSolver<klab::DoubleReal> romp(tolerance);romp.solve(y, A, k, x);timer.stop();std::cout<<"[ROMP] Done - SNR="<<std::setprecision(5)<<klab::SNR(x, x0)<<" - "<<"Time="<<klab::UInt32(timer.durationInMilliseconds())<<"ms"<<" - "<<"Iterations="<<romp.iterations()<<std::endl;if(bWrite)x.save("ROMP-Signal.csv",csv_ascii); // Write solution to a file.// Compute CoSaMP.std::cout<<"------------------------------"<<std::endl;std::cout<<"[CoSaMP] Start."<<std::endl;timer.start();kl1p::TCoSaMPSolver<klab::DoubleReal> cosamp(tolerance);cosamp.solve(y, A, k, x);timer.stop();std::cout<<"[CoSaMP] Done - SNR="<<std::setprecision(5)<<klab::SNR(x, x0)<<" - "<<"Time="<<klab::UInt32(timer.durationInMilliseconds())<<"ms"<<" - "<<"Iterations="<<cosamp.iterations()<<std::endl;if(bWrite)x.save("CoSaMP-Signal.csv",csv_ascii); // Write solution to a file.// Compute Subspace-Pursuit.std::cout<<"------------------------------"<<std::endl;std::cout<<"[SubspacePursuit] Start."<<std::endl;timer.start();kl1p::TSubspacePursuitSolver<klab::DoubleReal> sp(tolerance);sp.solve(y, A, k, x);timer.stop();std::cout<<"[SubspacePursuit] Done - SNR="<<std::setprecision(5)<<klab::SNR(x, x0)<<" - "<<"Time="<<klab::UInt32(timer.durationInMilliseconds())<<"ms"<<" - "<<"Iterations="<<sp.iterations()<<std::endl;if(bWrite)x.save("SubspacePursuit-Signal.csv",csv_ascii); // Write solution to a file.// Compute SL0.std::cout<<"------------------------------"<<std::endl;std::cout<<"[SL0] Start."<<std::endl;timer.start();kl1p::TSL0Solver<klab::DoubleReal> sl0(tolerance);sl0.solve(y, A, x);timer.stop();std::cout<<"[SL0] Done - SNR="<<std::setprecision(5)<<klab::SNR(x, x0)<<" - "<<"Time="<<klab::UInt32(timer.durationInMilliseconds())<<"ms"<<" - "<<"Iterations="<<sl0.iterations()<<std::endl;if(bWrite)x.save("SL0-Signal.csv",csv_ascii); // Write solution to a file.// Compute AMP.std::cout<<"------------------------------"<<std::endl;std::cout<<"[AMP] Start."<<std::endl;timer.start();kl1p::TAMPSolver<klab::DoubleReal> amp(tolerance);amp.solve(y, A, x);timer.stop();std::cout<<"[AMP] Done - SNR="<<std::setprecision(5)<<klab::SNR(x, x0)<<" - "<<"Time="<<klab::UInt32(timer.durationInMilliseconds())<<"ms"<<" - "<<"Iterations="<<amp.iterations()<<std::endl;if(bWrite)x.save("AMP-Signal.csv",csv_ascii); // Write solution to a filesystem("pause");return 0;
}
程序的执行结果如下:
从结果可以看到,不同的算法所需的求解时间不同。
下面详细看看不同算法求解出的结果。
BasicPursuit的计算结果:
OMP的求解结果:
ROMP的求解结果:
CoSaMP的求解结果:
SubspacePursuit的求解结果:
SL0的求解结果:
AMP的求解结果:
从以上结果可以看到,不同的算法求解出的结果稀疏度有较大的差别。
完成Demo程序及数据下载地址:
http://download.csdn.net/detail/computerme/9309285
Reference:
http://blog.csdn.net/jianjian1992/article/details/49387477 例子讲解
http://blog.csdn.net/u013088062/article/details/44566667 配置过程
http://blog.csdn.net/xiaoshengforever/article/details/14002843 人脸识别
稀疏表示中KL1p库的配置及Demo相关推荐
- Tools下的mdscongiguer 文件中 43行 oracle 配置 发现需要连接库 -lclntsh libclntsh.so 库是个什么东西呢?...
Tools下的mdscongiguer 文件中 43行 oracle 配置 发现需要连接库 -lclntsh libclntsh.so 库是个什么东西呢? 分想一个知乎网 ...
- win10 x64中 windbg x64 安装配置符号库
根据系统安装好x64版本,我的系统是win10 x64 ; windbg下载地址 https://developer.microsoft.com/zh-cn/windows/hardware/down ...
- PHP 中 GD库(以及Jpgraph库) 的配置和使用。(满屏荒唐言,一把辛酸泪)
PHP 中 GD库(以及Jpgraph库) 的配置和使用 (满屏荒唐言,一把辛酸泪)搞这种配置什么的真的太痛苦了! 一.安装前说明. 我的安装环境是,windows + IIS +php 首先我们要理 ...
- [软件工具][原创]pcl引用库一键配置到VisualStudio中支持vs2015-v2022使用教程
你还在手动配置pcl吗?那你out了,由于pcl的include,lib太多很容易配置出错,为了解决配置效率低下配置出错问题,我们制作了一个全系列支持pcl配置工具,大家只要安装好pcl并保证有PCL ...
- Oracle Dataguard中备库中归档日志不同步
环境:RAC+单机 Dataguard 问题:启动备库到ADG模式时,发现后台归档日志并不同步 1.在备库中发现日志的归档日志不同步,内容如下: MRP0: Background Media Reco ...
- 【Android 安装包优化】动态库打包配置 ( “armeabi-v7a“, “arm64-v8a“, “x86“, “x86_64“ APK 打包 CPU 指令集配置 | NDK 完整配置参考 )
文章目录 一.动态库打包配置 二.NDK 完整配置参考 三.参考资料 一.动态库打包配置 在 build.gradle 构建脚本中 , 配置 ndk 编译的动态库 CPU 架构类型 ; 在 " ...
- 【Android NDK 开发】Visual Studio 2019 使用 CMake 开发 JNI 动态库 ( 动态库编译配置 | JNI 头文件导入 | JNI 方法命名规范 )
文章目录 I . JNI 与 NDK 区别 II . Visual Studio 编译动态库 III. 配置 导入 jni.h 头文件 IV . IntelliJ IDEA Community Edi ...
- VC 6.0中添加库文件和头文件
VC 6.0中添加库文件和头文件 分类: VC/VS 加头文件包含 VC6.0中: VC6.0默认include包含路径:Tools>Options>Directories>Incl ...
- python3 urlencode_Python2和Python3中urllib库中urlencode的使用注意事项
前言 在Python中,我们通常使用urllib中的urlencode方法将字典编码,用于提交数据给url等操作,但是在Python2和Python3中urllib模块中所提供的urlencode的包 ...
最新文章
- 东南大学和山东大学计算机学院,东南大学和山东大学都是985、211哪所综合实力更强些呢?...
- 我还不懂什么是分布式事务
- 【论文笔记】 LSTM-BASED DEEP LEARNING MODELS FOR NONFACTOID ANSWER SELECTION
- RxAndroid之操作数据库SqlBrite(RXAndroid实现数据库的增、删、改、查)
- MATLAB从入门到精通-控制系统动态特性的计算以及阶跃响应波德图等
- Spring Boot 微服务性能下降九成!使用 Arthas 定位根因
- 关于Unity中Shader的内置值
- Oracle中table变量在JDBC中的运用
- python任务调度平台 界面_分布式任务调度平台XXL-JOB
- 哈啰出行架构调整:两轮电动车租售平台将升级为独立事业部
- 接口做的好怎么形容_匠品美缝知识之接口美缝如何做?
- Linux的用户和用户组管理(转)
- 【git】克隆成功,但是检出失败
- 【机房报修管理系统】1.简介篇 机房报修管理系统简介
- 聊聊Java中代码优化的30个小技巧
- linux虚拟机双显卡,Kali Linux 2.0 安装 NVIDIA显卡驱动实现双显卡(联想笔记本)
- unreal编译源码搭建dedicated server的流水账——但是细
- 支付宝支付--手机支付
- ​​​​​​​墨画子卿第三章:初心第2节:回家
- HTML标签、认识浏览器
热门文章
- ajax asp后台获取不到post数据,asp.net webapi [FromBody]string 获取不到ajax post的数据的解决方法...
- 抢答网页PHP,GitHub - zhaiwenjun/vie-to-answer: 用于小型多人的线下知识竞赛活动的在线抢答器...
- pdf.js 修改预览页面title
- Machine Learning with Graphs 之 Random Walk with Restarts and Personalized PageRank
- 300色 柔和色彩渐变色卡(十六进制)
- Java中四舍五入和四舍六入五成双
- tplink478虚拟服务器设置,tp-link路由器TL-R473如何设置,10台电脑设置局域网
- 深入理解地址翻译 CSAPP
- unity使用tiled文件,将数据用unity打开,可以无限tiled地图
- 三跨难不难 还跨计算机,计算机专业考研学校