最近打算在研究中尝试稀疏编码。稀疏表示的理论知识这里不具体补充,有兴趣的可以查看下面这篇用稀疏表示做人脸识别的文章,讲得很清楚。
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的配置

  1. 下载
    从上述官网下载KL1p包,不能访问的话可以从这里下载。下载后解压到D:\KL1p-0.4.2目录下。
  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。
  3. 配置VS
    配置主要分为头文件配置和库文件配置。
    配置头文件:新建一个项目,然后点击项目属性,在“配置属性->C/C++->常规”中找到附加包含目录。然后添加如下图所示的几个目录。

    配置库文件: 在属性对话框“配置属性->连接器->常规”中找到“附加库目录”,在其中加入以下条目:D: \KL1p-0.4.2\bin\win;

    然后在属性对话框“配置属性->链接器->输入”的“附加依赖项”中,加入以下条目:
    KLab_d.lib(Release中则用KLab.lib)
    至此,配置已经完成,可以直接编代码测试了!!!
  4. 修改运行时库(可选)
    在完成前面三部的配置后,有可能编译代码时出现链接错误,编译不成功的情况。此时还需要修改一下运行时库。在属性对话框中“配置属性->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相关推荐

  1. Tools下的mdscongiguer 文件中 43行 oracle 配置 发现需要连接库 -lclntsh libclntsh.so 库是个什么东西呢?...

    Tools下的mdscongiguer     文件中 43行  oracle 配置      发现需要连接库 -lclntsh      libclntsh.so 库是个什么东西呢? 分想一个知乎网 ...

  2. win10 x64中 windbg x64 安装配置符号库

    根据系统安装好x64版本,我的系统是win10 x64 ; windbg下载地址 https://developer.microsoft.com/zh-cn/windows/hardware/down ...

  3. PHP 中 GD库(以及Jpgraph库) 的配置和使用。(满屏荒唐言,一把辛酸泪)

    PHP 中 GD库(以及Jpgraph库) 的配置和使用 (满屏荒唐言,一把辛酸泪)搞这种配置什么的真的太痛苦了! 一.安装前说明. 我的安装环境是,windows + IIS +php 首先我们要理 ...

  4. [软件工具][原创]pcl引用库一键配置到VisualStudio中支持vs2015-v2022使用教程

    你还在手动配置pcl吗?那你out了,由于pcl的include,lib太多很容易配置出错,为了解决配置效率低下配置出错问题,我们制作了一个全系列支持pcl配置工具,大家只要安装好pcl并保证有PCL ...

  5. Oracle Dataguard中备库中归档日志不同步

    环境:RAC+单机 Dataguard 问题:启动备库到ADG模式时,发现后台归档日志并不同步 1.在备库中发现日志的归档日志不同步,内容如下: MRP0: Background Media Reco ...

  6. 【Android 安装包优化】动态库打包配置 ( “armeabi-v7a“, “arm64-v8a“, “x86“, “x86_64“ APK 打包 CPU 指令集配置 | NDK 完整配置参考 )

    文章目录 一.动态库打包配置 二.NDK 完整配置参考 三.参考资料 一.动态库打包配置 在 build.gradle 构建脚本中 , 配置 ndk 编译的动态库 CPU 架构类型 ; 在 " ...

  7. 【Android NDK 开发】Visual Studio 2019 使用 CMake 开发 JNI 动态库 ( 动态库编译配置 | JNI 头文件导入 | JNI 方法命名规范 )

    文章目录 I . JNI 与 NDK 区别 II . Visual Studio 编译动态库 III. 配置 导入 jni.h 头文件 IV . IntelliJ IDEA Community Edi ...

  8. VC 6.0中添加库文件和头文件

    VC 6.0中添加库文件和头文件 分类: VC/VS 加头文件包含 VC6.0中: VC6.0默认include包含路径:Tools>Options>Directories>Incl ...

  9. python3 urlencode_Python2和Python3中urllib库中urlencode的使用注意事项

    前言 在Python中,我们通常使用urllib中的urlencode方法将字典编码,用于提交数据给url等操作,但是在Python2和Python3中urllib模块中所提供的urlencode的包 ...

最新文章

  1. 东南大学和山东大学计算机学院,东南大学和山东大学都是985、211哪所综合实力更强些呢?...
  2. 我还不懂什么是分布式事务
  3. 【论文笔记】 LSTM-BASED DEEP LEARNING MODELS FOR NONFACTOID ANSWER SELECTION
  4. RxAndroid之操作数据库SqlBrite(RXAndroid实现数据库的增、删、改、查)
  5. MATLAB从入门到精通-控制系统动态特性的计算以及阶跃响应波德图等
  6. Spring Boot 微服务性能下降九成!使用 Arthas 定位根因
  7. 关于Unity中Shader的内置值
  8. Oracle中table变量在JDBC中的运用
  9. python任务调度平台 界面_分布式任务调度平台XXL-JOB
  10. 哈啰出行架构调整:两轮电动车租售平台将升级为独立事业部
  11. 接口做的好怎么形容_匠品美缝知识之接口美缝如何做?
  12. Linux的用户和用户组管理(转)
  13. 【git】克隆成功,但是检出失败
  14. 【机房报修管理系统】1.简介篇 机房报修管理系统简介
  15. 聊聊Java中代码优化的30个小技巧
  16. linux虚拟机双显卡,Kali Linux 2.0 安装 NVIDIA显卡驱动实现双显卡(联想笔记本)
  17. unreal编译源码搭建dedicated server的流水账——但是细
  18. 支付宝支付--手机支付
  19. ​​​​​​​墨画子卿第三章:初心第2节:回家
  20. HTML标签、认识浏览器

热门文章

  1. ajax asp后台获取不到post数据,asp.net webapi [FromBody]string 获取不到ajax post的数据的解决方法...
  2. 抢答网页PHP,GitHub - zhaiwenjun/vie-to-answer: 用于小型多人的线下知识竞赛活动的在线抢答器...
  3. pdf.js 修改预览页面title
  4. Machine Learning with Graphs 之 Random Walk with Restarts and Personalized PageRank
  5. 300色 柔和色彩渐变色卡(十六进制)
  6. Java中四舍五入和四舍六入五成双
  7. tplink478虚拟服务器设置,tp-link路由器TL-R473如何设置,10台电脑设置局域网
  8. 深入理解地址翻译 CSAPP
  9. unity使用tiled文件,将数据用unity打开,可以无限tiled地图
  10. 三跨难不难 还跨计算机,计算机专业考研学校