📄 greed_pcgp.m
字号:
else IN = []; Residual = x; s = s_initial; sigsize = x'*x/n; oldERR = sigsize;end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Random Check to see if dictionary is normalised %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% mask=zeros(m,1); mask(ceil(rand*m))=1; nP=norm(P(mask)); if abs(1-nP)>1e-3; display('Dictionary appears not to have unit norm columns.') end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Main algorithm%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%if verbose display('Main iterations...') endtict=0;p=zeros(m,1);DR=Pt(Residual);[v I]=max(abs(DR));IN=[IN I];pDDp=1;done = 0;iter=1;selectnew=1;while ~done % Select new element if isa(GradSteps,'char') if strcmp(GradSteps,'auto') %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Iteration to automatic selection of the number of gradient steps%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% finished=0; while ~finished % Inner products p(IN)=DR(IN); % Update direction if iter==1 p(IN)=1; else if selectnew b=0; else b=-Dp'*P(DR)/pDDp; end p(IN)=DR(IN) +b*p(IN); end % Step size Dp=P(p); pDDp=Dp'*Dp; a=Residual'*Dp/(pDDp); % Update coefficients s=s+a*p; % New Residual and inner products Residual=Residual-a*Dp; DR=Pt(Residual); % select new element [v I]=max(abs(DR)); % Only if we select new element do we leave the loop if isempty(find (IN==I)) IN=[IN I]; finished=1; selectnew=1; else selectnew=0; end end else %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Is option known?%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% error('Undefined option for GradSteps, use ''auto'' or an integer.') end elseif isa(GradSteps,'numeric') %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Iteration for fixed number of gradient steps%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do GradSteps gradient steps count=1; while count<=GradSteps % Inner products p(IN)=DR(IN); % Update direction if iter==1 p(IN)=1; else if count ==1 b=0; else b=-Dp'*P(DR)/pDDp; end p(IN)=DR(IN) +b*p(IN); end % Step size Dp=P(p); pDDp=Dp'*Dp; a=Residual'*Dp/(pDDp); % Update coefficients s=s+a*p; % New Residual and inner products Residual=Residual-a*Dp; DR=Pt(Residual); count=count+1; end % select new element [v I]=max(abs(DR)); IN=[IN I]; else error('Undefined option for GradSteps, use ''auto'' or an integer.') end ERR=Residual'*Residual/n; if comp_err err_mse(iter)=ERR; end if comp_time iter_time(iter)=toc; end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Are we done yet?%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if strcmp(STOPCRIT,'M') if iter >= STOPTOL done =1; elseif verbose && toc-t>10 display(sprintf('Iteration %i. --- %i iterations to go',iter ,STOPTOL-iter)) t=toc; end elseif strcmp(STOPCRIT,'mse') if comp_err if err_mse(iter)<STOPTOL; done = 1; elseif verbose && toc-t>10 display(sprintf('Iteration %i. --- %i mse',iter ,err_mse(iter))) t=toc; end else if ERR<STOPTOL; done = 1; elseif verbose && toc-t>10 display(sprintf('Iteration %i. --- %i mse',iter ,ERR)) t=toc; end end elseif strcmp(STOPCRIT,'mse_change') && iter >=2 if comp_err && iter >=2 if ((err_mse(iter-1)-err_mse(iter))/sigsize <STOPTOL); done = 1; elseif verbose && toc-t>10 display(sprintf('Iteration %i. --- %i mse change',iter ,(err_mse(iter-1)-err_mse(iter))/sigsize )) t=toc; end else if ((oldERR - ERR)/sigsize < STOPTOL); done = 1; elseif verbose && toc-t>10 display(sprintf('Iteration %i. --- %i mse change',iter ,(oldERR - ERR)/sigsize)) t=toc; end end elseif strcmp(STOPCRIT,'corr') if max(abs(DR)) < STOPTOL; done = 1; elseif verbose && toc-t>10 display(sprintf('Iteration %i. --- %i corr',iter ,max(abs(DR)))) t=toc; end end % Also stop if residual gets too small or maxIter reached if comp_err if err_mse(iter)<1e-16 display('Stopping. Exact signal representation found!') done=1; end else if iter>1 if ERR<1e-16 display('Stopping. Exact signal representation found!') done=1; end end end if iter >= MAXITER display('Stopping. Maximum number of iterations reached!') done = 1; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% If not done, take another round%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if ~done iter=iter+1; oldERR=ERR; endend%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Only return as many elements as iterations%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%if nargout >=2 err_mse = err_mse(1:iter);endif nargout ==3 iter_time = iter_time(1:iter);endif verbose display('Done') end% Change history%% 8 of Februray: Algo does no longer stop if dictionary is not normaliesd.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -