function [recover_spectrum,l,theta_j,r]=DCS_SOMP(y,A)
%%%%%%initialize%%%%%%%%%
k=0.05;
omiga=[];
theta_j=[];
for j=1:5
r(:,j)=y(j,:)';
end
gama=zeros(length(y(1,:)),length(y(1,:)));
%%%%%%%%%select%%%%%%%%%%
l=1;
while ((sqrt(sum((r(:,1).^2)))>k*sqrt(sum((y(1,:).^2))))||(sqrt(sum((r(:,2).^2)))>k*sqrt(sum((y(2,:).^2))))||(sqrt(sum((r(:,3).^2)))>k*sqrt(sum((y(3,:).^2))))||(sqrt(sum((r(:,4).^2)))>k*sqrt(sum((y(4,:).^2))))||(sqrt(sum((r(:,5).^2)))>k*sqrt(sum((y(5,:).^2)))))
sum_arg=zeros(1,length(y(1,:)));
for n=1:length(y(1,:))
sum_result=0;
for j=1:5
sum_result=sum_result+(abs(dot(r(:,j),(A(:,n))))/sqrt(sum((A(:,n).^2))));
end
sum_arg(n)=sum_result;
end
[max_num,max_index]=max(sum_arg);
nl=max_index
omiga=union(omiga,nl);
theta_j=[theta_j,A(:,nl)];
%%%%%%%%%%%%orhtogonalize%%%%%%%
sum_t=zeros(size(gama(:,1)));
for t=1:l-1
sum_t=sum_t+dot(A(:,nl),gama(:,t)/sqrt(sum(gama(:,t).^2)))*gama(:,t);
end
gama(:,l)=theta_j(:,l)-sum_t;
%%%%%%%%%%%iterate%%%%%%%%%%%%%%%
for j=1:5
betaj(j,l)=dot(r(:,j),gama(:,l))/sqrt(sum(gama(:,l).^2));
r(:,j)=r(:,j)-dot(r(:,j),gama(:,l))/sqrt(sum(gama(:,l).^2))*gama(:,l);
end
l=l+1
if l>1024
break
end
end
%%%%%%%%%%%%%De-orthogonalize%%%%%
[gama_j,R_j]=qr(theta_j);
theta_j_omega=pinv(R_j)'*betaj(j,:)';
recover_spectrum=theta_j_omega;
- 1
- 2
- 3
前往页