www.gusucode.com > 压缩感知的几种重构算法比较的源代码 > 压缩感知的几种重构算法比较的源代码/MMA14/cosamp2.m
function [Sest,d]=cosamp2(Phi,u,utrue,K) % Cosamp algorithm % Input % K : sparsity of Sest % Phi : measurement matrix % u: measured vector % tol1 : tolerance for approximation between successive solutions. % Output % Sest: Solution found by the algorithm % d : success index (d=1 is success, d = 0 is no convergence) % % Algorithm as described in "CoSaMP: Iterative signal recovery from % incomplete and inaccurate samples" by Deanna Needell and Joel Tropp. % % This implementation was written by David Mary % % This script/program is released under the Commons Creative Licence % with Attribution Non-commercial Share Alike (by-nc-sa) % http://creativecommons.org/licenses/by-nc-sa/3.0/ % Short Disclaimer: this script is for educational purpose only. % Longer Disclaimer see http://igorcarron.googlepages.com/disclaimer % Initialization Sest=zeros(size(utrue));%不明白不知道utrue是什么 v=u; t=1; T2=[]; while t < 101 [k,z]=sort(abs(Phi'*v));k=flipud(k);z=flipud(z);% Omega=z(1:2*K);%取了前2K个。 T=sort(union(Omega,T2));phit=Phi(:,T);%T为支撑集合并后的集合,PHIT为观察矩阵phi只取下标为T的列后所组成的矩阵 %keyboard b=abs(pinv(phit)*u);%通过最小二乘法进行信号估计,pinv表示伪逆 [k3,z3]=sort((b));k3=flipud(k3);z3=flipud(z3);%把得到的信号的新的估计值进行从大到小的排序 Sest=zeros(size(utrue)); Sest(T(z3(1:K)))=abs(b(z3(1:K))); %信号估计后进行删减,只取了前K个,并取绝对值后赋给sest,sest此时为信号估计 [k2,z2]=sort(abs(Sest));k2=flipud(k2);z2=flipud(z2); T2=z2(1:K);%T2为信号估计值的最大K个下标集合。 v=u-Phi*Sest;%残差进行更新 d=0;n2=norm(abs(Sest-utrue),'inf'); if n2 <1e-3 d=1;t=1e10; disp('CoSaMP: success'); end t=t+1; end if d==0 disp('CoSaMP: failed') end