function B = makeposdef(A) [V,E] = eig(A); E = diag(E); ii = find(E>0); V = V(:,ii); D = diag(E(ii)); B = V * D * V'; B = (B+B')/2; B = B + eye(size(B)); return B = sqrtm(A*A); B = real(B); B = (B+B')/2; %I = eye(size(B)); %B = B + 10*I; return f = eps; I = eye(size(A)); lmin0 = min(eig(A)); while 1 lmin = min(eig(A+(1+f)*abs(lmin0)*I)); if lmin < 0 f = f*2; else break end end B = A+(1+f)*abs(lmin0)*I; return [V,E] = eig(A); E = diag(E); keyboard ii = find(E>0); V = V(:,ii); D = diag(E(ii)); B = V * D * V'; B = (B+B')/2; return [V,E] = eig(A); E = diag(E); E = max(E,eps); D = diag(E); B = V * D * V'; keyboard