X = np.random.rand(m, n) U, S, Vt = np.linalg.svd(X, full_matrices=False) U = U[:, :k] S = S[:k] Vt = Vt[:k, :] grad_f = grad(f) grad_g = grad(g) man = FixedRankEmbedded(m, n, k) dU, dS, dVt = grad_g((U, S, Vt)) Up, M, Vp = man.egrad2rgrad((U, S, Vt), (dU, dS, dVt)) U_, S_, V_ = man.tangent2ambient((U, S, Vt), (Up, M, Vp)) tangent_grad = U_.dot(S_).dot(V_.T) print print print 'X:' print X print print 'U,S,Vt:' print U, S, Vt print print 'f(X):' print f(X) print