function [B]   =  FPN_updata(I, X, svdMethod, opts )

rank_B = 5;

for iter = 1:opts.Innerloop_B
%% B-subproblem

    switch lower(svdMethod)
        case 'svdlibc'
            [U, diagS, V] = svdlibc(I- X, rank_B+1);
        case 'propack'
            [U,S,V] = lansvd(I- X,rank_FPN+1,'L');
            diagS = diag(S);
        case 'svds'
            [U, S, V] = svds(I- X, rank_B+1, 'L');
            diagS = diag(S);
        otherwise            
            [U,S,V] = svd(I- X,0);            
            diagS = diag(S);            
    end
    
    temp    = (diagS-opts.tau).*double( (diagS-opts.tau) > 0 );
    B       = U * diag(temp) * V';
    rank_B   = sum(diagS>opts.tau);
end
