0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019 function [X,Z,Y,fval,gval]=matrix_adm(X, I, Bv, lambda, eta, tol, verbose)
0020
0021 if ~exist('tol','var')
0022 tol=1e-3;
0023 end
0024
0025 if ~exist('verbose','var')
0026 verbose=0;
0027 end
0028
0029 sz=size(X);
0030
0031 m=length(Bv);
0032
0033
0034 Z=zeros(size(X));
0035 Y=zeros(size(X));
0036
0037 B=zeros(sz);
0038 ind=sub2ind(sz,I{:});
0039 B(ind)=Bv;
0040
0041 nsv=10;
0042 kk=1;
0043 while 1
0044 if lambda>0
0045 X = (B/lambda+eta*Z-Y)./((B~=0)/lambda+eta);
0046 else
0047 X=Z-Y/eta;
0048 X(ind)=Bv;
0049 end
0050
0051 Z0=Z;
0052 [Z,ss,nsv]=softth(X+Y/eta,1/eta,nsv);
0053
0054 Y=Y+eta*(X-Z);
0055
0056 viol = norm(X(:)-Z(:));
0057
0058
0059 fval(kk)=sum(svd(X));
0060 if lambda>0
0061 fval(kk)=fval(kk)+0.5*sum((X(ind)-Bv).^2)/lambda;
0062 end
0063
0064 gval(kk)=eta*norm(Z(:)-Z0(:));
0065
0066 if verbose
0067 fprintf('[%d] fval=%g gval=%g viol=%g\n', kk, fval(kk), gval(kk), ...
0068 viol);
0069 end
0070
0071
0072 if gval(kk)<tol && viol<tol
0073 break;
0074 end
0075
0076 if kk>2000;
0077 break;
0078 end
0079
0080 kk=kk+1;
0081 end
0082
0083 fprintf('[%d] fval=%g gval=%g viol=%g\n', kk, fval(kk), gval(kk), ...
0084 viol);