Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 由协方差矩阵求概率椭圆_C++_Geometry_Eigen3 - Fatal编程技术网

C++ 由协方差矩阵求概率椭圆

C++ 由协方差矩阵求概率椭圆,c++,geometry,eigen3,C++,Geometry,Eigen3,我正试图将我们的数据逆向工程,使其看起来像是概率椭圆。作为输入,我得到一个结构,其中包含一些神秘的成员,特别是meanX、meanY、Co00、Co01和Co10。我猜x和y是椭圆的中心,CoXX是协方差矩阵。听起来我应该用特征值和特征向量来找出椭圆的两个半径。我找到了C++库,但是当我得到向量和值时,我很难想出我要如何计算特征值。如何找到两个半径和椭圆倾斜?让我们: m = (meanX) (meanY) 为(向量)平均值,且: S = (Co00 Co01) (Co01 C

我正试图将我们的数据逆向工程,使其看起来像是概率椭圆。作为输入,我得到一个结构,其中包含一些神秘的成员,特别是meanX、meanY、Co00、Co01和Co10。我猜x和y是椭圆的中心,CoXX是协方差矩阵。听起来我应该用特征值和特征向量来找出椭圆的两个半径。我找到了C++库,但是当我得到向量和值时,我很难想出我要如何计算特征值。如何找到两个半径和椭圆倾斜?

让我们:

m = (meanX)
    (meanY)
为(向量)平均值,且:

S = (Co00 Co01)
    (Co01 Co11)
是数据的协方差矩阵。椭圆的中心是
m
,椭圆的轴是矩阵
S
的特征向量
e1
e2
(短轴
e1
S
的最小特征值相关)。半径与
sqrt(λ1)
sqrt(λ2)
成正比,其中
λ1
λ2
是与
e1
e2
相关的特征值。最后,椭圆的倾斜角度是
atan2(e2_y,e2_x)
(长轴和
x
轴之间的角度)

这一切都来自于对矩阵S进行对角化,并扩展表达式
(X-m)^ts^-1(X-m)=1
,以匹配预期的形式
(X/a)^2+(y/b)^2=1
。请注意,如果要查看特定的置信水平,则应缩放半径,对于95%的置信度,缩放因子为
sqrt(5.911)

对于Eigen,以下代码应该可以工作:

#include <Eigen/Eigenvalues>

// [...]

Vector2d m;
Matrix2d S;

m << meanX, meanY;
S << Co00, Co01, Co01, Co11;

SelfAdjointEigenSolver<Matrix2d> solver(S);
double l1 = solver.eigenvalues().x();
double l2 = solver.eigenvalues().y();
Vector2d e1 = solver.eigenvectors().col(0);
Vector2d e2 = solver.eigenvectors().col(1);

double scale95 = sqrt(5.991);
double R1 = scale95 * sqrt(l1);
double R2 = scale95 * sqrt(l2);
double tilt = atan2(e2.y(), e2.x());
#包括
// [...]
向量m;
矩阵2ds;
mLet:

为(向量)平均值,且:

S = (Co00 Co01)
    (Co01 Co11)
是数据的协方差矩阵。椭圆的中心是
m
,椭圆的轴是矩阵
S
的特征向量
e1
e2
(短轴
e1
S
的最小特征值相关)。半径与
sqrt(λ1)
sqrt(λ2)
成正比,其中
λ1
λ2
是与
e1
e2
相关的特征值。最后,椭圆的倾斜角度是
atan2(e2_y,e2_x)
(长轴和
x
轴之间的角度)

这一切都来自于对矩阵S进行对角化,并扩展表达式
(X-m)^ts^-1(X-m)=1
,以匹配预期的形式
(X/a)^2+(y/b)^2=1
。请注意,如果要查看特定的置信水平,则应缩放半径,对于95%的置信度,缩放因子为
sqrt(5.911)

对于Eigen,以下代码应该可以工作:

#include <Eigen/Eigenvalues>

// [...]

Vector2d m;
Matrix2d S;

m << meanX, meanY;
S << Co00, Co01, Co01, Co11;

SelfAdjointEigenSolver<Matrix2d> solver(S);
double l1 = solver.eigenvalues().x();
double l2 = solver.eigenvalues().y();
Vector2d e1 = solver.eigenvectors().col(0);
Vector2d e2 = solver.eigenvectors().col(1);

double scale95 = sqrt(5.991);
double R1 = scale95 * sqrt(l1);
double R2 = scale95 * sqrt(l2);
double tilt = atan2(e2.y(), e2.x());
#包括
// [...]
向量m;
矩阵2ds;

m你就是那个人!看起来它可以工作,并提供与OpenCV相同的输出。非常感谢。我认为在计算倾斜度之前最好添加特征值(l1,l2)比较,因为弧度值是基于对应于最大特征值的特征向量计算的;如果(l2>=l1){double tilt=atan2(e2.y(),e2.x());}或者{double tilt=atan2(e1.y(),e1.x());}你就是那个人!看起来它可以工作,并提供与OpenCV相同的输出。非常感谢。我认为在计算倾斜度之前最好添加特征值(l1,l2)比较,因为弧度值是基于对应于最大特征值的特征向量计算的;如果(l2>=l1){double tilt=atan2(e2.y(),e2.x());}其他{double tilt=atan2(e1.y(),e1.x());}