【发布时间】:2015-12-21 17:49:54
【问题描述】:
我无法确定某些点是否位于多维椭球内。 真正的问题是由潜在的转换(旋转、平移)引起的,我不知道如何将它们应用到我的计算中。
在我的工作中,我将有一组点,我需要为这些点找到包围椭圆体的最小体积。然后我将不得不检查其他点集并确定其中哪些属于找到的椭球体。
我决定使用来自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 是旋转矩阵,为您提供椭圆体的方向” 我认为这是我的代码需要使用的最后一个元素。
我的方法
好的,所以我对我的代码进行了一些更改。 现在我尝试做这样的事情:
假设我有椭球的中心和它的半径。
对于每一点:
如下更新位置:点 = 点 - 中心 -> 换句话说,将其转换为椭圆体的中心在点 (0, 0, ... 0)
像椭球平行于所有轴一样旋转它:point = invert(V) * point
使用等式检查点是否位于椭圆体内:(point.x / radius.x)^2 + ... + (point.i / radius.i)^2 其中 i 是维数
如果方程给出的结果
这种方法好吗?我的意思是 - 我不知道是否允许我反转 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
【问题讨论】:
-
详细信息在哪里?你用的是什么方程?它是轴对齐的椭球体吗?您一直在尝试调试什么问题?我会使用视觉检查的正确性,比如做一组随机点 3D 图,并通过你的谓词函数为一些测试椭球设置它们的颜色......在那里你应该直接看到什么是错的......你也可以将椭球图添加到看看你的谓词是否符合预期
-
我的问题的哪一部分您不清楚?我试图确定某个点是否属于找到的椭球。在我提供的 matlab 代码中,我找到了 3d 空间中 8 个点的最小体积封闭椭球。可视化可以在描述中前面提供的链接中找到。
-
这并不是说任务没有明确说明......问题是你没有描述你是如何解决这个问题的,以及你目前的方法到底有多错误。如果您按照我的建议进行可视化,您将看到您的谓词在椭球内部究竟考虑了什么,因此更容易推断出什么是错误的......
-
现在怎么样?我更新了我的方法部分。
-
有 NO 理由关闭此问题。对于那些不懂数学的人,请走开。您不需要关闭我们这些懂数学的人可以回答的问题。