---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
最后,附上我用MATLAB编写的OMP算法和IRLS算法代码:
function[xx,SS,rr] = OMP(A,b,res)
% Initialization
s=size(A);
xk=zeros(s(2),1);
rk=b;
k=0;
S=[];
% Main Iteration
while norm(rk)>res
% Sweep
z=zeros(s(2),1);
e=zeros(s(2),1);
for j= 1:s(2)
z(j)=A(:,j)'*rk./(A(:,j)'*A(:,j));
e(j)=norm(A(:,j).*z(j)-rk).^2;
end
% Update Support
[m,j0]=min(e);
S=[S,j0];
%Update Provisional Solution
As=A(:,S);
xk(S)=inv(As'*As)*As'*b;
%Update Residual
rk=b-A*xk;
k=k+1;
end
xx=xk;
SS=S;
rr=norm(rk);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[xx,SS,rr] = IRLS(A,b,p,res)
s=size(A);
% Initialization
xk=ones(s(2),1);
xk_former=zeros(s(2),1);
Xk=eye(s(2));
% Main Interation
while norm(xk-xk_former)>res
% Solve
xk_former=xk;
xk=Xk^2*A'*pinv(A*Xk^2*A')*b;
%Weight Update
Xk=diag(abs(xk.^(1-p/2)));
end
xk(find(abs(xk)<1e-6))=0;
xx=xk;
SS=find(xx~=0);
rr=norm(b-A*xx);