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 aris@219: % param - structure containing additional parameters. These are: aris@219: % - initcoeff Initial guess for the coefficients aris@219: % (optional) aris@219: % - to 1/(step size). It is larger than spectral norm aris@219: % of dictionary A (default is 0.1+(svds(A,1))^2) aris@219: % - lambda Lagrangian multiplier. Regulates shrinkage aris@219: % (default is 0.4) aris@219: % - iternum Inner-loop maximum iteration number aris@219: % (default is 1000) aris@219: % - epsilon Stopping criterion for iterative softthresholding aris@219: % (default is 1e-7) aris@219: % - map Debiasing. 0 = No, 1 = Yes (default is 0) aris@219: % ivan@155: % Output: ivan@155: % x - sparse solution ivan@155: % cost - Objective cost ivan@155: aris@219: % 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