annotate OMP/greed_omp_qr.m @ 1:2a2abf5092f8

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