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

📄 .15636-199118767-6.m

📁 Sparse Estimation Algorithms by Blumensath and Davies min ||x||_0 subject to ||y - Ax||_2<e
💻 M
字号:
function [s, err_mse, iter_time]=greed_ols(x,A,m,varargin)% greed_ols: Orthogonal Least Squares algorithm%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Usage%   [s, err_mse, iter_time]=greed_ols(x,P,m,'option_name','option_value');%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Input%   Mandatory:%               x   Observation vector to be decomposed%               P   Either:%                       1) An nxm matrix (n must be dimension of x)%                       2) A function handle (type "help function_format" %                          for more information)%                          Also requires specification of P_trans option.%                       3) An object handle (type "help object_format" for %                          more information)%                       NOTE: The algorithm works on matrices, so P will be%                       converted to matrix. This means that the algorithm%                       only works for small problems.%               m   length of s %%   Possible additional options:%   (specify as many as you want using 'option_name','option_value' pairs)%   See below for explanation of options:%__________________________________________________________________________%   option_name    |     available option_values                | default%--------------------------------------------------------------------------%   stopCrit       | M, corr, mse, mse_change                   | M%   stopTol        | number (see below)                         | n/4%   maxIter        | positive integer (see below)               | n%   verbose        | true, false                                | false%   start_val      | vector of length m                         | zeros%%   Available stopping criteria :%               M           -   Extracts exactly M = stopTol elements.%               corr        -   Stops when maximum correlation between%                               residual and atoms is below stopTol value.%               mse         -   Stops when mean squared error of residual %                               is below stopTol value.%               mse_change  -   Stops when the change in the mean squared %                               error falls below stopTol value.%%   stopTol: Value for stooping criterion.%%   P_trans: If P is a function handle, then P_trans has to be specified and %            must be a function handle. %%   maxIter: Maximum of allowed iterations.%%   verbose: Logical value to allow algorithm progress to be displayed.%%   start_val: Allows algorithms to start from partial solution.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Outputs%    s              Solution vector %    err_mse        Vector containing mse of approximation error for each %                   iteration%    iter_time      Vector containing times for each iteration%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Description%   greed_ols performs a greedy signal decomposition. %   In each iteration a new element is selected that will reduce the %   residual error the most in the next step. This is different from OMP.%   See [1] and [2] for details.%   The non-zero elements of s are approximated by orthogonally projecting %   x onto the selected elements in each iteration.%   The algorithm uses QR factorisation.%   % References%   [1] Chen, S. and Billings, S. A. (1989) Modelling and analysis of non-linear time series. %	International Journal of Control 50 pp. 2151-2171%   [2] T. Blumensath, M. E. Davies; "On the Difference Between Orthogonal Matching Pursuit and %       Orthogonal Least Squares", manuscript 2007% See Also%   greed_omp, greed_mp, greed_gp, greed_nomp%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                    Default values and initialisation%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[n1 n2]=size(x);if n2 == 1    n=n1;elseif n1 == 1    x=x';    n=n2;else   error('x must be a vector.');end    sigsize     = x'*x/n;initial_given=0;  err_mse     = [];iter_time   = [];STOPCRIT    = 'M';STOPTOL     = ceil(n/4);MAXITER     = n;verbose     = false;s_initial   = zeros(m,1);if verbose   display('Initialising...') end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                           Output variables%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%switch nargout     case 3        comp_err=true;        comp_time=true;    case 2         comp_err=true;        comp_time=false;    case 1        comp_err=false;        comp_time=false;    case 0        error('Please assign output variable.')            otherwise        error('Too many output arguments specified')end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                       Look through options%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Put option into nice formatOptions={};OS=nargin-3;c=1;for i=1:OS    if isa(varargin{i},'cell')        CellSize=length(varargin{i});        ThisCell=varargin{i};        for j=1:CellSize            Options{c}=ThisCell{j};            c=c+1;        end    else        Options{c}=varargin{i};        c=c+1;    endendOS=length(Options);if rem(OS,2)   error('Something is wrong with argument name and argument value pairs.') endfor i=1:2:OS   switch Options{i}        case {'stopCrit'}            if (strmatch(Options{i+1},{'M'; 'corr'; 'mse'; 'mse_change'},'exact'));                STOPCRIT    = Options{i+1};              else error('stopCrit must be char string [M, corr, mse, mse_change]. Exiting.'); end         case {'stopTol'}            if isa(Options{i+1},'numeric') ; STOPTOL     = Options{i+1};               else error('stopTol must be number. Exiting.'); end        case {'maxIter'}            if isa(Options{i+1},'numeric'); MAXITER     = Options{i+1};                         else error('maxIter must be a number. Exiting.'); end        case {'verbose'}            if isa(Options{i+1},'logical'); verbose     = Options{i+1};               else error('verbose must be a logical. Exiting.'); end         case {'start_val'}            if isa(Options{i+1},'numeric') & length(Options{i+1}) == m ;                s_initial     = Options{i+1};                  initial_given=1;            else error('start_val must be a vector of length m. Exiting.'); end         otherwise            error('Unrecognised option. Exiting.')    endendif strcmp(STOPCRIT,'M')     maxM=STOPTOL;else    maxM=MAXITER;endif nargout >=2    err_mse = zeros(maxM,1);endif nargout ==3    iter_time = zeros(maxM,1);end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                        Make P a matrix%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%if isa(A,'float')    P = A;elseif      isobject(A)    try P=zeros(n,m);    catch error('Problem size too large for this algorithm.')    end    for i=1:m        mask=zeros(m);        mask(i)=1;        P(:,i) = A*mask;        P(:,i) = P(:,i) / norm(P(:,i));    endelseif isa(A,'function_handle')    try P=zeros(n,m);    catch error('Problem size too large for this algorithm.')    end    for i=1:m        mask=zeros(m);        mask(i)=1;        P(:,i) = A*mask;        P(:,i) = P(:,i) / norm(P(:,i));    endelse    error('P is of unsupported type. Use matrix, function handle or object. Exiting.') end% Make a copy of AA=P;try R=zeros(m);catch error('Problem size too large for this algorithm.')end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                        Do we start from zero or not?%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%if initial_given == 1;    in=find(s_initial);    IN=[];    NI=1:m;    z=[];    for i=length(in):-1:1 %Go backwards so that we can take of elements in NI from the rear.            INI=in(i);            IN=[IN INI];            NI(INI)=[];            R(INI,INI)= norm(A(:,INI));            A(:,INI)=A(:,INI)/R(INI,INI);            for k=1:length(NI)                 R(INI,NI(k))  =  A(:,INI)'* A(:,NI(k));                 A(:,NI(k)) = A(:,NI(k)) - R(INI,NI(k)) * A(:,INI);            end            % New coefficient in Q domain            zn=A(:,INI)'*x;            z=[z ; zn];        end        Residual    = x-A(:,IN)*z;        oldERR      = Residual'*Residual/n;        s           = s_initial;else    IN=[];    NI=1:m;    Residual=x;    z=[];    oldERR      = sigsize;    s           = s_initial;end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                        Main algorithm%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%if verbose   display('Main iterations...') endtict=0;DR=A'*Residual;done = 0;iter=1;while ~done    % select new element     normA=(sum(A.^2,1)).^0.5;     [v I]=max(abs(DR(NI))./normA(NI)');     INI=NI(I);     IN=[IN INI];     NI(I)=[];        % Update QR factorisation and non-selected elements    % We here overwrite those columns of A in IN with the matrix Q and    % overwrite the other columns so that they are orthogonal to the    % elements in Q.        % One step of QR     R(INI,INI)= norm(A(:,INI));     A(:,INI)=A(:,INI)/R(INI,INI);          for k=1:length(NI)         R(INI,NI(k))  =  A(:,INI)'* A(:,NI(k));         A(:,NI(k)) = A(:,NI(k)) - R(INI,NI(k)) * A(:,INI);     end          % New coefficient in Q domain     zn=A(:,INI)'*x;     z=[z ; zn];         % New Residual and inner products     Residual=Residual-zn*A(:,INI);     DR=A'*Residual;          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 oldERR<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%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%            Now we can solve for s by back-substitution%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% s(IN)=R(IN,IN)\z; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                  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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -