function [s, residual] = GMP(A, y, group, err)
% Group Matching Pursuit
% Input
% A = N X d dimensional measurment matrix
% y = N dimensional observation vector
% group = labels
% m = sparsity of the underlying signal
% Output
% s = estimated sparse signal
% r = residual
% Copyright (c) Angshul Majumdar 2009
if nargin < 5
err = 1e-5;
end
c = max(group);
s = zeros(size(A,2),1);
r(:,1) = y; L = []; Psi = [];
i = 2;
for j = 1:c
g{j} = find(group == j);
end
while (i < c) && (norm(r(:,end))>err)
l = A'*r(:,i-1);
for j = 1:c
lg(j) = mean(abs(l(g{j})));
end
[B, IX] = sort(lg, 'descend');
L = [L' g{IX(1)}']';
s(g{IX(1)}) = s(g{IX(1)}) + l(g{IX(1)});
mask = zeros(size(A,2),1);
mask(g{IX(1)}) = l(g{IX(1)});
r(:,i) = r(:,i-1) - A*mask;
i = i+1;
end
residual = r(:,end);