📄 group_pcgp.m
字号:
function [s, err_mse, iter_time]=group_pcgp(x,A,group,varargin)% group_pcgp: Group Partial Conjugate Gradient Pursuit algorithm % (modification from [1])%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Usage% [s, err_mse, iter_time]=group_pcgp(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)% 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% P_trans | function_handle (see below) | % maxIter | positive integer (see below) | n% verbose | true, false | false% start_val | vector of length m | zeros% GradSteps | 'auto' or integer | 'auto'%% 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 stopping criterion.%% P_trans: If P is a function handle, then P_trans has to be specified and % must be a function handle. %% maxIter: Maximum number of allowed iterations.%% verbose: Logical value to allow algorithm progress to be displayed.%% start_val: Allows algorithms to start from partial solution.%% GradSteps: Number of gradient optimisation steps per iteration.% 'auto' uses inner products to decide if more gradient steps % are required. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Outputs% s Solution vector % err_mse Vector containing mse of approximation error for each % iteration% iter_time Vector containing computation times for each iteration%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % References% [1] T. Blumensath and M.E. Davies, "Gradient Pursuits", submitted, 2007%% Original code by Thomas Blumensath 2007% Modified for Group Sparsity by Angshul Majumdar 2009%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Default values and initialisation%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%m = size(A,2);c = max(group);[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 = c;verbose = false;s_initial = zeros(m,1);GradSteps = 'auto';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 {'P_trans'} if isa(Options{i+1},'function_handle'); Pt = Options{i+1}; else error('P_trans must be function _handle. 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 case {'GradSteps'} if isa(Options{i+1},'numeric') || strcmp(Options{i+1},'auto') ; GradSteps = Options{i+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 and Pt functions%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%if isa(A,'float') P =@(z) A*z; Pt =@(z) A'*z;elseif isobject(A) P =@(z) A*z; Pt =@(z) A'*z;elseif isa(A,'function_handle') try if isa(Pt,'function_handle'); P=A; else error('If P is a function handle, Pt also needs to be a function handle. Exiting.'); end catch error('If P is a function handle, Pt needs to be specified. Exiting.'); endelse error('P is of unsupported type. Use matrix, function_handle or object. Exiting.'); end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Do we start from zero or not?%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%if initial_given ==1; IN = find(s_initial); Residual = x-P(s_initial); s = s_initial; oldERR = Residual'*Residual/n;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%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -