我确定某些点是否位于多维椭球内是有问题的。 真正的问题是由潜在的转换(旋转,翻译)引起的,我不知道如何将它们应用到我的计算中。
在我的工作中,我将有一组点,我需要找到最小体积包围椭圆体。然后我将检查其他一组点,并确定它们属于找到的椭圆体。
我决定使用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是旋转矩阵,为您提供椭圆体的方向” 我认为这是我需要使用的最后一个元素才能使我的代码工作。
好的,所以我对我的代码进行了一些更改。 现在我尝试做这样的事情:
假设我有椭圆体的中心及其半径。
对于每一点:
更新位置如下:point = point - center - &gt;换句话说,就像椭圆体使它在点(0,0,... 0)中居一样翻译它
旋转它,好像椭球与所有轴平行:point = invert(V)* point
使用以下公式检查点是否位于椭球内:(point.x / radius.x)^ 2 + ... +(point.i / radius.i)^ 2其中i是维数
如果等式给出结果&lt; = 1,则点位于椭圆内。
这种做法好吗?我的意思是 - 我不知道是否允许我反转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