检查点是否位于多维椭圆体内

时间:2015-12-19 23:27:18

标签: matlab math algebra

我确定某些点是否位于多维椭球内是有问题的。 真正的问题是由潜在的转换(旋转,翻译)引起的,我不知道如何将它们应用到我的计算中。

在我的工作中,我将有一组点,我需要找到最小体积包围椭圆体。然后我将检查其他一组点,并确定它们属于找到的椭圆体。

我决定使用here中的代码:

function [] = Checkup()
points  = [[ 0.53135758, -0.25818091, -0.32382715] 
    [ 0.58368177, -0.3286576,  -0.23854156,] 
    [ 0.18741533,  0.03066228, -0.94294771] 
    [ 0.65685862, -0.09220681, -0.60347573]
    [ 0.63137604, -0.22978685, -0.27479238]
    [ 0.59683195, -0.15111101, -0.40536606]
    [ 0.68646128,  0.0046802,  -0.68407367]
    [ 0.62311759,  0.0101013,  -0.75863324]];
P = points\'; % <- remove the \ symbol here
dimen = length(P(:,1));

% c - vector with ellipse centers
[A, c] = MinVolEllipse(P, 0.01);
[~, Q, V] = svd(A);
radiuses = 1:dimen;

% Calculate radiuses
for i = 1:dimen
    radiuses(1, i) = 1 / sqrt(Q(i,i));
end

% Check if points lie within ellipse and print Ok for every point inside ellipsoid
for i = 1:length(P(1,:)) % length(P(1,:)) is number of points
    value = 0;
    for j = 1:dimen
        %adding ((p_i - c_i) / (r_i))^2 value
        value = value + ( ( (P(j,i) - c(j, 1) )^2 ) / (radiuses(1, j)^2));

    end
    if value <= 1
        disp('Ok')
    end
end

现在这段代码不会打印Ok文本(但应该打印8次)。

根据this:“V是旋转矩阵,为您提供椭圆体的方向” 我认为这是我需要使用的最后一个元素才能使我的代码工作。

我的方法

好的,所以我对我的代码进行了一些更改。 现在我尝试做这样的事情:

假设我有椭圆体的中心及其半径。

对于每一点:

  1. 更新位置如下:point = point - center - &gt;换句话说,就像椭圆体使它在点(0,0,... 0)中居一样翻译它

  2. 旋转它,好像椭球与所有轴平行:point = invert(V)* point

  3. 使用以下公式检查点是否位于椭球内:(point.x / radius.x)^ 2 + ... +(point.i / radius.i)^ 2其中i是维数

  4. 如果等式给出结果&lt; = 1,则点位于椭圆内。

  5. 这种做法好吗?我的意思是 - 我不知道是否允许我反转V矩阵并使用它就好像它反转了之前的旋转......

    正确的解决方案

    看起来我提出的方法很好但有一个更好:

    function [result] = Ellipse()
    % Returns vector consisting of 10 entries
    % that represent error ratio for every test set 
    
    result = 0:9;
    
    % Run tests for all point sets
    for pointSet = 0:9
        [Ptraining, Ptest] = LoadPointSet(pointSet);
        count = 0;
    
        % c - vector with ellipse centers
        [A, c] = MinVolEllipse(Ptraining, 0.00001);
    
        % Check if points lie within ellipse
        for i = 1:length(Ptest(1,:)) % length(P(1,:)) is number of points
            pp = Ptest(:, i) - c;
            value = pp' * A * pp;    
            if value > 1
                count = count + 1;
            end
        end
    
        % Get the error ratio
        index = pointSet + 1;
        result(index) = count / length(Ptest(1,:));
    end
    
    end
    

0 个答案:

没有答案