Home > release > matrix_adm.m

matrix_adm

PURPOSE ^

MATRIX_ADM - Computes reconstruction of a partly observed matrix

SYNOPSIS ^

function [X,Z,Y,fval,gval]=matrix_adm(X, I, Bv, lambda, eta, tol, verbose)

DESCRIPTION ^

 MATRIX_ADM - Computes reconstruction of a partly observed matrix

 Syntax
  function [X,Z,Y,fval,gval]=matrix_adm(X, I, Bv, lambda, eta, tol, verbose)

 See also
  TENSOR_AS_MATRIX

 Reference
 "On the extension of trace norm to tensors"
 Ryota Tomioka, Kohei Hayashi, and Hisashi Kashima
 arXiv:1010.0789
 http://arxiv.org/abs/1010.0789

 Copyright(c) 2010 Ryota Tomioka
 This software is distributed under the MIT license. See license.txt

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 % MATRIX_ADM - Computes reconstruction of a partly observed matrix
0002 %
0003 % Syntax
0004 %  function [X,Z,Y,fval,gval]=matrix_adm(X, I, Bv, lambda, eta, tol, verbose)
0005 %
0006 % See also
0007 %  TENSOR_AS_MATRIX
0008 %
0009 % Reference
0010 % "On the extension of trace norm to tensors"
0011 % Ryota Tomioka, Kohei Hayashi, and Hisashi Kashima
0012 % arXiv:1010.0789
0013 % http://arxiv.org/abs/1010.0789
0014 %
0015 % Copyright(c) 2010 Ryota Tomioka
0016 % This software is distributed under the MIT license. See license.txt
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(:)); %norm(G(:));
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);

Generated on Wed 22-Dec-2010 16:09:20 by m2html © 2003