【问题标题】:What does Transform::linear() return in the Eigen library?Transform::linear() 在 Eigen 库中返回什么?
【发布时间】:2016-02-15 18:49:24
【问题描述】:

使用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() 实际返回的内容吗?

【问题讨论】:

    标签: matrix linear-algebra eigen


    【解决方案1】:

    遇到同样的问题,我想补充以下信息:

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

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

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

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

    【讨论】:

    • 由于有人只使用旋转和平移,我发现这个答案更好。谢谢。
    • 在哪里可以找到有关rotation() 自动优化的文档?我在 Eigen 文档或更改日志中没有找到任何内容...
    【解决方案2】:

    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]
    

    所以线性部分对应齐次矩阵表示的左上角。它对应于旋转、缩放和剪切的混合。

    【讨论】:

    • 你是指齐次矩阵的top-left角吗?
    猜你喜欢
    • 1970-01-01
    • 2014-01-04
    • 2020-04-11
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2018-01-05
    相关资源
    最近更新 更多