⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 greed_pcgp.m

📁 Sparse Estimation Algorithms by Blumensath and Davies min ||x||_0 subject to ||y - Ax||_2<e
💻 M
📖 第 1 页 / 共 2 页
字号:
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 + -