from_matrix#
- static Rotation.from_matrix(matrix, *, assume_valid=False)[source]#
从旋转矩阵初始化。
三维旋转可以用 3 x 3 正交矩阵 [1] 表示。如果输入不是正交的,则通过使用 [2] 中描述的方法对输入矩阵进行正交化来创建近似值,然后使用 [3] 中描述的算法将正交旋转矩阵转换为四元数。矩阵必须是右手系的。
- 参数:
- matrixarray_like, shape (…, 3, 3)
单个矩阵或矩阵的 ND 数组,其中最后两个维度包含旋转矩阵。
- assume_validbool, optional
除非用户可以保证输入是有效的旋转矩阵(即它是正交的,行和列具有单位范数,且行列式为 1),否则必须为 False。在未确保这些属性的情况下将其设置为 True 是不安全的,并且会导致静默地产生不正确的结果。如果为 True,则跳过归一化步骤,这可以提高运行时性能。默认值为 False。
- 返回:
- rotation
Rotation实例 包含由旋转矩阵表示的旋转的对象。
- rotation
附注
此函数之前被称为 from_dcm。
版本 1.4.0 中新增。
数组 API 标准支持
from_matrix对 Python Array API Standard 兼容的后端具有实验性支持,除了 NumPy 之外。请考虑通过设置环境变量SCIPY_ARRAY_API=1并提供 CuPy、PyTorch、JAX 或 Dask 数组作为数组参数来测试这些功能。支持以下后端和设备(或其他功能)的组合。库
CPU
GPU
NumPy
✅
不适用
CuPy
不适用
✅
PyTorch
✅
✅
JAX
✅
✅
Dask
⛔
不适用
有关更多信息,请参阅 对数组 API 标准的支持。
参考文献
[3]F. Landis Markley, “Unit Quaternion from Rotation Matrix”, Journal of guidance, control, and dynamics vol. 31.2, pp. 440-442, 2008.
示例
>>> from scipy.spatial.transform import Rotation as R >>> import numpy as np
初始化单个旋转
>>> r = R.from_matrix([ ... [0, -1, 0], ... [1, 0, 0], ... [0, 0, 1]]) >>> r.single True >>> r.as_matrix().shape (3, 3)
初始化单个对象中的多个旋转
>>> r = R.from_matrix([ ... [ ... [0, -1, 0], ... [1, 0, 0], ... [0, 0, 1], ... ], ... [ ... [1, 0, 0], ... [0, 0, -1], ... [0, 1, 0], ... ]]) >>> r.as_matrix().shape (2, 3, 3) >>> r.single False >>> len(r) 2
如果输入矩阵不是特殊的正交矩阵(正交且行列式等于 +1),则存储特殊的正交估计值
>>> a = np.array([ ... [0, -0.5, 0], ... [0.5, 0, 0], ... [0, 0, 0.5]]) >>> np.linalg.det(a) 0.125 >>> r = R.from_matrix(a) >>> matrix = r.as_matrix() >>> matrix array([[ 0., -1., 0.], [ 1., 0., 0.], [ 0., 0., 1.]]) >>> np.linalg.det(matrix) 1.0
也可以有一个包含单个旋转的堆栈
>>> r = R.from_matrix([[ ... [0, -1, 0], ... [1, 0, 0], ... [0, 0, 1]]]) >>> r.as_matrix() array([[[ 0., -1., 0.], [ 1., 0., 0.], [ 0., 0., 1.]]]) >>> r.as_matrix().shape (1, 3, 3)
我们还可以创建一个 N 维旋转数组
>>> r = R.from_matrix(np.tile(np.eye(3), (2, 3, 1, 1))) >>> r.shape (2, 3)