function [X, k] = care_sign(A, G, Q) n = size(A); J = [zeros(n) eye(n); -eye(n) zeros(n)]; Z = [-Q -A'; -A G]; err = inf; k = 0; while err >= 1e-15 Zold = Z; Z = 1/2*(Z + J*inv(Z)*J); % the products with J could be replaced % with direct block reordering, for % better performance err = norm(Zold - Z) / norm(Z); k = k + 1; end U = null(Z + J); X = U(n+1:2*n, 1:n) / U(1:n, 1:n);