⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oneprojectormex.m

📁 Spectral Projected L1 solver
💻 M
字号:
function [x, itn] = oneProjectorMex(b,d,tau)% [x, itn] = oneProjectorMex(b,d,tau) % Return the orthogonal projection of the vector b >=0 onto the% (weighted) L1 ball. In case vector d is specified, matrix D is% defined as diag(d), otherwise the identity matrix is used.%% On exit,% x      solves   minimize  ||b-x||_2  st  ||Dx||_1 <= tau.% itn    is the number of elements of b that were thresholded.%% See also spgl1, oneProjector.%   oneProjectorMex.m%   $Id$%%   ----------------------------------------------------------------------%   This file is part of SPGL1 (Spectral Projected Gradient for L1).%%   Copyright (C) 2007 Ewout van den Berg and Michael P. Friedlander,%   Department of Computer Science, University of British Columbia, Canada.%   All rights reserved. E-mail: <{ewout78,mpf}@cs.ubc.ca>.%%   SPGL1 is free software; you can redistribute it and/or modify it%   under the terms of the GNU Lesser General Public License as%   published by the Free Software Foundation; either version 2.1 of the%   License, or (at your option) any later version.%%   SPGL1 is distributed in the hope that it will be useful, but WITHOUT%   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY%   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General%   Public License for more details.%%   You should have received a copy of the GNU Lesser General Public%   License along with SPGL1; if not, write to the Free Software%   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301%   USA%   ----------------------------------------------------------------------if nargin < 3   tau = d;   d   = 1;endif isscalar(d)  [x,itn] = oneProjectorMex_I(b,tau/abs(d));else  [x,itn] = oneProjectorMex_D(b,d,tau);endend % function oneProjectorMex% ----------------------------------------------------------------------function [x,itn] = oneProjectorMex_I(b,tau)% ----------------------------------------------------------------------   % Initialization   n     = length(b);   x     = zeros(n,1);   bNorm = norm(b,1);   % Check for quick exit.   if (tau >= bNorm), x = b; itn = 0; return; end   if (tau <  eps  ),        itn = 0; return; end   % Preprocessing (b is assumed to be >= 0)   [b,idx] = sort(b,'descend'); % Descending.   csb       = -tau;   alphaPrev = 0;   for j= 1:n      csb       = csb + b(j);      alpha     = csb / j;         % We are done as soon as the constraint can be satisfied      % without exceeding the current minimum value of b      if alpha >= b(j)         break;      end         alphaPrev = alpha;   end   % Set the solution by applying soft-thresholding with   % the previous value of alpha   x(idx) = max(0,b - alphaPrev);   % Set number of iterations   itn = j;end% ----------------------------------------------------------------------function [x,itn] = oneProjectorMex_D(b,d,tau)% ----------------------------------------------------------------------   % Initialization   n = length(b);   x = zeros(n,1);   % Check for quick exit.   if (tau >= norm(d.*b,1)), x = b; itn = 0; return; end   if (tau <  eps         ),        itn = 0; return; end   % Preprocessing (b is assumed to be >= 0)   [bd,idx] = sort(b ./ d,'descend'); % Descending.   b  = b(idx);   d  = d(idx);   % Optimize   csdb = 0; csd2 = 0;   soft = 0; alpha1 = 0; i = 1;   while (i <= n)      csdb = csdb + d(i).*b(i);      csd2 = csd2 + d(i).*d(i);        alpha1 = (csdb - tau) / csd2;      alpha2 = bd(i);      if alpha1 >= alpha2         break;      end          soft = alpha1;  i = i + 1;   end   x(idx(1:i-1)) = b(1:i-1) - d(1:i-1) * max(0,soft);   % Set number of iterations   itn = i;end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -