主要内容:

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

一、OMP的算法流程

二、OMP的MATLAB实现(CS_OMP.m)

function [ theta ] = CS_OMP( y,A,iter )
% CS_OMP
% y = Phi * x
% x = Psi * theta
% y = Phi * Psi * theta
% 令 A = Phi*Psi, 则y=A*theta
% 现在已知y和A,求theta
% iter = 迭代次数
[m,n] = size(y);
if m<n
y = y'; %y should be a column vector
end
[M,N] = size(A); %传感矩阵A为M*N矩阵
theta = zeros(N,); %用来存储恢复的theta(列向量)
At = zeros(M,iter); %用来迭代过程中存储A被选择的列
pos_num = zeros(,iter); %用来迭代过程中存储A被选择的列序号
res = y; %初始化残差(residual)为y
for ii=:iter %迭代t次,t为输入参数
product = A'*res; %传感矩阵A各列与残差的内积
[val,pos] = max(abs(product)); %找到最大内积绝对值,即与残差最相关的列
At(:,ii) = A(:,pos); %存储这一列
pos_num(ii) = pos; %存储这一列的序号
A(:,pos) = zeros(M,); %清零A的这一列,其实此行可以不要,因为它与残差正交
% y=At(:,:ii)*theta,以下求theta的最小二乘解(Least Square)
theta_ls = (At(:,:ii)'*At(:,1:ii))^(-1)*At(:,1:ii)'*y;%最小二乘解
% At(:,:ii)*theta_ls是y在At(:,:ii)列空间上的正交投影
res = y - At(:,:ii)*theta_ls; %更新残差
end
theta(pos_num)=theta_ls;% 恢复出的theta
end

三、一维信号的实验与结果(CS_Reconstuction_Test.m

%压缩感知重构算法OMP测试
%以一维信号为例
clear all;close all;clc;
M = ;%观测值个数
N = ;%信号x的长度
K = ;%信号x的稀疏度
Index_K = randperm(N);
x = zeros(N,);
x(Index_K(:K)) = *randn(K,);%x为K稀疏的,且位置是随机的
Psi = eye(N);%x本身是稀疏的,定义稀疏矩阵为单位阵,x=Psi*theta
Phi = randn(M,N);%测量矩阵为高斯矩阵
A = Phi * Psi;%传感矩阵
y = Phi * x;%得到观测向量y
%% 恢复重构信号x
tic
theta = CS_OMP(y,A,K);
x_r = Psi * theta;% x=Psi * theta
toc
%% 绘图
figure;
plot(x_r,'k.-');%绘出x的恢复信号
hold on;
plot(x,'r');%绘出原信号x
hold off;
legend('Recovery','Original')
fprintf('\n恢复残差:');
norm(x_r-x)%恢复残差

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

%   压缩感知重构算法测试CS_Reconstuction_MtoPercentage.m
% 绘制参考文献中的Fig.
% 参考文献:Joel A. Tropp and Anna C. Gilbert
% Signal Recovery From Random Measurements Via Orthogonal Matching
% Pursuit,IEEE TRANSACTIONS ON INFORMATION THEORY, VOL. , NO. ,
% DECEMBER . clear all;close all;clc; %% 参数配置初始化
CNT = ; %对于每组(K,M,N),重复迭代次数
N = ; %信号x的长度
Psi = eye(N); %x本身是稀疏的,定义稀疏矩阵为单位阵x=Psi*theta
K_set = [,,,,]; %信号x的稀疏度集合
Percentage = zeros(length(K_set),N); %存储恢复成功概率 %% 主循环,遍历每组(K,M,N)
tic
for kk = :length(K_set)
K = K_set(kk); %本次稀疏度
M_set = K::N; %M没必要全部遍历,每隔5测试一个就可以了
PercentageK = zeros(,length(M_set)); %存储此稀疏度K下不同M的恢复成功概率
for mm = :length(M_set)
M = M_set(mm); %本次观测值个数
P = ;
for cnt = :CNT %每个观测值个数均运行CNT次
Index_K = randperm(N);
x = zeros(N,);
x(Index_K(:K)) = *randn(K,); %x为K稀疏的,且位置是随机的
Phi = randn(M,N); %测量矩阵为高斯矩阵
A = Phi * Psi; %传感矩阵
y = Phi * x; %得到观测向量y
theta = CS_OMP(y,A,K); %恢复重构信号theta
x_r = Psi * theta; % x=Psi * theta
if norm(x_r-x)<1e- %如果残差小于1e-6则认为恢复成功
P = P + ;
end
end
PercentageK(mm) = P/CNT*; %计算恢复概率
end
Percentage(kk,:length(M_set)) = PercentageK;
end
toc
save MtoPercentage1000 %运行一次不容易,把变量全部存储下来 %% 绘图
S = ['-ks';'-ko';'-kd';'-kv';'-k*'];
figure;
for kk = :length(K_set)
K = K_set(kk);
M_set = K::N;
L_Mset = length(M_set);
plot(M_set,Percentage(kk,:L_Mset),S(kk,:));%绘出x的恢复信号
hold on;
end
hold off;
xlim([ ]);
legend('K=4','K=12','K=20','K=28','K=36');
xlabel('Number of measurements(M)');
ylabel('Percentage recovered');
title('Percentage of input signals recovered correctly(N=256)(Gaussian)');

五、稀疏度K与重构成功概率关系的实验与结果(CS_Reconstuction_KtoPercentage.m)

%   压缩感知重构算法测试CS_Reconstuction_KtoPercentage.m
% 绘制参考文献中的Fig.
% 参考文献:Joel A. Tropp and Anna C. Gilbert
% Signal Recovery From Random Measurements Via Orthogonal Matching
% Pursuit,IEEE TRANSACTIONS ON INFORMATION THEORY, VOL. , NO. ,
% DECEMBER .
%
clear all;close all;clc; %% 参数配置初始化
CNT = ; %对于每组(K,M,N),重复迭代次数
N = ; %信号x的长度
Psi = eye(N); %x本身是稀疏的,定义稀疏矩阵为单位阵x=Psi*theta
M_set = [,,,,]; %测量值集合
Percentage = zeros(length(M_set),N); %存储恢复成功概率 %% 主循环,遍历每组(K,M,N)
tic
for mm = :length(M_set)
M = M_set(mm); %本次测量值个数
K_set = ::ceil(M/); %信号x的稀疏度K没必要全部遍历,每隔5测试一个就可以了
PercentageM = zeros(,length(K_set)); %存储此测量值M下不同K的恢复成功概率
for kk = :length(K_set)
K = K_set(kk); %本次信号x的稀疏度K
P = ;
for cnt = :CNT %每个观测值个数均运行CNT次
Index_K = randperm(N);
x = zeros(N,);
x(Index_K(:K)) = *randn(K,); %x为K稀疏的,且位置是随机的
Phi = randn(M,N); %测量矩阵为高斯矩阵
A = Phi * Psi; %传感矩阵
y = Phi * x; %得到观测向量y
theta = CS_OMP(y,A,K); %恢复重构信号theta
x_r = Psi * theta; % x=Psi * theta
if norm(x_r-x)<1e- %如果残差小于1e-6则认为恢复成功
P = P + ;
end
end
PercentageM(kk) = P/CNT*; %计算恢复概率
end
Percentage(mm,:length(K_set)) = PercentageM;
end
toc
save KtoPercentage1000test %运行一次不容易,把变量全部存储下来 %% 绘图
S = ['-ks';'-ko';'-kd';'-kv';'-k*'];
figure;
for mm = :length(M_set)
M = M_set(mm);
K_set = ::ceil(M/);
L_Kset = length(K_set);
plot(K_set,Percentage(mm,:L_Kset),S(mm,:));%绘出x的恢复信号
hold on;
end
hold off;
xlim([ ]);
legend('M=52','M=100','M=148','M=196','M=244');
xlabel('Sparsity level(K)');
ylabel('Percentage recovered');
title('Percentage of input signals recovered correctly(N=256)(Gaussian)');

六、参考文章

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

更多OMP请参考:浅谈压缩感知(九):正交匹配追踪算法OMP

浅谈压缩感知(二十一):压缩感知重构算法之正交匹配追踪(OMP)的更多相关文章

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

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

  2. 浅谈压缩感知(二十六):压缩感知重构算法之分段弱正交匹配追踪(SWOMP)

    主要内容: SWOMP的算法流程 SWOMP的MATLAB实现 一维信号的实验与结果 门限参数a.测量数M与重构成功概率关系的实验与结果 SWOMP与StOMP性能比较 一.SWOMP的算法流程 分段 ...

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

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

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

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

  5. 浅谈压缩感知(九):正交匹配追踪算法OMP

    主要内容: OMP算法介绍 OMP的MATLAB实现 OMP中的数学知识 一.OMP算法介绍 来源:http://blog.csdn.net/scucj/article/details/7467955 ...

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

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

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

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

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

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

  9. 浅谈Excel开发:十一 针对64位Excel的插件的开发和部署

    自Office 2010版本开始有了32位和64位之分,对Excel来说,32位的Excel和64位的Excel在性能上的主要区别是64位的Excel能够处理2G及2G以上的大数据集. 随着64位操作 ...

随机推荐

  1. 《剑指offer》-判断平衡二叉树

    题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 考察平衡树的概念和递归的使用.平衡树是指,树中的每个节点的左右子树的高度差小于等于1. class Solution { public: bo ...

  2. POJ 3190 Stall Reservations【贪心】

    POJ 3190 题意: 一些奶牛要在指定的时间内挤牛奶,而一个机器只能同时对一个奶牛工作.给你每头奶牛的指定时间的区间(闭区间),问你最小需要多少机器.思路:先按奶牛要求的时间起始点进行从小到大排序 ...

  3. asp.net core服务的生命周期

    Transient:每一次GetService都会创建一个新的实例 Scoped:在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http requ ...

  4. ACM题目中的时间限制与内存限制 复杂度的估计

    运行时限为1s,这很常见,对于该时限,我们设计的算法复杂度不能超过百万级别,即不要超过一千万.假如你的算法时间复杂度为O(n^2),则n不应该大于3000 空间限制是32MB,即你程序中申请的内存不能 ...

  5. 什么是AOP?

    AOP(Aspect-Oriented Programming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入封装.继承和 ...

  6. ARIMA模型---时间序列分析---温度预测

    (图片来自百度) 数据 分析数据第一步还是套路------画图 数据看上去比较平整,但是由于数据太对看不出具体情况,于是将只取前300个数据再此画图 这数据看上去很不错,感觉有隐藏周期的意思 代码 # ...

  7. setting.xml配置文件

    在此,简单的说下.  setting.xml 和 pom.xml这两各配置文件,到此是怎样? setting.xml setting.xml,这个配文件,是全局的. 比如你的是构建,web项目.我的是 ...

  8. (数据分析)第02章 Python语法基础,IPython和Jupyter Notebooks.md

    第2章 Python语法基础,IPython和Jupyter Notebooks 当我在2011年和2012年写作本书的第一版时,可用的学习Python数据分析的资源很少.这部分上是一个鸡和蛋的问题: ...

  9. SQLite中的SELECT子句使用别名

    SQLite中的SELECT子句使用别名 开发者可以使用AS关键字为指定的列名提供一个新的别名,其语法形式如下 SELECT column_name AS Alias [,…] 例如,下面的SQL语句 ...

  10. django-访问控制

    django自带的用户认证系统提供了访问控制的的功能.   1.只允许登录的用户登录   django的用户可分为两类,一是可认证的用户,也就是在django.contrib.auth.models. ...