【问题标题】:eigen; get not normalized eigenvector本征;得到未归一化的特征向量
【发布时间】:2019-01-24 06:23:27
【问题描述】:

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

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

//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;

我在你的回答中误解了什么?

【问题讨论】:

    标签: eigen eigenvalue eigenvector


    【解决方案1】:

    我猜scatter 是在将点与平均值m 居中后计算出来的?然后你有一条参数线l(t)=m+t*bt 大致从-aaa=sqrt(eig.eigenvalues()(2))。如果您愿意,您可以轻松地对其进行重新参数化,以便 t 范围在 [0,1] 中。如果你想要严格的界限,那么你需要将点投影到这条线上:

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

    并提取最小值/最大值,然后相应地重新参数化您的线。

    【讨论】:

    • 由于英语不是我的强项,我遇到了语义问题,您能否提供更多有关本征和数学新手的逻辑路径的详细信息? (你对 scatter 的起源是正确的);
    • 1) 我不知道“点”应该是什么。 2) 如果点是我的 3dpoints 矩阵 Nx3,则 * 运算符的维度不匹配。 3) 如果点是 Nx3 矩阵维度,则与减号运算符不匹配
    • 在我的示例中,points3xN,如果您按行存储它们,只需进行转置即可。
    猜你喜欢
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 2016-06-07
    相关资源
    最近更新 更多