本征得到未归一化的特征向量

时间:2018-08-17 08:39:56

标签: eigen eigenvalue eigenvector

注意:我可能正在做一些本不该做的事,我的本征知识非常有限,但是找不到我想要的东西。

我目前正在使用本征来获取点云线的方向向量。

//Compute eigenvalues and eigenvectors:
        Eigen::SelfAdjointEigenSolver<Eigen::MatrixXf> eig(scatter);


        Eigen::MatrixXf eigvecs = eig.eigenvectors();

        //largest eigenvalue is yeild at its last column
        b->x = eigvecs(0, 2);
        b->y = eigvecs(1, 2);
        b->z = eigvecs(2, 2);

其中“ b”是定义为以下结构的指针:

typedef struct
{
   double x;
   double y;
   double z;
}3d_point;

使用此“散布”输入:

80.0156 5.29252  2.06179
5.29252 0.489233 0.214055
2.06179 0.214055 3.17522

eigein输出b(线的方向向量):

 b = (0.997452, 0.06653, 0.0268062)

我得到范数等于1的方向向量就足够了。 但是我知道这条线的“全局”起点,所以我希望使用“ b”来获取全局终点,从而获得那条线的长度。

有没有办法获取未归一的b矢量?

================

按照我目前的回答:

Eigen::Vector3d meanV ;
meanV << a->x, a->y, a->z; //a is a 3d_point struct
points.rowwise() -= meanV.transpose(); // with Eigen::MatrixXd points = Eigen::MatrixXd::Zero(700, 3);

,这显然会失败,因为尺寸不匹配:

Eigen::VectorXd projected = eigvecs.col(2).transpose() * points;

我在您的答案中误解了什么?

1 个答案:

答案 0 :(得分:0)

我猜想scatter是在将点与平均值m居中之后计算出来的?然后,您有一条参数线l(t)=m+t*b,其中t的范围从-aa,其中a=sqrt(eig.eigenvalues()(2))。您可以轻松地重新设置参数的大小,以使t的范围为[0,1]。如果需要严格的边界,则需要将点投影到此行上:

VectorXf projected = eigvecs.col(2).transpose() * (points.colwise()-m);

并提取最小值/最大值,然后相应地重新设置行的参数。