注意:我可能正在做一些本不该做的事,我的本征知识非常有限,但是找不到我想要的东西。
我目前正在使用本征来获取点云线的方向向量。
//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;
我在您的答案中误解了什么?
答案 0 :(得分:0)
我猜想scatter
是在将点与平均值m
居中之后计算出来的?然后,您有一条参数线l(t)=m+t*b
,其中t
的范围从-a
到a
,其中a=sqrt(eig.eigenvalues()(2))
。您可以轻松地重新设置参数的大小,以使t
的范围为[0,1]
。如果需要严格的边界,则需要将点投影到此行上:
VectorXf projected = eigvecs.col(2).transpose() * (points.colwise()-m);
并提取最小值/最大值,然后相应地重新设置行的参数。