annotate matlab/OMP/greed_omp_qr.m @ 26:f0f77d92e0c1

(none)
author nikcleju
date Wed, 09 Nov 2011 11:11:39 +0000
parents 735a0e24575c
children
rev   line source
nikcleju@2 1 function [s, err_mse, iter_time]=greed_omp_qr(x,A,m,varargin)
nikcleju@2 2 % greed_omp_qr: Orthogonal Matching Pursuit algorithm based on QR
nikcleju@2 3 % factorisation
nikcleju@2 4 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 5 % Usage
nikcleju@2 6 % [s, err_mse, iter_time]=greed_omp_qr(x,P,m,'option_name','option_value')
nikcleju@2 7 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 8 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 9 % Input
nikcleju@2 10 % Mandatory:
nikcleju@2 11 % x Observation vector to be decomposed
nikcleju@2 12 % P Either:
nikcleju@2 13 % 1) An nxm matrix (n must be dimension of x)
nikcleju@2 14 % 2) A function handle (type "help function_format"
nikcleju@2 15 % for more information)
nikcleju@2 16 % Also requires specification of P_trans option.
nikcleju@2 17 % 3) An object handle (type "help object_format" for
nikcleju@2 18 % more information)
nikcleju@2 19 % m length of s
nikcleju@2 20 %
nikcleju@2 21 % Possible additional options:
nikcleju@2 22 % (specify as many as you want using 'option_name','option_value' pairs)
nikcleju@2 23 % See below for explanation of options:
nikcleju@2 24 %__________________________________________________________________________
nikcleju@2 25 % option_name | available option_values | default
nikcleju@2 26 %--------------------------------------------------------------------------
nikcleju@2 27 % stopCrit | M, corr, mse, mse_change | M
nikcleju@2 28 % stopTol | number (see below) | n/4
nikcleju@2 29 % P_trans | function_handle (see below) |
nikcleju@2 30 % maxIter | positive integer (see below) | n
nikcleju@2 31 % verbose | true, false | false
nikcleju@2 32 % start_val | vector of length m | zeros
nikcleju@2 33 %
nikcleju@2 34 % Available stopping criteria :
nikcleju@2 35 % M - Extracts exactly M = stopTol elements.
nikcleju@2 36 % corr - Stops when maximum correlation between
nikcleju@2 37 % residual and atoms is below stopTol value.
nikcleju@2 38 % mse - Stops when mean squared error of residual
nikcleju@2 39 % is below stopTol value.
nikcleju@2 40 % mse_change - Stops when the change in the mean squared
nikcleju@2 41 % error falls below stopTol value.
nikcleju@2 42 %
nikcleju@2 43 % stopTol: Value for stopping criterion.
nikcleju@2 44 %
nikcleju@2 45 % P_trans: If P is a function handle, then P_trans has to be specified and
nikcleju@2 46 % must be a function handle.
nikcleju@2 47 %
nikcleju@2 48 % maxIter: Maximum number of allowed iterations.
nikcleju@2 49 %
nikcleju@2 50 % verbose: Logical value to allow algorithm progress to be displayed.
nikcleju@2 51 %
nikcleju@2 52 % start_val: Allows algorithms to start from partial solution.
nikcleju@2 53 %
nikcleju@2 54 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 55 % Outputs
nikcleju@2 56 % s Solution vector
nikcleju@2 57 % err_mse Vector containing mse of approximation error for each
nikcleju@2 58 % iteration
nikcleju@2 59 % iter_time Vector containing computation times for each iteration
nikcleju@2 60 %
nikcleju@2 61 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 62 % Description
nikcleju@2 63 % greed_omp_qr performs a greedy signal decomposition.
nikcleju@2 64 % In each iteration a new element is selected depending on the inner
nikcleju@2 65 % product between the current residual and columns in P.
nikcleju@2 66 % The non-zero elements of s are approximated by orthogonally projecting
nikcleju@2 67 % x onto the selected elements in each iteration.
nikcleju@2 68 % The algorithm uses QR decomposition.
nikcleju@2 69 %
nikcleju@2 70 % See Also
nikcleju@2 71 % greed_omp_chol, greed_omp_cg, greed_omp_cgp, greed_omp_pinv,
nikcleju@2 72 % greed_omp_linsolve, greed_gp, greed_nomp
nikcleju@2 73 %
nikcleju@2 74 % Copyright (c) 2007 Thomas Blumensath
nikcleju@2 75 %
nikcleju@2 76 % The University of Edinburgh
nikcleju@2 77 % Email: thomas.blumensath@ed.ac.uk
nikcleju@2 78 % Comments and bug reports welcome
nikcleju@2 79 %
nikcleju@2 80 % This file is part of sparsity Version 0.1
nikcleju@2 81 % Created: April 2007
nikcleju@2 82 %
nikcleju@2 83 % Part of this toolbox was developed with the support of EPSRC Grant
nikcleju@2 84 % D000246/1
nikcleju@2 85 %
nikcleju@2 86 % Please read COPYRIGHT.m for terms and conditions.
nikcleju@2 87
nikcleju@2 88 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 89 % Default values and initialisation
nikcleju@2 90 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 91
nikcleju@2 92
nikcleju@2 93 [n1 n2]=size(x);
nikcleju@2 94 if n2 == 1
nikcleju@2 95 n=n1;
nikcleju@2 96 elseif n1 == 1
nikcleju@2 97 x=x';
nikcleju@2 98 n=n2;
nikcleju@2 99 else
nikcleju@2 100 display('x must be a vector.');
nikcleju@2 101 return
nikcleju@2 102 end
nikcleju@2 103
nikcleju@2 104 sigsize = x'*x/n;
nikcleju@2 105 initial_given=0;
nikcleju@2 106 err_mse = [];
nikcleju@2 107 iter_time = [];
nikcleju@2 108 STOPCRIT = 'M';
nikcleju@2 109 STOPTOL = ceil(n/4);
nikcleju@2 110 MAXITER = n;
nikcleju@2 111 verbose = false;
nikcleju@2 112 s_initial = zeros(m,1);
nikcleju@2 113
nikcleju@2 114
nikcleju@2 115 if verbose
nikcleju@2 116 display('Initialising...')
nikcleju@2 117 end
nikcleju@2 118
nikcleju@2 119 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 120 % Output variables
nikcleju@2 121 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 122
nikcleju@2 123 switch nargout
nikcleju@2 124 case 3
nikcleju@2 125 comp_err=true;
nikcleju@2 126 comp_time=true;
nikcleju@2 127 case 2
nikcleju@2 128 comp_err=true;
nikcleju@2 129 comp_time=false;
nikcleju@2 130 case 1
nikcleju@2 131 comp_err=false;
nikcleju@2 132 comp_time=false;
nikcleju@2 133 case 0
nikcleju@2 134 error('Please assign output variable.')
nikcleju@2 135 otherwise
nikcleju@2 136 error('Too many output arguments specified')
nikcleju@2 137 end
nikcleju@2 138
nikcleju@2 139 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 140 % Look through options
nikcleju@2 141 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 142
nikcleju@2 143 % Put option into nice format
nikcleju@2 144 Options={};
nikcleju@2 145 OS=nargin-3;
nikcleju@2 146 c=1;
nikcleju@2 147 for i=1:OS
nikcleju@2 148 if isa(varargin{i},'cell')
nikcleju@2 149 CellSize=length(varargin{i});
nikcleju@2 150 ThisCell=varargin{i};
nikcleju@2 151 for j=1:CellSize
nikcleju@2 152 Options{c}=ThisCell{j};
nikcleju@2 153 c=c+1;
nikcleju@2 154 end
nikcleju@2 155 else
nikcleju@2 156 Options{c}=varargin{i};
nikcleju@2 157 c=c+1;
nikcleju@2 158 end
nikcleju@2 159 end
nikcleju@2 160 OS=length(Options);
nikcleju@2 161 if rem(OS,2)
nikcleju@2 162 error('Something is wrong with argument name and argument value pairs.')
nikcleju@2 163 end
nikcleju@2 164
nikcleju@2 165 for i=1:2:OS
nikcleju@2 166 switch Options{i}
nikcleju@2 167 case {'stopCrit'}
nikcleju@2 168 if (strmatch(Options{i+1},{'M'; 'corr'; 'mse'; 'mse_change'},'exact'));
nikcleju@2 169 STOPCRIT = Options{i+1};
nikcleju@2 170 else error('stopCrit must be char string [M, corr, mse, mse_change]. Exiting.'); end
nikcleju@2 171 case {'stopTol'}
nikcleju@2 172 if isa(Options{i+1},'numeric') ; STOPTOL = Options{i+1};
nikcleju@2 173 else error('stopTol must be number. Exiting.'); end
nikcleju@2 174 case {'P_trans'}
nikcleju@2 175 if isa(Options{i+1},'function_handle'); Pt = Options{i+1};
nikcleju@2 176 else error('P_trans must be function _handle. Exiting.'); end
nikcleju@2 177 case {'maxIter'}
nikcleju@2 178 if isa(Options{i+1},'numeric'); MAXITER = Options{i+1};
nikcleju@2 179 else error('maxIter must be a number. Exiting.'); end
nikcleju@2 180 case {'verbose'}
nikcleju@2 181 if isa(Options{i+1},'logical'); verbose = Options{i+1};
nikcleju@2 182 else error('verbose must be a logical. Exiting.'); end
nikcleju@2 183 case {'start_val'}
nikcleju@2 184 if isa(Options{i+1},'numeric') & length(Options{i+1}) == m ;
nikcleju@2 185 s_initial = Options{i+1};
nikcleju@2 186 initial_given=1;
nikcleju@2 187 else error('start_val must be a vector of length m. Exiting.'); end
nikcleju@2 188 otherwise
nikcleju@2 189 error('Unrecognised option. Exiting.')
nikcleju@2 190 end
nikcleju@2 191 end
nikcleju@2 192
nikcleju@2 193
nikcleju@2 194
nikcleju@2 195 if strcmp(STOPCRIT,'M')
nikcleju@2 196 maxM=STOPTOL;
nikcleju@2 197 else
nikcleju@2 198 maxM=MAXITER;
nikcleju@2 199 end
nikcleju@2 200
nikcleju@2 201 if nargout >=2
nikcleju@2 202 err_mse = zeros(maxM,1);
nikcleju@2 203 end
nikcleju@2 204 if nargout ==3
nikcleju@2 205 iter_time = zeros(maxM,1);
nikcleju@2 206 end
nikcleju@2 207
nikcleju@2 208
nikcleju@2 209
nikcleju@2 210 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 211 % Make P and Pt functions
nikcleju@2 212 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 213
nikcleju@2 214 if isa(A,'float') P =@(z) A*z; Pt =@(z) A'*z;
nikcleju@2 215 elseif isobject(A) P =@(z) A*z; Pt =@(z) A'*z;
nikcleju@2 216 elseif isa(A,'function_handle')
nikcleju@2 217 try
nikcleju@2 218 if isa(Pt,'function_handle'); P=A;
nikcleju@2 219 else error('If P is a function handle, Pt also needs to be a function handle. Exiting.'); end
nikcleju@2 220 catch error('If P is a function handle, Pt needs to be specified. Exiting.'); end
nikcleju@2 221 else error('P is of unsupported type. Use matrix, function_handle or object. Exiting.'); end
nikcleju@2 222
nikcleju@2 223 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 224 % Random Check to see if dictionary is normalised
nikcleju@2 225 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 226
nikcleju@2 227 % Commented by Nic, 13 Sept 2011
nikcleju@2 228 % Don't want any slow text output
nikcleju@2 229 % mask=zeros(m,1);
nikcleju@2 230 % mask(ceil(rand*m))=1;
nikcleju@2 231 % nP=norm(P(mask));
nikcleju@2 232 % if abs(1-nP)>1e-3;
nikcleju@2 233 % display('Dictionary appears not to have unit norm columns.')
nikcleju@2 234 % end
nikcleju@2 235
nikcleju@2 236 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 237 % Check if we have enough memory and initialise
nikcleju@2 238 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 239
nikcleju@2 240
nikcleju@2 241 try Q=zeros(n,maxM);
nikcleju@2 242 catch error('Variable size is too large. Please try greed_omp_chol algorithm or reduce MAXITER.')
nikcleju@2 243 end
nikcleju@2 244 try R=zeros(maxM);
nikcleju@2 245 catch error('Variable size is too large. Please try greed_omp_chol algorithm or reduce MAXITER.')
nikcleju@2 246 end
nikcleju@2 247
nikcleju@2 248
nikcleju@2 249
nikcleju@2 250
nikcleju@2 251 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 252 % Do we start from zero or not?
nikcleju@2 253 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 254
nikcleju@2 255 if initial_given ==1;
nikcleju@2 256 IN = find(s_initial);
nikcleju@2 257 if ~isempty(IN)
nikcleju@2 258 Residual = x-P(s_initial);
nikcleju@2 259 lengthIN=length(IN);
nikcleju@2 260 z=[];
nikcleju@2 261 for k=1:length(IN)
nikcleju@2 262 % Extract new element
nikcleju@2 263 mask=zeros(m,1);
nikcleju@2 264 mask(IN(k))=1;
nikcleju@2 265 new_element=P(mask);
nikcleju@2 266
nikcleju@2 267 % Orthogonalise new element
nikcleju@2 268 qP=Q(:,1:k-1)'*new_element;
nikcleju@2 269 q=new_element-Q(:,1:k-1)*(qP);
nikcleju@2 270
nikcleju@2 271 nq=norm(q);
nikcleju@2 272 q=q/nq;
nikcleju@2 273 % Update QR factorisation
nikcleju@2 274 R(1:k-1,k)=qP;
nikcleju@2 275 R(k,k)=nq;
nikcleju@2 276 Q(:,k)=q;
nikcleju@2 277
nikcleju@2 278 z(k)=q'*x;
nikcleju@2 279 end
nikcleju@2 280 s = s_initial;
nikcleju@2 281 Residual=x-Q(:,k)*z;
nikcleju@2 282 oldERR = Residual'*Residual/n;
nikcleju@2 283 else
nikcleju@2 284 IN = [];
nikcleju@2 285 Residual = x;
nikcleju@2 286 s = s_initial;
nikcleju@2 287 sigsize = x'*x/n;
nikcleju@2 288 oldERR = sigsize;
nikcleju@2 289 k=0;
nikcleju@2 290 z=[];
nikcleju@2 291 end
nikcleju@2 292
nikcleju@2 293 else
nikcleju@2 294 IN = [];
nikcleju@2 295 Residual = x;
nikcleju@2 296 s = s_initial;
nikcleju@2 297 sigsize = x'*x/n;
nikcleju@2 298 oldERR = sigsize;
nikcleju@2 299 k=0;
nikcleju@2 300 z=[];
nikcleju@2 301 end
nikcleju@2 302
nikcleju@2 303
nikcleju@2 304
nikcleju@2 305 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 306 % Main algorithm
nikcleju@2 307 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 308 if verbose
nikcleju@2 309 display('Main iterations...')
nikcleju@2 310 end
nikcleju@2 311 tic
nikcleju@2 312 t=0;
nikcleju@2 313 DR=Pt(Residual);
nikcleju@2 314 done = 0;
nikcleju@2 315 iter=1;
nikcleju@2 316
nikcleju@2 317 %Nic: find norms of dictionary atoms, for RandOMP
nikcleju@2 318 % for i = 1:m
nikcleju@2 319 % norms(i) = norm(P([zeros(i-1,1) ; 1 ; zeros(m-i,1)]));
nikcleju@2 320 % end
nikcleju@2 321
nikcleju@2 322 while ~done
nikcleju@2 323
nikcleju@2 324 % Select new element
nikcleju@2 325 DR(IN)=0;
nikcleju@2 326 % Nic: replace selection with random variable
nikcleju@2 327 % i.e. Randomized OMP!!
nikcleju@2 328 % DON'T FORGET ABOUT THIS!!
nikcleju@2 329 [v I]=max(abs(DR));
nikcleju@2 330 %I = randp(exp(abs(DR).^2 ./ (norms.^2)'), [1 1]);
nikcleju@2 331 IN=[IN I];
nikcleju@2 332
nikcleju@2 333
nikcleju@2 334 k=k+1;
nikcleju@2 335 % Extract new element
nikcleju@2 336 mask=zeros(m,1);
nikcleju@2 337 mask(IN(k))=1;
nikcleju@2 338 new_element=P(mask);
nikcleju@2 339
nikcleju@2 340 % Orthogonalise new element
nikcleju@2 341 qP=Q(:,1:k-1)'*new_element;
nikcleju@2 342 q=new_element-Q(:,1:k-1)*(qP);
nikcleju@2 343
nikcleju@2 344 nq=norm(q);
nikcleju@2 345 q=q/nq;
nikcleju@2 346 % Update QR factorisation
nikcleju@2 347 R(1:k-1,k)=qP;
nikcleju@2 348 R(k,k)=nq;
nikcleju@2 349 Q(:,k)=q;
nikcleju@2 350
nikcleju@2 351 z(k)=q'*x;
nikcleju@2 352
nikcleju@2 353 % New residual
nikcleju@2 354 Residual=Residual-q*(z(k));
nikcleju@2 355 DR=Pt(Residual);
nikcleju@2 356
nikcleju@2 357 ERR=Residual'*Residual/n;
nikcleju@2 358 if comp_err
nikcleju@2 359 err_mse(iter)=ERR;
nikcleju@2 360 end
nikcleju@2 361
nikcleju@2 362 if comp_time
nikcleju@2 363 iter_time(iter)=toc;
nikcleju@2 364 end
nikcleju@2 365
nikcleju@2 366 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 367 % Are we done yet?
nikcleju@2 368 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 369
nikcleju@2 370 if strcmp(STOPCRIT,'M')
nikcleju@2 371 if iter >= STOPTOL
nikcleju@2 372 done =1;
nikcleju@2 373 elseif verbose && toc-t>10
nikcleju@2 374 display(sprintf('Iteration %i. --- %i iterations to go',iter ,STOPTOL-iter))
nikcleju@2 375 t=toc;
nikcleju@2 376 end
nikcleju@2 377 elseif strcmp(STOPCRIT,'mse')
nikcleju@2 378 if comp_err
nikcleju@2 379 if err_mse(iter)<STOPTOL;
nikcleju@2 380 done = 1;
nikcleju@2 381 elseif verbose && toc-t>10
nikcleju@2 382 display(sprintf('Iteration %i. --- %i mse',iter ,err_mse(iter)))
nikcleju@2 383 t=toc;
nikcleju@2 384 end
nikcleju@2 385 else
nikcleju@2 386 if ERR<STOPTOL;
nikcleju@2 387 done = 1;
nikcleju@2 388 elseif verbose && toc-t>10
nikcleju@2 389 display(sprintf('Iteration %i. --- %i mse',iter ,ERR))
nikcleju@2 390 t=toc;
nikcleju@2 391 end
nikcleju@2 392 end
nikcleju@2 393 elseif strcmp(STOPCRIT,'mse_change') && iter >=2
nikcleju@2 394 if comp_err && iter >=2
nikcleju@2 395 if ((err_mse(iter-1)-err_mse(iter))/sigsize <STOPTOL);
nikcleju@2 396 done = 1;
nikcleju@2 397 elseif verbose && toc-t>10
nikcleju@2 398 display(sprintf('Iteration %i. --- %i mse change',iter ,(err_mse(iter-1)-err_mse(iter))/sigsize ))
nikcleju@2 399 t=toc;
nikcleju@2 400 end
nikcleju@2 401 else
nikcleju@2 402 if ((oldERR - ERR)/sigsize < STOPTOL);
nikcleju@2 403 done = 1;
nikcleju@2 404 elseif verbose && toc-t>10
nikcleju@2 405 display(sprintf('Iteration %i. --- %i mse change',iter ,(oldERR - ERR)/sigsize))
nikcleju@2 406 t=toc;
nikcleju@2 407 end
nikcleju@2 408 end
nikcleju@2 409 elseif strcmp(STOPCRIT,'corr')
nikcleju@2 410 if max(abs(DR)) < STOPTOL;
nikcleju@2 411 done = 1;
nikcleju@2 412 elseif verbose && toc-t>10
nikcleju@2 413 display(sprintf('Iteration %i. --- %i corr',iter ,max(abs(DR))))
nikcleju@2 414 t=toc;
nikcleju@2 415 end
nikcleju@2 416 end
nikcleju@2 417
nikcleju@2 418 % Also stop if residual gets too small or maxIter reached
nikcleju@2 419 if comp_err
nikcleju@2 420 if err_mse(iter)<1e-16
nikcleju@2 421 display('Stopping. Exact signal representation found!')
nikcleju@2 422 done=1;
nikcleju@2 423 end
nikcleju@2 424 else
nikcleju@2 425
nikcleju@2 426
nikcleju@2 427 if iter>1
nikcleju@2 428 if ERR<1e-16
nikcleju@2 429 display('Stopping. Exact signal representation found!')
nikcleju@2 430 done=1;
nikcleju@2 431 end
nikcleju@2 432 end
nikcleju@2 433 end
nikcleju@2 434
nikcleju@2 435 if iter >= MAXITER
nikcleju@2 436 display('Stopping. Maximum number of iterations reached!')
nikcleju@2 437 done = 1;
nikcleju@2 438 end
nikcleju@2 439
nikcleju@2 440 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 441 % If not done, take another round
nikcleju@2 442 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 443
nikcleju@2 444 if ~done
nikcleju@2 445 iter=iter+1;
nikcleju@2 446 oldERR=ERR;
nikcleju@2 447 end
nikcleju@2 448 end
nikcleju@2 449
nikcleju@2 450 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 451 % Now we can solve for s by back-substitution
nikcleju@2 452 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 453
nikcleju@2 454 s(IN)=R(1:k,1:k)\z(1:k)';
nikcleju@2 455
nikcleju@2 456 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 457 % Only return as many elements as iterations
nikcleju@2 458 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nikcleju@2 459
nikcleju@2 460 if nargout >=2
nikcleju@2 461 err_mse = err_mse(1:iter);
nikcleju@2 462 end
nikcleju@2 463 if nargout ==3
nikcleju@2 464 iter_time = iter_time(1:iter);
nikcleju@2 465 end
nikcleju@2 466 if verbose
nikcleju@2 467 display('Done')
nikcleju@2 468 end
nikcleju@2 469
nikcleju@2 470 % Change history
nikcleju@2 471 %
nikcleju@2 472 % 8 of Februray: Algo does no longer stop if dictionary is not normaliesd.