寻找旋转矩阵,在3d中将一个(3个矢量)基础转换为另一个

时间:2018-05-22 19:09:54

标签: python matrix linear

我们在3d中有基础,Vx =(1,0,0),Vy =(0,1,0),Vz =(0,0,1) ,它通过(旋转)矩阵M分别转换为Vx'Vy'Vz'。所以我们有3个方程式:

M * Vx = Vx'
M * Vy = Vy'
M * Vz = Vz'

因此,对于矩阵M的9个分量,我们有9个线性方程。 现在我需要以A * m = b的形式转换这个等式(用numpy解决它),其中m是未知M组件的列向量,如[m11, m12, m13, m21, ...]A是系数矩阵b是系数列 - 矢量。

所以问题是,Ab的公式是什么?是否可以为它编写一些矩阵公式?或者,是否有任何工具可以帮助编写每个组件的公式?

1 个答案:

答案 0 :(得分:0)

实际上这很容易。

矩阵A

    |Vx 000 000|
    |000 Vx 000|
A = |000 000 Vx|
    |Vy 000 000|
    |000 Vy 000|
        ....

在此表示法中考虑Vx是3个标量Vx1, Vx2, Vx2(Vx的x,y,z分量),因此矩阵为9x9。

b是来自V'组分的垂直堆积的列向量

    |Vx'|
b = |Vy'|
    |Vz'|

这是Python / numpy的最终解决方案:

import numpy as np
def solve_3vector_equation(v1, v2, v3, v1_, v2_, v3_):
    """
    Solves linear equation system:
        M * v1 = v1_
        M * v2 = v2_
        M * v3 = v3_

    Where M is 3x3 matrix, v... - 3d vectors
    """

    A = np.zeros((9, 9))

    vs = [v1, v2, v3]
    vs_ = [v1_, v2_, v3_]

    for i in range(3):
        for j in range(3):
            A[i * 3 + j, j * 3:(j + 1) * 3] = vs[i]

    b = np.hstack(vs_)

    return np.linalg.solve(A, b).reshape((3, 3))