Covariance Matrix of an Ellipse

后端 未结 2 1657
闹比i
闹比i 2021-01-05 06:47

I\'ve been trying to solve a problem. I\'m surprised I haven\'t been able to find anything really useful on the net.

I know that from the eigenvalues of the covarian

2条回答
  •  有刺的猬
    2021-01-05 07:22

    To expand on Rody's answer, the covariance matrix for a solid ellipse has eigenvalues given by lambda_i = r_i^2/4. This leads to OP's equation of r_i = 2*sqrt(lambda_i).

    For a (non-solid) ellipse, as in the OP's case, the eigenvalues are double those of the solid case: lambda_i = r_i^2/2, leading to r_i = sqrt(2*lambda_i) (which is equal to Rody's 2*sqrt(lambda_i/2)).

    I could not directly find a reference for this, but the math of the covariance matrix is identical to that of the moments of inertia. On Wikipedia you can see the case of the "circular hoop" and "solid disk", which differ by the same factor of 2.

    Here is an adaptation of Rody's test, doing both the solid and the non-solid cases:

    % Radius to test with
    r = rand(1,2);
    
    % Random rotation matrix
    R = @(a)[+cos(a) +sin(a); 
             -sin(a) +cos(a)];
    
    % Generate pionts on the ellipse
    N = 1000;
    t = linspace(0, 2*pi, N).';
    xy = r.*[cos(t),sin(t)] * R(rand);
    % Compute radii, compare to known radii
    L = eig(cov(xy));
    r_ = sqrt(2*L)';
    err = max(abs(1 - sort(r_) ./ sort(r)))
    
    % Generate points in the ellipse (SOLID CASE)
    N = 10000;
    t = 2*pi * rand(N,1);
    xy = r .* sqrt(rand(N,1)) .* [cos(t),sin(t)] * R(rand);
    % Compute radii, compare to known radii
    L = eig(cov(xy));
    r_ = 2*sqrt(L)';
    err_solid = max(abs(1 - sort(r_) ./ sort(r)))
    

    If you run this code, you'll see errors of 1e-3 and ~6e-3 (for the solid case I generate many more points, as the area needs more points to be sampled densely enough; the more points, the smaller the error).

提交回复
热议问题