function [H,e,t]=func(A,H,maxiter,timelimit)
  t0   = cputime;
  Â
  [n,r] = size(H);
  e = []; t = [];
  iter = 1; x = zeros(1,4);
  if nargin < 3, maxiter  = 100; end
  if nargin < 4, timelimit = 60;  end  Â
  HHt = H*H';
  scaling = sum(sum(A.*HHt))/sum(sum(HHt.*HHt));
  H  = sqrt(scaling)*H;Â
  while iter <= maxiter && cputime-t0 <= timelimit
    R  = A-H*H';  Â
    for k=1:r
      R  = R+H(:,k)*H(:,k)';
      dR = diag(R);     Â
      HtH = H(:,k)'*H(:,k);      Â
      for i=1:n        Â
        HtH = HtH-H(i,k)^2 ;
        a  = HtH-dR(i);
        b  = -(H(:,k)'*R(:,i) - H(i,k)*dR(i));
        Delta = 4*a^3+27*(b)^2;
        d = 0.5*(-b+sqrt(Delta/27));
        if Delta <= 0Â
          r3  = 2*(abs(d)^(1/3));Â
          th3  = angle(d)/3;    Â
          x(2) = r3*cos(th3);
          x(3) = r3*cos(th3+(2*pi/3));
          x(4) = r3*cos(th3+(4*pi/3));
          x    = x(x>=0);
          [~,ind] = min(x.^4/4+a*x.^2/2 + b*x);
          H(i,k)  = x(ind);
          HtH   = HtH + H(i,k)^2;
        else
          z    = sign(d)*(abs(d))^(1/3);
          val   = z-a/(3*z);
          if val.^4/4+a*val.^2/2 + b*val<0 && val >= 0
            HtH   = HtH + val^2;
            H(i,k) = val;
          else
            H(i,k) = 0;
          end
        end
      end
      R=R-H(:,k)*H(:,k)';
    end
    if nargout >=2
      t = [t cputime-t0];
      e = [e 0.5*norm(A-H*H','fro')^2];
    end
    iter = iter + 1;
  end
end