📄 group_pcgp.m
字号:
if verbose display('Main iterations...') endc = max(group);for j = 1:c g{j} = find(group == j);endtict=0;p=zeros(m,1);DR=Pt(Residual);for j = 1:c lg(j) = mean(abs(DR(g{j})));end[v L]=sort(lg,'descend');I = g{L(1)};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 for j = 1:c lg(j) = mean(abs(DR(g{j}))); end [v L]=sort(lg,'descend'); I = g{L(1)}; IN = union(IN,I); if strcmp(STOPCRIT,'M') & length(IN) >= STOPTOL IN=IN(1:STOPTOL); end % Only if we select new element do we leave the loop % if isempty(intersect(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 for j = 1:c lg(j) = mean(abs(DR(g{j}))); end [v L]=sort(lg,'descend'); I = g{L(1)}; 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 + -