changeset 54:527b0f6a9ffc

Changed dictionary structure
author nikcleju
date Wed, 14 Dec 2011 14:37:20 +0000
parents 991794ff9544
children 020399d027b1
files matlab/study_analysis_rec_algos_noisy.m matlab/study_analysis_rec_approx.m
diffstat 2 files changed, 780 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matlab/study_analysis_rec_algos_noisy.m	Wed Dec 14 14:37:20 2011 +0000
@@ -0,0 +1,417 @@
+% File: study_analysis_rec_algos
+% Run global experiment to compare algorithms used for analysis-based reconstruction
+% and plot phast transition graphs
+
+clear all
+close all
+
+% =================================
+% Set up experiment parameters
+%==================================
+% Which form factor, delta and rho we want
+sigmas = 1.2;
+deltas = 0.05:0.05:0.95;
+rhos   = 0.05:0.05:0.95;
+% deltas = [0.95];
+% rhos   = [0.1];
+%deltas = 0.3:0.3:0.9;
+%rhos   = 0.3:0.3:0.9;
+
+% Number of vectors to generate each time
+numvects = 100;
+
+% Add noise 
+% This is norm(signal)/norm(noise), so power, not energy
+SNRdb = 20; % virtually no noise
+
+% Show progressbar ? (not recommended when running on parallel threads)
+do_progressbar = 0;
+
+% Value of lambda
+lambda = 1e-2;
+
+% What algos to run
+do_abs_ompk = 1;
+do_abs_ompeps = 1;
+do_abs_tst = 1;
+do_abs_bp = 1;
+do_gap = 1;
+do_nesta = 0;
+
+% =================================
+% Processing the parameters
+%==================================
+% Set up parameter structure
+count = 0;
+for isigma = 1:sigmas
+    for idelta = 1:numel(deltas)
+        for irho = 1:numel(rhos)
+            sigma = sigmas(isigma);
+            delta = deltas(idelta);
+            rho = rhos(irho);
+        
+            d = 200;
+            p = round(sigma*d);
+            m = round(delta*d);
+            l = round(d - rho*m);
+            
+            params(count+1).d = d;
+            params(count+1).p = p;
+            params(count+1).m = m;
+            params(count+1).l = l;
+            
+            count = count + 1;
+        end
+    end
+end
+
+% Compute noiselevel from db
+noiselevel = 1 / (10^(SNRdb/10));
+
+%load study_analysis_init
+
+% Generate an analysis operator Omega
+Omega = Generate_Analysis_Operator(d, p);
+
+% Progressbar
+if do_progressbar
+    progressbar('Total', 'Current parameters');
+end
+
+% Init times
+elapsed_abs_ompk = 0;
+elapsed_abs_ompeps = 0;
+elapsed_abs_tst = 0;
+elapsed_abs_bp = 0;
+elapsed_gap = 0;
+elapsed_nesta = 0;
+
+% Init results structure
+results = [];
+
+% Prepare progressbar reduction variables
+% if do_progressbar
+%     incr2 = 1/numvects;
+%     incr1 = 1/numvects/count;
+%     frac2 = 0;
+%     frac1 = 0;
+% end 
+
+% ========
+% Run
+% ========
+parfor iparam = 1:numel(params)
+    
+    % Read current parameters
+    d = params(iparam).d;
+    p = params(iparam).p;
+    m = params(iparam).m;
+    l = params(iparam).l;
+    
+    % Init stuff
+    xrec_abs_ompk   = zeros(d, numvects);
+    xrec_abs_ompeps = zeros(d, numvects);
+    xrec_abs_tst    = zeros(d, numvects);
+    xrec_abs_bp     = zeros(d, numvects);
+    xrec_gap        = zeros(d, numvects);
+    xrec_nesta      = zeros(d, numvects);
+    %
+       err_abs_ompk   = zeros(numvects,1);
+    relerr_abs_ompk   = zeros(numvects,1);
+       err_abs_ompeps = zeros(numvects,1);
+    relerr_abs_ompeps = zeros(numvects,1);
+       err_abs_tst    = zeros(numvects,1);
+    relerr_abs_tst    = zeros(numvects,1);
+       err_abs_bp     = zeros(numvects,1);
+    relerr_abs_bp     = zeros(numvects,1);
+       err_gap        = zeros(numvects,1);
+    relerr_gap        = zeros(numvects,1);
+       err_nesta      = zeros(numvects,1);
+    relerr_nesta      = zeros(numvects,1);
+
+    % Generate data based on parameters
+    [x0,y,M,Lambda] = Generate_Data_Known_Omega(Omega, d,p,m,l,noiselevel, numvects,'l0');
+    
+    % For every generated signal do
+    for iy = 1:size(y,2)
+        
+        % Compute epsilon 
+        epsilon = noiselevel * norm(y(:,iy));
+        
+        %--------------------------------
+        % Reconstruct (and measure delay)
+        % Compute reconstruction error
+        %--------------------------------
+        % ABS-OMPk
+        if (do_abs_ompk)
+            timer_abs_ompk = tic;
+            xrec_abs_ompk(:,iy) = ABS_OMPk_approx(y(:,iy), Omega, M, p-l, lambda);
+            elapsed_abs_ompk = elapsed_abs_ompk + toc(timer_abs_ompk);
+            %
+            err_abs_ompk(iy)    = norm(x0(:,iy) - xrec_abs_ompk(:,iy));
+            relerr_abs_ompk(iy) = err_abs_ompk(iy) / norm(x0(:,iy));   
+        end
+        % ABS-OMPeps
+        if (do_abs_ompeps)
+            timer_abs_ompeps = tic;
+            xrec_abs_ompeps(:,iy) = ABS_OMPeps_approx(y(:,iy), Omega, M, epsilon, lambda);
+            elapsed_abs_ompeps = elapsed_abs_ompeps + toc(timer_abs_ompeps);
+            %
+            err_abs_ompeps(iy)    = norm(x0(:,iy) - xrec_abs_ompeps(:,iy));
+            relerr_abs_ompeps(iy) = err_abs_ompeps(iy) / norm(x0(:,iy));
+        end
+        % ABS-TST
+        if (do_abs_tst)
+            timer_abs_tst = tic;
+            xrec_abs_tst(:,iy) = ABS_TST_approx(y(:,iy), Omega, M, epsilon, lambda);
+            elapsed_abs_tst = elapsed_abs_tst + toc(timer_abs_tst);
+            %
+            err_abs_tst(iy)     = norm(x0(:,iy) - xrec_abs_tst(:,iy));
+            relerr_abs_tst(iy)  = err_abs_tst(iy) / norm(x0(:,iy));
+        end
+        % ABS-BP
+        if (do_abs_bp)
+            timer_abs_bp = tic;
+            xrec_abs_bp(:,iy)  = ABS_BP_approx(y(:,iy), Omega, M, epsilon, lambda);
+            elapsed_abs_bp = elapsed_abs_bp + toc(timer_abs_bp);
+            %
+            err_abs_bp(iy)     = norm(x0(:,iy) - xrec_abs_bp(:,iy));
+            relerr_abs_bp(iy)  = err_abs_bp(iy) / norm(x0(:,iy));
+        end
+        % GAP
+        if (do_gap)
+            gapparams = [];
+            gapparams.num_iteration = 40;
+            gapparams.greedy_level = 0.9;
+            gapparams.stopping_coefficient_size = 1e-4;
+            gapparams.l2solver = 'pseudoinverse';
+            gapparams.noise_level = noiselevel;
+            timer_gap = tic;
+            xrec_gap(:,iy) = GAP(y(:,iy), M, M', Omega, Omega', gapparams, zeros(d,1));
+            elapsed_gap = elapsed_gap + toc(timer_gap);
+            %
+            err_gap(iy)     = norm(x0(:,iy) - xrec_gap(:,iy));
+            relerr_gap(iy)  = err_gap(iy) / norm(x0(:,iy));
+        end
+        % NESTA
+        if (do_nesta)
+            try
+                timer_nesta = tic;
+                xrec_nesta(:,iy) = do_nesta_DemoNonProjector(x0(:,iy), M, Omega', 0);
+                elapsed_nesta = elapsed_nesta + toc(timer_nesta);
+            catch err
+                disp('*****ERROR: NESTA throwed error *****');
+                xrec_nesta(:,iy) = zeros(size(x0(:,iy)));
+            end
+            %
+            err_nesta(iy)       = norm(x0(:,iy) - xrec_nesta(:,iy));
+            relerr_nesta(iy)    = err_nesta(iy) / norm(x0(:,iy)); 
+        end
+
+        % Update progressbar
+%         if do_progressbar
+%             %frac2 = iy/numvects;
+%             %frac1 = ((iparam-1) + frac2) / count;
+%             if norm(frac2 - 1) < 1e-6
+%                 frac2 = 0;
+%             end
+%             frac2 = frac2 + incr2;
+%             frac1 = frac1 + incr1;
+%             progressbar(frac1, frac2);
+%         end
+    end
+    
+    %--------------------------------
+    % Save results in big stucture & display
+    %--------------------------------
+    % Save reconstructed signals
+    % Save rel & abs errors
+    % Display error
+    disp(['Simulation no. ' num2str(iparam)]);
+    if (do_abs_ompk)
+        results(iparam).xrec_abs_ompk   = xrec_abs_ompk;
+        results(iparam).err_abs_ompk    = err_abs_ompk;
+        results(iparam).relerr_abs_ompk = relerr_abs_ompk;
+        disp(['  ABS_OMPk:   avg relative error = ' num2str(mean(relerr_abs_ompk))]);
+    end
+    if (do_abs_ompeps)
+        results(iparam).xrec_abs_ompeps   = xrec_abs_ompeps;
+        results(iparam).err_abs_ompeps    = err_abs_ompeps;
+        results(iparam).relerr_abs_ompeps = relerr_abs_ompeps;   
+        disp(['  ABS_OMPeps: avg relative error = ' num2str(mean(relerr_abs_ompeps))]);
+    end
+    if (do_abs_tst)
+        results(iparam).xrec_abs_tst   = xrec_abs_tst;
+        results(iparam).err_abs_tst    = err_abs_tst;
+        results(iparam).relerr_abs_tst = relerr_abs_tst;
+        disp(['  ABS_TST:    avg relative error = ' num2str(mean(relerr_abs_tst))]);
+    end
+    if (do_abs_bp)
+        results(iparam).xrec_abs_bp   = xrec_abs_bp;
+        results(iparam).err_abs_bp    = err_abs_bp;
+        results(iparam).relerr_abs_bp = relerr_abs_bp;
+        disp(['  ABS_BP:     avg relative error = ' num2str(mean(relerr_abs_bp))]);
+    end
+    if (do_gap)
+        results(iparam).xrec_gap   = xrec_gap;
+        results(iparam).err_gap    = err_gap;
+        results(iparam).relerr_gap = relerr_gap;
+        disp(['  GAP:        avg relative error = ' num2str(mean(relerr_gap))]);
+    end
+    if (do_nesta)
+        results(iparam).xrec_nesta   = xrec_nesta;
+        results(iparam).err_nesta    = err_nesta;
+        results(iparam).relerr_nesta = relerr_nesta;
+        disp(['  NESTA:      avg relative error = ' num2str(mean(relerr_nesta))]);
+    end
+end
+
+% =================================
+% Save
+% =================================
+save mat/avgerr_SNR20_lbd1e-2
+
+% =================================
+% Plot phase transition
+% =================================
+%--------------------------------
+% Prepare
+%--------------------------------
+%d = 200;
+%m = 190;
+%exactthr = d/m * noiselevel;
+%sigma = 1.2;
+iparam = 1;
+for idelta = 1:numel(deltas)
+    for irho = 1:numel(rhos)
+        % Create exact recovery count matrix 
+%         nexact_abs_bp  (irho, idelta)    = sum(results(iparam).relerr_abs_bp < exactthr);
+%         nexact_abs_ompk (irho, idelta)   = sum(results(iparam).relerr_abs_ompk < exactthr);
+%         nexact_abs_ompeps (irho, idelta) = sum(results(iparam).relerr_abs_ompeps < exactthr);
+%         nexact_gap (irho, idelta)        = sum(results(iparam).relerr_gap < exactthr);
+%         nexact_abs_tst (irho, idelta)    = sum(results(iparam).relerr_abs_tst < exactthr);
+% %         nexact_nesta(irho, idelta)       = sum(results(iparam).relerr_nesta < exactthr);
+
+        % Get histogram (for a single param set only!)
+%         hist_abs_ompk   = hist(results(iparam).relerr_abs_ompk, 0.001:0.001:0.1);
+%         hist_abs_ompeps = hist(results(iparam).relerr_abs_ompeps, 0.001:0.001:0.1);
+%         hist_abs_tst    = hist(results(iparam).relerr_abs_tst, 0.001:0.001:0.1);
+%         hist_abs_bp     = hist(results(iparam).relerr_abs_bp, 0.001:0.001:0.1);
+%         hist_gap        = hist(results(iparam).relerr_gap, 0.001:0.001:0.1);
+        
+        % Compute average error value
+        if (do_abs_ompk)
+            avgerr_abs_ompk(irho, idelta)    = 1 - mean(results(iparam).relerr_abs_ompk);
+            avgerr_abs_ompk(avgerr_abs_ompk < 0) = 0;
+        end
+        if (do_abs_ompeps)
+            avgerr_abs_ompeps(irho, idelta)  = 1 - mean(results(iparam).relerr_abs_ompeps);
+            avgerr_abs_ompeps(avgerr_abs_ompeps < 0) = 0;
+        end
+        if (do_abs_tst)
+            avgerr_abs_tst(irho, idelta)     = 1 - mean(results(iparam).relerr_abs_tst);
+            avgerr_abs_tst(avgerr_abs_tst < 0) = 0;
+        end
+        if (do_abs_bp)
+            avgerr_abs_bp(irho, idelta)      = 1 - mean(results(iparam).relerr_abs_bp);
+            avgerr_abs_bp(avgerr_abs_bp < 0) = 0;
+        end
+        if (do_gap)
+            avgerr_gap(irho, idelta)         = 1 - mean(results(iparam).relerr_gap);
+            avgerr_gap(avgerr_gap < 0) = 0;
+        end
+        if (do_nesta)
+            avgerr_nesta(irho, idelta)       = 1 - mean(results(iparam).relerr_nesta);
+            avgerr_nesta(avgerr_nesta < 0) = 0;
+        end
+        
+        iparam = iparam + 1;
+    end
+end
+
+%--------------------------------
+% Plot
+%--------------------------------
+show_phasetrans = @show_phasetrans_win;
+iptsetpref('ImshowAxesVisible', 'on');
+close all
+figbase = 'figs/avgerr_SNR20_lbd1e-2_';
+do_save = 1;
+%
+if (do_abs_ompk)
+    figure;
+    %h = show_phasetrans(nexact_abs_ompk, numvects);
+    %bar(0.001:0.001:0.1, hist_abs_ompk);
+    h = show_phasetrans(avgerr_abs_ompk, 1);
+    if do_save
+        figname = [figbase 'ABS_OMPk'];
+        saveas(h, [figname '.fig']);
+        saveas(h, [figname '.png']);
+        saveTightFigure(h, [figname '.pdf']);
+    end
+end
+%
+if (do_abs_ompeps)
+    figure;
+    %h = show_phasetrans(nexact_abs_ompeps, numvects);
+    %bar(0.001:0.001:0.1, hist_abs_ompeps);
+    h = show_phasetrans(avgerr_abs_ompeps, 1);
+    if do_save
+        figname = [figbase 'ABS_OMPeps'];
+        saveas(h, [figname '.fig']);
+        saveas(h, [figname '.png']);
+        saveTightFigure(h, [figname '.pdf']);
+    end
+end
+%
+if (do_abs_tst)
+    figure;
+    %h = show_phasetrans(nexact_abs_tst, numvects);
+    %bar(0.001:0.001:0.1, hist_abs_tst);
+    h = show_phasetrans(avgerr_abs_tst, 1);
+    if do_save
+        figname = [figbase 'ABS_TST'];
+        saveas(h, [figname '.fig']);
+        saveas(h, [figname '.png']);
+        saveTightFigure(h, [figname '.pdf']);
+    end
+end
+%
+if (do_abs_bp)
+    figure;
+    %h = show_phasetrans(nexact_abs_bp, numvects);
+    %bar(0.001:0.001:0.1, hist_abs_bp);
+    h = show_phasetrans(avgerr_abs_bp, 1);
+    if do_save
+        figname = [figbase 'ABS_BP'];
+        saveas(h, [figname '.fig']);
+        saveas(h, [figname '.png']);
+        saveTightFigure(h, [figname '.pdf']);
+    end
+end
+%
+if (do_gap)
+    figure;
+    %h = show_phasetrans(nexact_gap, numvects);
+    %bar(0.001:0.001:0.1, hist_gap);
+    h = show_phasetrans(avgerr_gap, 1);
+    if do_save
+        figname = [figbase 'GAP'];
+        saveas(h, [figname '.fig']);
+        saveas(h, [figname '.png']);
+        saveTightFigure(h, [figname '.pdf']);
+    end
+end
+%
+if (do_nesta)
+    figure;
+    %h = show_phasetrans(nexact_nesta, numvects);
+    %bar(0.001:0.001:0.1, hist_nesta);
+    h = show_phasetrans(avgerr_nesta, 1);
+    if do_save
+        figname = [figbase 'NESTA'];
+        saveas(h, [figname '.fig']);
+        saveas(h, [figname '.png']);
+        saveTightFigure(h, [figname '.pdf']);
+    end
+end
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matlab/study_analysis_rec_approx.m	Wed Dec 14 14:37:20 2011 +0000
@@ -0,0 +1,363 @@
+% File: study_analysis_rec_algos
+% Run experiment to prove that our approx. ABS approach really converges to
+% the anaysis solution as lambda -> infty
+% For this, we need to generate signals that, provably, yield bad results
+% with synthesis recovery, and good results with analysis recovery
+% To do this we choose, N >> d, small l, and m close to d
+
+clear all
+close all
+
+% =================================
+% Set up experiment parameters
+%==================================
+% Which form factor, delta and rho we want
+sigma = 2;
+%delta = 0.995;
+%rho   = 0.7;
+%delta = 0.8;
+%rho = 0.15;
+delta = 0.5;
+rho = 0.05;
+
+% Number of vectors to generate each time
+numvects = 10;
+
+% Add noise 
+% This is norm(signal)/norm(noise), so power, not energy
+SNRdb = 20;
+%epsextrafactor = 2
+
+% =================================
+% Processing the parameters
+%==================================
+
+% Compute noiselevel from db
+noiselevel = 1 / (10^(SNRdb/10));
+
+% Set up parameter structure
+% and generate data X as well
+d = 50;
+p = round(sigma*d);
+m = round(delta*d);
+l = round(d - rho*m);
+            
+% Generate Omega and data based on parameters
+Omega = Generate_Analysis_Operator(d, p);
+%Make Omega more coherent
+[U, S, V] = svd(Omega);
+%Sdnew = diag(S) ./ (1:numel(diag(S)))';
+Sdnew = diag(S) .* (1:numel(diag(S)))'; % Make D coherent, not Omega!
+Snew = [diag(Sdnew); zeros(size(S,1) - size(S,2), size(S,2))];
+Omega = U * Snew * V';
+[x0,y,M,Lambda, realnoise] = Generate_Data_Known_Omega(Omega, d,p,m,l,noiselevel, numvects,'l0');
+
+datafilename = 'mat/data_SNR20';
+save(datafilename);
+%load mat/data_SNR20
+
+% Values of lambda
+%lambdas = sqrt([1e-10 1e-8 1e-6 1e-4 1e-2 1 100 1e4 1e6 1e8 1e10]);
+lambdas = [0 10.^linspace(-5, 4, 10)];
+%lambdas = 1000
+%lambdas = sqrt([0 1 10000]);
+
+% Algorithm identifiers
+algonone = [];
+ompk   = 1;
+ompeps = 2;
+tst    = 3;
+bp     = 4;
+gap    = 5;
+nesta  = 6;
+sl0    = 7;
+yall1  = 8;
+spgl1  = 9;
+nestasynth = 10;
+numallalgos = 10;
+algoname{ompk} = 'ABS OMPk';
+algoname{ompeps} = 'ABS OMPeps';
+algoname{tst} = 'ABS TST';
+algoname{bp} = 'ABS BP';
+algoname{gap} = 'GAP';
+algoname{nesta} = 'NESTA Analysis';
+algoname{sl0} = 'ABS SL0';
+algoname{yall1} = 'ABS YALL1';
+algoname{spgl1} = 'ABS SPGL1';
+algoname{nestasynth} = 'NESTA Synth';
+
+% What algos to run
+%algos = [gap, ompk, ompeps, tst, bp, sl0, yall1];
+%algos = [gap, ompk, ompeps, tst, bp];
+algos = [gap, sl0];
+numalgos = numel(algos);
+
+% Save mat file?
+do_save_mat = 0;
+matfilename = 'mat/approx_d50_sigma2_SNR20db_Dcoh';
+
+% Save figures?
+do_save_figs = 0;
+figfilename = 'figs/approx_d50_sigma2_SNR20db_Dcoh';
+
+% Show progressbar ? (not recommended when running on parallel threads)
+do_progressbar = 0;
+if do_progressbar
+    progressbar('Total', 'Current parameters');
+end
+
+% Init times
+for i = 1:numalgos
+    elapsed(algos(i)) = 0;
+end
+
+% Init results structure
+results = [];
+
+
+% ========
+% Run
+% ========
+
+% Run GAP and NESTA first
+if any(algos == gap)
+    for iy = 1:size(y,2)
+        a = gap;
+        % Compute epsilon 
+        %epsilon = epsextrafactor * noiselevel * norm(y(:,iy));
+        epsilon = 1.1 * norm(realnoise(:,iy));
+        %
+        gapparams = [];
+        gapparams.num_iteration = 1000;
+        gapparams.greedy_level = 0.9;
+        gapparams.stopping_coefficient_size = 1e-4;
+        gapparams.l2solver = 'pseudoinverse';
+        %gapparams.noise_level = noiselevel;
+        gapparams.noise_level = epsilon;
+        timer(a) = tic;
+        xrec{a}(:,iy) = GAP(y(:,iy), M, M', Omega, Omega', gapparams, zeros(d,1));
+        elapsed(a) = elapsed(a) + toc(timer(a));
+        %
+        err{a}(iy)    = norm(x0(:,iy) - xrec{a}(:,iy));
+        relerr{a}(iy) = err{a}(iy) / norm(x0(:,iy));    
+    end
+    disp([ algoname{a} ':   avg relative error = ' num2str(mean(relerr{a}))]);
+end
+if any(algos == nesta)
+    for iy = 1:size(y,2)
+        a = nesta;
+        % Compute epsilon 
+        %epsilon = epsextrafactor * noiselevel * norm(y(:,iy));
+        epsilon = 1.1 * norm(realnoise(:,iy));
+        %
+        try
+            timer(a) = tic;
+            %xrec{a}(:,iy) = do_nesta_DemoNonProjector(x0(:,iy), M, Omega', 0);
+
+            % Common heuristic: delta = sqrt(m + 2*sqrt(2*m))*sigma ?????????
+            [U,S,V] = svd(M,'econ');
+            opts.U = Omega;
+            opts.Ut = Omega';
+            opts.USV.U=U;
+            opts.USV.S=S;
+            opts.USV.V=V;
+            opts.TolVar = 1e-5;
+            opts.Verbose = 0;
+            xrec{a}(:,iy) = NESTA(M, [], y(:,iy), 1e-3, epsilon, opts);
+            elapsed(a) = elapsed(a) + toc(timer(a));
+        catch err
+            disp('*****ERROR: NESTA throwed error *****');
+            xrec{a}(:,iy) = zeros(size(x0(:,iy)));
+        end
+        %
+        err{a}(iy)    = norm(x0(:,iy) - xrec{a}(:,iy));
+        relerr{a}(iy) = err{a}(iy) / norm(x0(:,iy));    
+    end
+    disp([ algoname{a} ':   avg relative error = ' num2str(mean(relerr{a}))]);
+end
+
+for i = 1:numel(algos)
+    if algos(i) == gap
+        continue;
+    end
+    prevgamma{algos(i)} = zeros(p, numvects);
+end
+
+% Run ABS algorithms (lambda-dependent)
+for iparam = 1:numel(lambdas)
+    
+    % Read current parameters
+    lambda = lambdas(iparam);
+    
+    % Init stuff
+    for i = 1:numel(algos)
+        if algos(i) == gap || algos(i) == nesta
+            continue;
+        end
+        xrec{algos(i)} = zeros(d, numvects);
+    end
+    %
+    for i = 1:numel(algos)
+        if algos(i) == gap || algos(i) == nesta
+            continue;
+        end        
+        err{algos(i)} = zeros(numvects,1);
+        relerr{algos(i)} = zeros(numvects,1);
+    end
+    
+    % For every generated signal do
+    for iy = 1:size(y,2)
+        
+        % Compute epsilon 
+        %epsilon = epsextrafactor * noiselevel * norm(y(:,iy));
+        epsilon = 1.1 * norm(realnoise(:,iy));
+        
+        %--------------------------------
+        % Reconstruct (and measure delay), Compute reconstruction error
+        %--------------------------------
+        for i = 1:numel(algos)
+            a = algos(i);
+            if a == gap  || a == nesta
+                continue
+            end
+            if a == ompk
+                timer(a) = tic;
+                xrec{a}(:,iy) = ABS_OMPk_approx(y(:,iy), Omega, M, p-l, lambda);
+                elapsed(a) = elapsed(a) + toc(timer(a));
+            elseif a == ompeps
+                timer(a) = tic;
+                xrec{a}(:,iy) = ABS_OMPeps_approx(y(:,iy), Omega, M, epsilon, lambda, Omega * x0(:,iy));
+                elapsed(a) = elapsed(a) + toc(timer(a));
+            elseif a == tst
+                timer(a) = tic;
+                xrec{a}(:,iy) = ABS_TST_approx(y(:,iy), Omega, M, epsilon, lambda, Omega * x0(:,iy));
+                elapsed(a) = elapsed(a) + toc(timer(a));
+            elseif a == bp
+                timer(a) = tic;
+                [xrec{a}(:,iy), prevgamma{a}(:,iy)] = ABS_BP_approx(y(:,iy), Omega, M, epsilon, lambda, prevgamma{a}(:,iy), Omega * x0(:,iy));
+                elapsed(a) = elapsed(a) + toc(timer(a));
+            elseif a == yall1
+                timer(a) = tic;
+                xrec{a}(:,iy) = ABS_YALL1_approx(y(:,iy), Omega, M, epsilon, lambda, Omega * x0(:,iy));
+                elapsed(a) = elapsed(a) + toc(timer(a));                
+%             elseif a == gap
+%                 gapparams = [];
+%                 gapparams.num_iteration = 40;
+%                 gapparams.greedy_level = 0.9;
+%                 gapparams.stopping_coefficient_size = 1e-4;
+%                 gapparams.l2solver = 'pseudoinverse';
+%                 %gapparams.noise_level = noiselevel;
+%                 gapparams.noise_level = epsilon;
+%                 timer(a) = tic;
+%                 xrec{a}(:,iy) = GAP(y(:,iy), M, M', Omega, Omega', gapparams, zeros(d,1));
+%                 elapsed(a) = elapsed(a) + toc(timer(a));
+%             elseif a == nesta
+%                 try
+%                     timer(a) = tic;
+%                     %xrec{a}(:,iy) = do_nesta_DemoNonProjector(x0(:,iy), M, Omega', 0);
+%                     
+%                     % Common heuristic: delta = sqrt(m + 2*sqrt(2*m))*sigma ?????????
+%                     [U,S,V] = svd(M,'econ');
+%                     opts.U = Omega;
+%                     opts.Ut = Omega';
+%                     opts.USV.U=U;
+%                     opts.USV.S=S;
+%                     opts.USV.V=V;
+%                     opts.TolVar = 1e-5;
+%                     opts.Verbose = 0;
+%                     xrec{a}(:,iy) = NESTA(M, [], y(:,iy), 1e-3, epsilon, opts);
+%                     elapsed(a) = elapsed(a) + toc(timer(a));
+%                 catch err
+%                     disp('*****ERROR: NESTA throwed error *****');
+%                     xrec{a}(:,iy) = zeros(size(x0(:,iy)));
+%                 end
+            elseif a == sl0
+                timer(a) = tic;
+                xrec{a}(:,iy) = ABS_SL0_approx(y(:,iy), Omega, M, epsilon, lambda);
+                elapsed(a) = elapsed(a) + toc(timer(a));    
+            elseif a == spgl1
+                timer(a) = tic;
+                xrec{a}(:,iy) = ABS_SPGL1_approx(y(:,iy), Omega, M, epsilon, lambda, Omega * xrec{bp}(:,iy));
+                elapsed(a) = elapsed(a) + toc(timer(a));    
+            elseif a == nestasynth
+                timer(a) = tic;
+                xrec{a}(:,iy) = ABS_NESTAsynth_approx(y(:,iy), Omega, M, epsilon, lambda, Omega * xrec{bp}(:,iy));
+                elapsed(a) = elapsed(a) + toc(timer(a));
+            else
+                %error('No such algorithm!');
+            end
+            %
+            % Compare to GAP instead!
+            %x0(:,iy) = xrec{gap}(:,iy);
+            %
+            err{a}(iy)    = norm(x0(:,iy) - xrec{a}(:,iy));
+            relerr{a}(iy) = err{a}(iy) / norm(x0(:,iy));
+        end
+
+        % Update progressbar
+%         if do_progressbar
+%             %frac2 = iy/numvects;
+%             %frac1 = ((iparam-1) + frac2) / count;
+%             if norm(frac2 - 1) < 1e-6
+%                 frac2 = 0;
+%             end
+%             frac2 = frac2 + incr2;
+%             frac1 = frac1 + incr1;
+%             progressbar(frac1, frac2);
+%         end
+    end
+    
+    %--------------------------------
+    % Save results in big stucture & display
+    %--------------------------------
+    % Save reconstructed signals
+    % Save rel & abs errors
+    % Display error
+    results(iparam).xrec = xrec;
+    results(iparam).err = err;
+    results(iparam).relerr = relerr;
+    %
+    %disp(['Simulation no. ' num2str(iparam)]);
+    disp(['Lambda = ' num2str(lambda) ':']);
+    for i = 1:numalgos
+        a = algos(i);
+        if a == gap || a == nesta
+            continue
+        end
+        disp([ algoname{a} ':   avg relative error = ' num2str(mean(relerr{a}))]);
+    end
+end
+
+% =================================
+% Save
+% =================================
+if do_save_mat
+    save(matfilename);
+    disp(['Saved to ' matfilename]);
+end
+
+% =================================
+% Plot
+% =================================
+toplot = zeros(numel(lambdas), numalgos);
+
+relerrs = {results.relerr};
+for i = 1:numalgos
+    for j = 1:numel(lambdas)
+        toplot(j,i) = mean(relerrs{j}{algos(i)});
+    end
+end
+
+%h = plot(toplot);
+h = semilogx(lambdas, toplot);
+legend(algoname{algos})
+xlabel('Lambda')
+ylabel('Average reconstruction error')
+title('Reconstruction error with different algorithms')
+
+if (do_save_figs)
+    saveas(gcf, [figfilename '.fig']);
+    saveas(gcf, [figfilename '.png']);
+    saveTightFigure(gcf, [figfilename '.pdf']);    
+end
+