Just by pure reverse engineering (I'm not familiar anymore with this material), I can do this:
%// Generate circle
R = 189;
t = linspace(0, 2*pi, 1000).';
x = R*cos(t);
y = R*sin(t);
%// Find the radius?
[~,L] = eig( cov([x,y]) );
%// ...hmm, seems off by a factor of sqrt(2)
2*sqrt( diag(L) )
%// so it would come out right when I'd include a factor of 1/2 in the sqrt():
2*sqrt( diag(L)/2 )
So, let's test that theory for general ellipses:
%// Random radii
a1 = 1000*rand;
a2 = 1000*rand;
%// Random rotation matrix
R = @(a)[
+cos(a) +sin(a);
-sin(a) +cos(a)];
%// Generate pionts on the ellipse
t = linspace(0, 2*pi, 1000).';
xy = [a1*cos(t) a2*sin(t);] * R(rand);
%// Find the deviation from the known radii
%// (taking care of that the ordering may be different)
[~,L] = eig(cov(xy));
min(abs(1-bsxfun(@rdivide, 2*sqrt( diag(L)/2 ), [a1 a2; a2 a1])),[],2)
which always returns something acceptably small.
So, seems to work :) Can anyone verify that this is indeed correct?
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…