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.
|