# Confused about det_rootn; what does it do?

Given a pos. def. matrix X, I thought that det_rootn(X) = det(X)^(1/n) . Am I wrong about this as it does not seem to work.

Can you show a reproducible example (along with output of `cvx_version` ) or other evidence of `det_rootn` not complying with the documentation?

Note that there are two versions of `det_rootn`, one for numerical arguments and one for cvx_expression arguments.

Here is the documentation:

help det_rootn

det_rootn nth-root of the determinant of an SPD matrix.
For a square matrix X, det_rootn(X) returns
POW(DET(X),1/(size(X,1))
if X is symmetric (real) or Hermitian (complex) and positive semidefinite,
and -Inf otherwise.

``````This function can be used in many convex optimization problems that call for
LOG(DET(X)) instead. For example, if the objective function contains nothing
but LOG(DET(X)), it can be replaced with det_rootn(X), and the same optimal
point will be produced.

Disciplined convex programming information:
det_rootn is concave and nonmonotonic; therefore, when used in
CVX specifications, its argument must be affine.
``````

n=10;
r = 5;
d = rand(n,1)+.1;
V = randn(n,4);
n = length(V);
VdV = V’*diag(d)*V;
VdV = (VdV+VdV’)/2;
detVdV = det_rootn(VdV);
eigsvdv = eig(VdV);
detVdVprod = prod(eigsvdv.^(1/n));
deterror = abs(detVdV-detVdVprod);
if deterror > 1e-12
fprintf(‘detVdV??? %g \n’,deterror)
end

whenever I run this I get errors of e.g. order 2-3 i.e. VERY large errors. Am I missing something?
X = VdV here. I am using the product (eig.^(1/n))

there was a typo there i think … this is what i cut-n-paste and get

n=10;
r = 5;
d = rand(n,1)+.1;
V = randn(n,r);
n = length(V);
VdV = V’*diag(d)*V;
VdV = (VdV+VdV’)/2;
detVdV = det_rootn(VdV);
eigsvdv = eig(VdV);
detVdVprod = prod(eigsvdv.^(1/n));
deterror = abs(detVdV-detVdVprod);
if deterror > 1e-12
fprintf(‘detVdV??? %g \n’,deterror)
end
detVdV??? 1.91185

p.s. You say there are two versions of det_rootn ? Do they do different things? What is the algorithm for the calculation? Note that (det(X)^(1/n)) will give terrible results as det(X) is too large for even moderate size X and so the round-off makes the result meaningless. But using the product of eigs rooted does not suffer frmo this problem.

`VdV` is r by r, not n by n.

If you change to `detVdVprod = prod(eigsvdv.^(1/r));` everything agrees.

As can be seen by examining the source code, if `chol(X)` exists, det_rootn is calculated as the square of `geo_mean` applied to the diagonal of the Cholesky factor; otherwise it’s calulated as `geo_mean(eig(X))`.

Numerical argument version is at
`CVX/functions/det_rootn.m`

CXV expression version is at
`CVX/functions/@cvx/det_rootn.m`