《PCL点云库学习&VS2010(X64)》Part 43 协方差矩阵的特征向量

《PCL点云库学习&VS2010(X64)》Part 43 协方差矩阵的特征向量


对协方差矩阵的特征向量最直观的解释之一是它总是指向数据方差最大的方向。

更准确地说,第一特征向量是数据方差最大的方向,第二特征向量是与第一特征向量垂直的方向上数据方差最大的方向,第三特征向量是与第一和第二特征向量垂直的方向上数据方差最大的方向,以此类推。

下图是二维空间的一个例子:



每个数据样本都是可以用坐标x、y表示的二维点。这些数据样本的协方差矩阵的特征向量是u和v。较长的u是第一特征向量,较短的v是第二特征向量。特征值的大小用箭头的长度表示。我们可以看到,第一个特征向量(从数据的平均值)指向欧几里德空间中数据方差最大的方向,第二个特征向量跟第一特征向量是垂直的。

三维空间中的特征向量就比较复杂,如图所示:


我们假设所有的数据点都在椭圆体内。v1是第一特征向量,λ1是其相应的特征值,指向数据方差最大的方向。v2与v1垂直,是这个方向上数据方差最大的特征向量。v3与v1和v2都垂直,是这个方向上数据方差最大的特征向量,虽然只有这一个方向。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

根据上述可知,其数学上的意义很明了,λ1为其方差最大的方向,而方差最小的方方向肯定是与该方向垂直的,在空间中表现出来的物理意义也就很明显了,必定为其法线方向。

那么λ2与λ3哪一个是最小值呢,即哪一个λ对应的才是法线方向呢?两者中的最小值所对应的特征向量为其法线方向。因此在用Eigen矩阵求解时,一般会对特征值做一个排序(升序排列),最小的那个特征值(第一个特征值)为法线方向所对应的特征值,其特征向量表示法线方向。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

对于三维空间点云而言,利用Eigen求解协方差矩阵后,特征值(向量)以升序方式排列,

Eigen::MatrixXd covMat = computeCovarianceMatrix();

Eigen::Matrix3d A = covMat;

Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> es;

es.compute(A);

//特征值特征向量以升o序排列

const auto& = eVec = es.eigenvectors();

//获取法向量

m_IsPlaneVector[2] = Eigen::Vector3d(eVec.col(0).data());//最小特征(值)向量,特征向量第一列,为点云的法向量

m_IsPlaneVector[0] = Eigen::Vector3d(eVec.col(2).data());//最大特征(值)向量


注:

1、得到的向量向量m_IsPlaneVector[2]为法线方向的特征向量,m_IsPlaneVector定义为Eigen::Vector3dm_IsPlaneVector[3] ,是二维数组,因此x、y、z中的法线分别对应为:

m_IsPlaneVector[2][0]

m_IsPlaneVector[2][1]

m_IsPlaneVector[2][2]

2、一般需要对特征向量v1,v2,v3归一化处理,一般先分别归一化其中两个,另外一个通过叉乘得到。



猜你喜欢

转载自blog.csdn.net/sinat_24206709/article/details/77744591