主要内容:

  1. CoSaMP的算法流程
  2. CoSaMP的MATLAB实现
  3. 一维信号的实验与结果
  4. 测量数M与重构成功概率关系的实验与结果

一、CoSaMP的算法流程

压缩采样匹配追踪(CompressiveSampling MP)是D. Needell继ROMP之后提出的又一个具有较大影响力的重构算法。CoSaMP也是对OMP的一种改进,每次迭代选择多个原子,除了原子的选择标准之外,它有一点不同于ROMP:ROMP每次迭代已经选择的原子会一直保留,而CoSaMP每次迭代选择的原子在下次迭代中可能会被抛弃。

二、CS_CoSaMP的MATLAB实现(CS_CoSaMP.m)

  1. function [ theta ] = CS_CoSaMP( y,A,K )
  2. % CS_CoSaOMP
  3. % Detailed explanation goes here
  4. % y = Phi * x
  5. % x = Psi * theta
  6. % y = Phi*Psi * theta
  7. % A = Phi*Psi, y=A*theta
  8. % K is the sparsity level
  9. % 现在已知yA,求theta
  10. % Reference:Needell DTropp J ACoSaMPIterative signal recovery from
  11. % incomplete and inaccurate samples[J].Applied and Computation Harmonic
  12. % Analysis,,:-.
  13. [m,n] = size(y);
  14. if m<n
  15. y = y'; %y should be a column vector
  16. end
  17. [M,N] = size(A); %传感矩阵A为M*N矩阵
  18. theta = zeros(N,); %用来存储恢复的theta(列向量)
  19. pos_num = []; %用来迭代过程中存储A被选择的列序号
  20. res = y; %初始化残差(residual)为y
  21. for kk=:K %最多迭代K次
  22. %() Identification
  23. product = A'*res; %传感矩阵A各列与残差的内积
  24. [val,pos]=sort(abs(product),'descend');
  25. Js = pos(:*K); %选出内积值最大的2K
  26. %() Support Merger
  27. Is = union(pos_num,Js); %Pos_thetaJs并集
  28. %() Estimation
  29. %At的行数要大于列数,此为最小二乘的基础(列线性无关)
  30. if length(Is)<=M
  31. At = A(:,Is); %将A的这几列组成矩阵At
  32. else %At的列数大于行数,列必为线性相关的,At'*At将不可逆
  33. if kk ==
  34. theta_ls = ;
  35. end
  36. break; %跳出for循环
  37. end
  38. %y=At*theta,以下求theta的最小二乘解(Least Square)
  39. theta_ls = (At'*At)^(-1)*At'*y; %最小二乘解
  40. %() Pruning
  41. [val,pos]=sort(abs(theta_ls),'descend');
  42. %() Sample Update
  43. pos_num = Is(pos(:K));
  44. theta_ls = theta_ls(pos(:K));
  45. %At(:,pos(:K))*theta_ls是y在At(:,pos(:K))列空间上的正交投影
  46. res = y - At(:,pos(:K))*theta_ls; %更新残差
  47. if norm(res)<1e- %Repeat the steps until r=
  48. break; %跳出for循环
  49. end
  50. end
  51. theta(pos_num)=theta_ls; %恢复出的theta
  52. end

三、一维信号的实验与结果

  1. %压缩感知重构算法测试
  2. clear all;close all;clc;
  3. M = ; %观测值个数
  4. N = ; %信号x的长度
  5. K = ; %信号x的稀疏度
  6. Index_K = randperm(N);
  7. x = zeros(N,);
  8. x(Index_K(:K)) = *randn(K,); %xK稀疏的,且位置是随机的
  9. Psi = eye(N); %x本身是稀疏的,定义稀疏矩阵为单位阵x=Psi*theta
  10. Phi = randn(M,N); %测量矩阵为高斯矩阵
  11. A = Phi * Psi; %传感矩阵
  12. y = Phi * x; %得到观测向量y
  13.  
  14. %% 恢复重构信号x
  15. tic
  16. theta = CS_CoSaMP( y,A,K );
  17. x_r = Psi * theta; % x=Psi * theta
  18. toc
  19.  
  20. %% 绘图
  21. figure;
  22. plot(x_r,'k.-'); %绘出x的恢复信号
  23. hold on;
  24. plot(x,'r'); %绘出原信号x
  25. hold off;
  26. legend('Recovery','Original')
  27. fprintf('\n恢复残差:');
  28. norm(x_r-x) %恢复残差

四、测量数M与重构成功概率关系的实验与结果

  1. clear all;close all;clc;
  2.  
  3. %% 参数配置初始化
  4. CNT = ; %对于每组(K,M,N),重复迭代次数
  5. N = ; %信号x的长度
  6. Psi = eye(N); %x本身是稀疏的,定义稀疏矩阵为单位阵x=Psi*theta
  7. K_set = [,,,,]; %信号x的稀疏度集合
  8. Percentage = zeros(length(K_set),N); %存储恢复成功概率
  9.  
  10. %% 主循环,遍历每组(K,M,N)
  11. tic
  12. for kk = :length(K_set)
  13. K = K_set(kk); %本次稀疏度
  14. M_set = *K::N; %M没必要全部遍历,每隔5测试一个就可以了
  15. PercentageK = zeros(,length(M_set)); %存储此稀疏度K下不同M的恢复成功概率
  16. for mm = :length(M_set)
  17. M = M_set(mm); %本次观测值个数
  18. fprintf('K=%d,M=%d\n',K,M);
  19. P = ;
  20. for cnt = :CNT %每个观测值个数均运行CNT
  21. Index_K = randperm(N);
  22. x = zeros(N,);
  23. x(Index_K(:K)) = *randn(K,); %xK稀疏的,且位置是随机的
  24. Phi = randn(M,N)/sqrt(M); %测量矩阵为高斯矩阵
  25. A = Phi * Psi; %传感矩阵
  26. y = Phi * x; %得到观测向量y
  27. theta = CS_CoSaMP(y,A,K); %恢复重构信号theta
  28. x_r = Psi * theta; % x=Psi * theta
  29. if norm(x_r-x)<1e- %如果残差小于1e-6则认为恢复成功
  30. P = P + ;
  31. end
  32. end
  33. PercentageK(mm) = P/CNT*; %计算恢复概率
  34. end
  35. Percentage(kk,:length(M_set)) = PercentageK;
  36. end
  37. toc
  38. save CoSaMPMtoPercentage1000 %运行一次不容易,把变量全部存储下来
  39.  
  40. %% 绘图
  41. S = ['-ks';'-ko';'-kd';'-kv';'-k*'];
  42. figure;
  43. for kk = :length(K_set)
  44. K = K_set(kk);
  45. M_set = *K::N;
  46. L_Mset = length(M_set);
  47. plot(M_set,Percentage(kk,:L_Mset),S(kk,:));%绘出x的恢复信号
  48. hold on;
  49. end
  50. hold off;
  51. xlim([ ]);
  52. legend('K=4','K=12','K=20','K=28','K=36');
  53. xlabel('Number of measurements(M)');
  54. ylabel('Percentage recovered');
  55. title('Percentage of input signals recovered correctly(N=256)(Gaussian)');

五、参考文章

http://blog.csdn.net/jbb0523/article/details/45441361

浅谈压缩感知(二十三):压缩感知重构算法之压缩采样匹配追踪(CoSaMP)的更多相关文章

  1. [转]压缩感知重构算法之分段正交匹配追踪(StOMP)

    分段正交匹配追踪(StagewiseOMP)或者翻译为逐步正交匹配追踪,它是OMP另一种改进算法,每次迭代可以选择多个原子.此算法的输入参数中没有信号稀疏度K,因此相比于ROMP及CoSaMP有独到的 ...

  2. 浅谈压缩感知(二十八):压缩感知重构算法之广义正交匹配追踪(gOMP)

    主要内容: gOMP的算法流程 gOMP的MATLAB实现 一维信号的实验与结果 稀疏度K与重构成功概率关系的实验与结果 一.gOMP的算法流程 广义正交匹配追踪(Generalized OMP, g ...

  3. 浅谈压缩感知(二十五):压缩感知重构算法之分段正交匹配追踪(StOMP)

    主要内容: StOMP的算法流程 StOMP的MATLAB实现 一维信号的实验与结果 门限参数Ts.测量数M与重构成功概率关系的实验与结果 一.StOMP的算法流程 分段正交匹配追踪(Stagewis ...

  4. 浅谈压缩感知(二十二):压缩感知重构算法之正则化正交匹配追踪(ROMP)

    主要内容: ROMP的算法流程 ROMP的MATLAB实现 一维信号的实验与结果 测量数M与重构成功概率关系的实验与结果 一.ROMP的算法流程 正则化正交匹配追踪ROMP算法流程与OMP的最大不同之 ...

  5. 压缩感知重构算法之压缩采样匹配追踪(CoSaMP)

    压缩采样匹配追踪(CompressiveSampling MP)是D. Needell继ROMP之后提出的又一个具有较大影响力的重构算法.CoSaMP也是对OMP的一种改进,每次迭代选择多个原子,除了 ...

  6. 【Visual C++】游戏开发五十六 浅墨DirectX教程二十三 打造游戏GUI界面(一)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/16384009 作者:毛星云 ...

  7. 浅谈Kotlin(二):基本类型、基本语法、代码风格

    浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 通过上面的文章,在A ...

  8. 浅谈Java代理二:Cglib动态代理-MethodInterceptor

    浅谈Java代理二:Cglib动态代理-MethodInterceptor CGLib动态代理特点: 使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生 ...

  9. 【沥血整理】灰度(二值)图像重构算法及其应用(morphological reconstruction)。

    不记得是怎么接触并最终研究这个课题的了,认识我的人都知道我是没有固定的研究对象的,一切看运气和当时的兴趣.本来研究完了就放在那里了,一直比较懒的去做总结,但是想一想似乎在网络上就没有看到关于这个方面的 ...

随机推荐

  1. (四)CXF处理JavaBean以及复合类型

    前面讲的是处理简单类型,今天这里来讲下CXF处理JavaBean以及复合类型,比如集合: 这里实例是客户端传一个JavaBean,服务器端返回集合类型: 在原来的项目实例基础上,我们先创建一个实体类U ...

  2. 《剑指offer》-连续子数组的最大和

    题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...

  3. Javascript中的反射机制(五)

    一: 什么是反射机制 反射机制指的是程序在运行时能够获取自身的信息.例如一个对象能够在运行时知道自己有哪些方法和属性. 二: 在JavaScript中利用for(…in…)语句实现反射 在JavaSc ...

  4. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...

  5. bzoj4184

    题解: 按时间分治线段树 然后线性基维护一下就好了 尝试了一下循环展开并没有什么效果 代码: #include <bits/stdc++.h> using namespace std; ; ...

  6. 「2017 山东一轮集训 Day7」逆序对

    题解: 满满的套路题.. 首先显然从大到小枚举 然后每次生成的逆序对是1----(i-1)的 这样做dp是nk的 复杂度太高了 那我们转化一下问题 变成sigma(ai   (ai<i)  )= ...

  7. P3763 [TJOI2017]DNA

    链接:https://www.luogu.org/problemnew/show/P3763 题解: 挺水的一题后缀数组 枚举每一个开头用后缀数组判断能否在3次内匹配完

  8. zstu-4243 牛吃草

    贴一发两圆相交面积模板 #include<bits/stdc++.h> #define pi acos(-1.0) using namespace std; ; double _abs(d ...

  9. js手机端和pc端加载不同的样式

    function loadCSS() {     if((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android| ...

  10. BZOJ1901 Zju2112 Dynamic Rankings 主席树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1901 题意概括 给你一段序列(n个数),让你支持一些操作(共m次), 有两种操作,一种是询问区间第 ...