diff --git a/complete.m b/complete.m
index 4f433c213035a554ee6190b4653db808090e50ac..3f3d93591cd0295e8f1581997bc23e0822fa8016 100644
--- a/complete.m
+++ b/complete.m
@@ -6,8 +6,8 @@ Dir = mfilename('fullpath');
 Dir = fileparts(Dir); 
 addpath(genpath(fullfile(Dir,'LRTC')));
 
-p = inputParser;
-p.addOptional('Method', 'rank', @ischar);
+p = inputParser; p.StructExpand = true; p.KeepUnmatched = true;
+p.addParameter('Method', 'rank', @ischar);
 p.parse(varargin{:});
 
 Method = p.Results.Method;
@@ -22,20 +22,23 @@ switch Method
         error('Unknown completion method');
 end
 
-p.addOptional('alpha'               , alpha               , @isnumeric);
-p.addOptional('betaMult'            , betaMult            , @isnumeric);
-p.addOptional('maxIter'             , maxIter             , @isnumeric);
-p.addOptional('epsilon'             , epsilon             , @isnumeric);
-p.addOptional('TraceNormToRankParam', TraceNormToRankParam, @isnumeric);
+Mask = ~isnan(M);
+
+p.addParameter('Mask'                , Mask                , @islogical);
+p.addParameter('alpha'               , alpha               , @isnumeric);
+p.addParameter('betaMult'            , betaMult            , @isnumeric);
+p.addParameter('maxIter'             , maxIter             , @isnumeric);
+p.addParameter('epsilon'             , epsilon             , @isnumeric);
+p.addParameter('TraceNormToRankParam', TraceNormToRankParam, @isnumeric);
 p.parse(varargin{:});
 
+Mask                 = p.Results.Mask;
 alpha                = p.Results.alpha;
 betaMult             = p.Results.betaMult;
 maxIter              = p.Results.maxIter;
 epsilon              = p.Results.epsilon;
 TraceNormToRankParam = p.Results.TraceNormToRankParam;
 
-Mask = ~isnan(M);
 M(~Mask) = 0;
 
 M = LRTCADMrho(M,Mask,alpha,betaMult,maxIter,epsilon,TraceNormToRankParam);