Transform :: linear()在Eigen库中返回什么?

时间:2016-02-15 18:49:25

标签: matrix linear-algebra eigen

使用Eigen C ++库,我无法理解Transform::linear()函数。根据文档,它返回the linear part of the transformation。但是,这是什么意思?当然所有的矩阵变换都是线性的?

此外,从其他地方看到一些例子,似乎它返回的值是Eigen::Matrix3d(或者可以隐式转换为此值)。对我而言,这表明它可能只返回转换的旋转部分,其长度为3(x,y和z)。但是,还有一个Transform::rotation()函数,根据文档返回the rotation part of the transformation

那么有人可以向我解释Transform::linear()实际返回的内容吗?

2 个答案:

答案 0 :(得分:1)

Transform表示使用同质微积分的仿射变换或投影变换。例如,仿射变换A由线性部分L和翻译t组成,因此将p转换为A相当于:

 p' = L * p + t

使用同源载体:

 [p'] = [L t] * [p] = A * [p]
 [1 ]   [0 1]   [1]       [1]

使用:

 A = [L t]
     [0 1]

因此线性部分对应于同质矩阵表示的左上角。它对应于旋转,缩放和剪切的混合。

答案 1 :(得分:1)

遇到相同的问题,我想添加以下信息:

如@ggael所述,Transform::linear()直接返回变换矩阵中的线性部分。

Transform::rotation()返回线性部分的旋转分量 。但是由于线性部分包含not only rotation but also reflection, shear and scaling,因此提取旋转旋转并不是直接的,需要使用奇异值分解(SVD)进行计算。

在通常的情况下,已知仿射矩阵仅包含旋转和平移,那么Transform::linear()可用于有效访问旋转部分。

最后,如果将Transform的{​​{1}}模板参数设置为Mode,则Eigen将仅假设旋转和平移,并优化逆变换的计算。在这种情况下,最新版本的Eigen还将优化Isometry,并直接返回线性部分。但是请注意,没有等距仿射矩阵的紧凑版本,其中不存储最后一行并假定其为[0 ... 0 1]。