ivan@155: function [X , cost] = wrapper_mm_solver(b, A, param) aris@211: %% SMALL wrapper for Majorization Minimization toolbox solver ivan@155: % ivan@155: % Function gets as input ivan@155: % b - measurement vector ivan@155: % A - dictionary ivan@155: % param - structure containing additional parameters ivan@155: % Output: ivan@155: % x - sparse solution ivan@155: % cost - Objective cost ivan@155: ivan@155: % Centre for Digital Music, Queen Mary, University of London. ivan@155: % This file copyright 2011 Ivan Damnjanovic. ivan@155: % ivan@155: % This program is free software; you can redistribute it and/or ivan@155: % modify it under the terms of the GNU General Public License as ivan@155: % published by the Free Software Foundation; either version 2 of the ivan@155: % License, or (at your option) any later version. See the file ivan@155: % COPYING included with this distribution for more information. ivan@155: % ivan@155: %% ivan@155: ivan@155: % Initial guess for the coefficients ivan@155: ivan@155: if (isfield(param, 'initcoeff')) ivan@155: initX = param.initcoeff; ivan@155: else ivan@155: initX = zeros(size(A,2),size(b,2)); ivan@155: end ivan@155: ivan@155: % to - 1/(step size) . It is larger than spectral norm of dictionary A ivan@155: ivan@155: if isfield(param, 'to') ivan@155: to = param.to; ivan@155: else ivan@161: to = .1+(svds(A,1))^2; ivan@155: end ivan@155: ivan@155: % lambda - Lagrangian multiplier. (regulates shrinkage) ivan@155: ivan@155: if isfield(param, 'lambda') ivan@155: lambda = param.lambda; ivan@155: else ivan@155: lambda = 2*.2; ivan@155: end ivan@155: ivan@155: % Inner-loop maximum iteration number. ivan@155: ivan@155: if isfield(param, 'iternum') ivan@155: maxIT = param.iternum; ivan@155: else ivan@155: maxIT = 1000; ivan@155: end ivan@155: ivan@155: % Stopping criterion for iterative softthresholding ivan@155: ivan@155: if isfield(param, 'epsilon') ivan@155: epsilon = param.epsilon; ivan@155: else ivan@155: epsilon = 1e-7; ivan@155: end ivan@155: ivan@155: % Debiasing. 0 = No, 1 = Yes ivan@155: ivan@155: if isfield(param, 'map') ivan@155: map = param.map; ivan@155: else ivan@161: map = 0; ivan@155: end ivan@155: ivan@155: ivan@155: [X, cost] = mm1(A,b,initX,to,lambda,maxIT,epsilon,map); ivan@155: cost ivan@155: end