comparison solvers/SMALL_pcgp.m @ 178:4ea4badb2266 danieleb

added ramirez dl (to be completed) and MOCOD dictionary update
author Daniele Barchiesi <daniele.barchiesi@eecs.qmul.ac.uk>
date Thu, 17 Nov 2011 11:22:17 +0000
parents 855025f4c779
children
comparison
equal deleted inserted replaced
177:714fa7b8c1ad 178:4ea4badb2266
1 function [A, resF]=SMALL_pcgp(Dict,X, m, maxNumCoef, errorGoal, varargin)
2 %% Partial Conjugate Gradient Pursuit Multiple vectors sparse representation
3 %
4 % Sparse coding of a group of signals based on a given
5 % dictionary and specified number of atoms to use.
6 % input arguments: Dict - the dictionary
7 % X - the signals to represent
8 % m - number of atoms in Dictionary
9 % errorGoal - the maximal allowed representation error for
10 % each signal.
11 %
12 % optional: if Dict is function handle then Transpose Dictionary
13 % handle needs to be specified.
14 %
15 % output arguments: A - sparse coefficient matrix.
16
17 %
18 % Centre for Digital Music, Queen Mary, University of London.
19 % This file copyright 2009 Ivan Damnjanovic.
20 %
21 % This program is free software; you can redistribute it and/or
22 % modify it under the terms of the GNU General Public License as
23 % published by the Free Software Foundation; either version 2 of the
24 % License, or (at your option) any later version. See the file
25 % COPYING included with this distribution for more information.
26 %
27 %%
28
29 % This Dictionary check is based on Thomas Blumensath work in sparsify 0_4 greedy solvers
30 if isa(Dict,'float')
31 D =@(z) Dict*z;
32 Dt =@(z) Dict'*z;
33 elseif isobject(Dict)
34 D =@(z) Dict*z;
35 Dt =@(z) Dict'*z;
36 elseif isa(Dict,'function_handle')
37 try
38 DictT=varargin{1};
39 if isa(DictT,'function_handle');
40 D=Dict;
41 Dt=DictT;
42 else
43 error('If Dictionary is a function handle,Transpose Dictionary also needs to be a function handle. ');
44 end
45 catch
46 error('If Dictionary is a function handle, Transpose Dictionary needs to be specified. Exiting.');
47 end
48 else
49 error('Dictionary is of unsupported type. Use explicit matrix, function_handle or object. Exiting.');
50 end
51 %%
52 %positivity=1;
53 [n,P]=size(X);
54
55
56
57 A = sparse(m,size(X,2));
58
59 for k=1:1:P,
60
61 x = X(:,k);
62 residual = x;
63 indx =[];
64 j=0;
65
66
67 currResNorm = residual'*residual/n;
68 errGoal=errorGoal*currResNorm;
69 a = zeros(m,1);
70 p = zeros(m,1);
71
72 while j < maxNumCoef,
73
74 j = j+1;
75 dir=Dt(residual);
76 if exist('positivity','var')&&(positivity==1)
77 [tmp__, pos]=max(dir);
78 else
79 [tmp__, pos]=max(abs(dir));
80 end
81 indx(j)=pos;
82
83 p(indx)=dir(indx);
84 Dp=D(p);
85 pDDp=Dp'*Dp;
86
87 if (j==1)
88 beta=0;
89 else
90 beta=-Dp'*residual/pDDp;
91 end
92
93 alfa=residual'*Dp/pDDp;
94 a=a+alfa*p;
95 p(indx)=dir(indx)+beta*p(indx);
96
97 residual=residual-alfa*Dp;
98
99 currResNorm = residual'*residual/n;
100 if currResNorm<errGoal
101 fprintf('\nFound exact representation! \n');
102 break;
103 end
104 end;
105 if (~isempty(indx))
106 resF(k)=currResNorm;
107 A(indx,k)=a(indx);
108 end
109 end;
110 return;
111
112
113