证明四元数乘法与旋转矩阵乘法等价

刚体四元数姿态控制 一文中没有证明的公式
R ( Q 1 ) R ( Q 2 ) = R ( Q 1 ∘ Q 2 ) R(Q_1)R(Q_2)=R(Q_1\circ Q_2) R(Q1)R(Q2)=R(Q1Q2)
在这篇文章中证明。
首先找几个数测试是否等价。
quaternions.py的代码见 自用的四元数、欧拉角、旋转矩阵转换代码。
下面的代码中,为了测试准确,四元数还要保证归一化,不如事先拿几个欧拉角转成四元数。

import numpy as np
from pythonsrc.quaternions import *

e1 = np.array([2, 0.2, -0.1])
e2 = np.array([0.1, 0.2, -0.3])
q1 = Euler_To_Quaternion(e1)
q2 = Euler_To_Quaternion(e2)
q3 = Quaternion_Product(q2, q1)
r1 = Quaternion_to_Rotation(q1)
r2 = Quaternion_to_Rotation(q2)
r3 = Quaternion_to_Rotation(q3)
r4 = r1 @ r2
print(sum(sum(r3-r4)))

然后测试一下 sympy 计算四元数转旋转矩阵的公式是否正确。

import sympy

def Antisymmetric(mat):
    ans = sympy.Matrix([
        [0, -mat[2], mat[1]],
        [mat[2], 0, -mat[0]],
        [-mat[1], mat[0], 0],
    ])
    return ans

qsa, qvxa, qvya, qvza = sympy.symbols('s_a, v_{ax}, v_{ay}, v_{az}')
qsb, qvxb, qvyb, qvzb = sympy.symbols('s_b, v_{bx}, v_{by}, v_{bz}')
qva = sympy.Matrix([qvxa, qvya, qvza])
qvb = sympy.Matrix([qvxb, qvyb, qvzb])
result = (qsa**2 - qva.T.dot(qva))*sympy.eye(3)
result += 2*qva*qva.T
result += 2*qsa*Antisymmetric(qva)
sympy.print_latex(result)

最后正式验证等价性。

import sympy

def Antisymmetric(mat):
    ans = sympy.Matrix([
        [0, -mat[2], mat[1]],
        [mat[2], 0, -mat[0]],
        [-mat[1], mat[0], 0],
    ])
    return ans

def Quaternion_to_Rotation(Q):
    q0, q1, q2, q3 = Q
    return sympy.Matrix([
        [q0*q0+q1*q1-q2*q2-q3*q3, 2*q1*q2-2*q0*q3, 2*q1*q3+2*q0*q2],
        [2*q1*q2+2*q0*q3, q0*q0-q1*q1+q2*q2-q3*q3, 2*q2*q3-2*q0*q1],
        [2*q1*q3-2*q0*q2, 2*q2*q3+2*q0*q1, q0*q0-q1*q1-q2*q2+q3*q3],
    ])

def Quaternion_Product(Q1, Q2):
    w1, x1, y1, z1 = Q1
    w2, x2, y2, z2 = Q2
    w = w1 * w2 - x1 * x2 - y1 * y2 - z1 * z2
    x = w1 * x2 + x1 * w2 + y1 * z2 - z1 * y2
    y = w1 * y2 + y1 * w2 + z1 * x2 - x1 * z2
    z = w1 * z2 + z1 * w2 + x1 * y2 - y1 * x2
    return sympy.Matrix([w, x, y, z])

qsa, qvxa, qvya, qvza = sympy.symbols('s_a, v_{ax}, v_{ay}, v_{az}')
qsb, qvxb, qvyb, qvzb = sympy.symbols('s_b, v_{bx}, v_{by}, v_{bz}')
Qa = sympy.Matrix([qsa, qvxa, qvya, qvza])
Qb = sympy.Matrix([qsb, qvxb, qvyb, qvzb])
Qc = Quaternion_Product(Qa, Qb)
Ra = Quaternion_to_Rotation(Qa)
Rb = Quaternion_to_Rotation(Qb)
Rc = Quaternion_to_Rotation(Qc)
Rd = Ra @ Rb
sympy.print_latex(Rc)
sympy.print_latex(Rd)
err = Rc - Rd
sympy.print_latex(err.expand())

输出结果如下,公式特别复杂,两个矩阵的误差为0。
在这里插入图片描述
[ ( s a s b − v a x v b x − v a y v b y − v a z v b z ) 2 + ( s a v b x + s b v a x + v a y v b z − v a z v b y ) 2 − ( s a v b y + s b v a y − v a x v b z + v a z v b x ) 2 − ( s a v b z + s b v a z + v a x v b y − v a y v b x ) 2 − ( 2 s a s b − 2 v a x v b x − 2 v a y v b y − 2 v a z v b z ) ( s a v b z + s b v a z + v a x v b y − v a y v b x ) + ( 2 s a v b x + 2 s b v a x + 2 v a y v b z − 2 v a z v b y ) ( s a v b y + s b v a y − v a x v b z + v a z v b x ) ( 2 s a s b − 2 v a x v b x − 2 v a y v b y − 2 v a z v b z ) ( s a v b y + s b v a y − v a x v b z + v a z v b x ) + ( 2 s a v b x + 2 s b v a x + 2 v a y v b z − 2 v a z v b y ) ( s a v b z + s b v a z + v a x v b y − v a y v b x ) ( 2 s a s b − 2 v a x v b x − 2 v a y v b y − 2 v a z v b z ) ( s a v b z + s b v a z + v a x v b y − v a y v b x ) + ( 2 s a v b x + 2 s b v a x + 2 v a y v b z − 2 v a z v b y ) ( s a v b y + s b v a y − v a x v b z + v a z v b x ) ( s a s b − v a x v b x − v a y v b y − v a z v b z ) 2 − ( s a v b x + s b v a x + v a y v b z − v a z v b y ) 2 + ( s a v b y + s b v a y − v a x v b z + v a z v b x ) 2 − ( s a v b z + s b v a z + v a x v b y − v a y v b x ) 2 − ( 2 s a s b − 2 v a x v b x − 2 v a y v b y − 2 v a z v b z ) ( s a v b x + s b v a x + v a y v b z − v a z v b y ) + ( 2 s a v b y + 2 s b v a y − 2 v a x v b z + 2 v a z v b x ) ( s a v b z + s b v a z + v a x v b y − v a y v b x ) − ( 2 s a s b − 2 v a x v b x − 2 v a y v b y − 2 v a z v b z ) ( s a v b y + s b v a y − v a x v b z + v a z v b x ) + ( 2 s a v b x + 2 s b v a x + 2 v a y v b z − 2 v a z v b y ) ( s a v b z + s b v a z + v a x v b y − v a y v b x ) ( 2 s a s b − 2 v a x v b x − 2 v a y v b y − 2 v a z v b z ) ( s a v b x + s b v a x + v a y v b z − v a z v b y ) + ( 2 s a v b y + 2 s b v a y − 2 v a x v b z + 2 v a z v b x ) ( s a v b z + s b v a z + v a x v b y − v a y v b x ) ( s a s b − v a x v b x − v a y v b y − v a z v b z ) 2 − ( s a v b x + s b v a x + v a y v b z − v a z v b y ) 2 − ( s a v b y + s b v a y − v a x v b z + v a z v b x ) 2 + ( s a v b z + s b v a z + v a x v b y − v a y v b x ) 2 ] \left[\begin{matrix}\left(s_{a} s_{b} - v_{ax} v_{bx} - v_{ay} v_{by} - v_{az} v_{bz}\right)^{2} + \left(s_{a} v_{bx} + s_{b} v_{ax} + v_{ay} v_{bz} - v_{az} v_{by}\right)^{2} - \left(s_{a} v_{by} + s_{b} v_{ay} - v_{ax} v_{bz} + v_{az} v_{bx}\right)^{2} - \left(s_{a} v_{bz} + s_{b} v_{az} + v_{ax} v_{by} - v_{ay} v_{bx}\right)^{2} & - \left(2 s_{a} s_{b} - 2 v_{ax} v_{bx} - 2 v_{ay} v_{by} - 2 v_{az} v_{bz}\right) \left(s_{a} v_{bz} + s_{b} v_{az} + v_{ax} v_{by} - v_{ay} v_{bx}\right) + \left(2 s_{a} v_{bx} + 2 s_{b} v_{ax} + 2 v_{ay} v_{bz} - 2 v_{az} v_{by}\right) \left(s_{a} v_{by} + s_{b} v_{ay} - v_{ax} v_{bz} + v_{az} v_{bx}\right) & \left(2 s_{a} s_{b} - 2 v_{ax} v_{bx} - 2 v_{ay} v_{by} - 2 v_{az} v_{bz}\right) \left(s_{a} v_{by} + s_{b} v_{ay} - v_{ax} v_{bz} + v_{az} v_{bx}\right) + \left(2 s_{a} v_{bx} + 2 s_{b} v_{ax} + 2 v_{ay} v_{bz} - 2 v_{az} v_{by}\right) \left(s_{a} v_{bz} + s_{b} v_{az} + v_{ax} v_{by} - v_{ay} v_{bx}\right)\\\left(2 s_{a} s_{b} - 2 v_{ax} v_{bx} - 2 v_{ay} v_{by} - 2 v_{az} v_{bz}\right) \left(s_{a} v_{bz} + s_{b} v_{az} + v_{ax} v_{by} - v_{ay} v_{bx}\right) + \left(2 s_{a} v_{bx} + 2 s_{b} v_{ax} + 2 v_{ay} v_{bz} - 2 v_{az} v_{by}\right) \left(s_{a} v_{by} + s_{b} v_{ay} - v_{ax} v_{bz} + v_{az} v_{bx}\right) & \left(s_{a} s_{b} - v_{ax} v_{bx} - v_{ay} v_{by} - v_{az} v_{bz}\right)^{2} - \left(s_{a} v_{bx} + s_{b} v_{ax} + v_{ay} v_{bz} - v_{az} v_{by}\right)^{2} + \left(s_{a} v_{by} + s_{b} v_{ay} - v_{ax} v_{bz} + v_{az} v_{bx}\right)^{2} - \left(s_{a} v_{bz} + s_{b} v_{az} + v_{ax} v_{by} - v_{ay} v_{bx}\right)^{2} & - \left(2 s_{a} s_{b} - 2 v_{ax} v_{bx} - 2 v_{ay} v_{by} - 2 v_{az} v_{bz}\right) \left(s_{a} v_{bx} + s_{b} v_{ax} + v_{ay} v_{bz} - v_{az} v_{by}\right) + \left(2 s_{a} v_{by} + 2 s_{b} v_{ay} - 2 v_{ax} v_{bz} + 2 v_{az} v_{bx}\right) \left(s_{a} v_{bz} + s_{b} v_{az} + v_{ax} v_{by} - v_{ay} v_{bx}\right)\\- \left(2 s_{a} s_{b} - 2 v_{ax} v_{bx} - 2 v_{ay} v_{by} - 2 v_{az} v_{bz}\right) \left(s_{a} v_{by} + s_{b} v_{ay} - v_{ax} v_{bz} + v_{az} v_{bx}\right) + \left(2 s_{a} v_{bx} + 2 s_{b} v_{ax} + 2 v_{ay} v_{bz} - 2 v_{az} v_{by}\right) \left(s_{a} v_{bz} + s_{b} v_{az} + v_{ax} v_{by} - v_{ay} v_{bx}\right) & \left(2 s_{a} s_{b} - 2 v_{ax} v_{bx} - 2 v_{ay} v_{by} - 2 v_{az} v_{bz}\right) \left(s_{a} v_{bx} + s_{b} v_{ax} + v_{ay} v_{bz} - v_{az} v_{by}\right) + \left(2 s_{a} v_{by} + 2 s_{b} v_{ay} - 2 v_{ax} v_{bz} + 2 v_{az} v_{bx}\right) \left(s_{a} v_{bz} + s_{b} v_{az} + v_{ax} v_{by} - v_{ay} v_{bx}\right) & \left(s_{a} s_{b} - v_{ax} v_{bx} - v_{ay} v_{by} - v_{az} v_{bz}\right)^{2} - \left(s_{a} v_{bx} + s_{b} v_{ax} + v_{ay} v_{bz} - v_{az} v_{by}\right)^{2} - \left(s_{a} v_{by} + s_{b} v_{ay} - v_{ax} v_{bz} + v_{az} v_{bx}\right)^{2} + \left(s_{a} v_{bz} + s_{b} v_{az} + v_{ax} v_{by} - v_{ay} v_{bx}\right)^{2}\end{matrix}\right] (sasbvaxvbxvayvbyvazvbz)2+(savbx+sbvax+vayvbzvazvby)2(savby+sbvayvaxvbz+vazvbx)2(savbz+sbvaz+vaxvbyvayvbx)2(2sasb2vaxvbx2vayvby2vazvbz)(savbz+sbvaz+vaxvbyvayvbx)+(2savbx+2sbvax+2vayvbz2vazvby)(savby+sbvayvaxvbz+vazvbx)(2sasb2vaxvbx2vayvby2vazvbz)(savby+sbvayvaxvbz+vazvbx)+(2savbx+2sbvax+2vayvbz2vazvby)(savbz+sbvaz+vaxvbyvayvbx)(2sasb2vaxvbx2vayvby2vazvbz)(savbz+sbvaz+vaxvbyvayvbx)+(2savbx+2sbvax+2vayvbz2vazvby)(savby+sbvayvaxvbz+vazvbx)(sasbvaxvbxvayvbyvazvbz)2(savbx+sbvax+vayvbzvazvby)2+(savby+sbvayvaxvbz+vazvbx)2(savbz+sbvaz+vaxvbyvayvbx)2(2sasb2vaxvbx2vayvby2vazvbz)(savbx+sbvax+vayvbzvazvby)+(2savby+2sbvay2vaxvbz+2vazvbx)(savbz+sbvaz+vaxvbyvayvbx)(2sasb2vaxvbx2vayvby2vazvbz)(savby+sbvayvaxvbz+vazvbx)+(2savbx+2sbvax+2vayvbz2vazvby)(savbz+sbvaz+vaxvbyvayvbx)(2sasb2vaxvbx2vayvby2vazvbz)(savbx+sbvax+vayvbzvazvby)+(2savby+2sbvay2vaxvbz+2vazvbx)(savbz+sbvaz+vaxvbyvayvbx)(sasbvaxvbxvayvbyvazvbz)2(savbx+sbvax+vayvbzvazvby)2(savby+sbvayvaxvbz+vazvbx)2+(savbz+sbvaz+vaxvbyvayvbx)2
[ ( 2 s a v a y + 2 v a x v a z ) ( − 2 s b v b y + 2 v b x v b z ) + ( − 2 s a v a z + 2 v a x v a y ) ( 2 s b v b z + 2 v b x v b y ) + ( s a 2 + v a x 2 − v a y 2 − v a z 2 ) ( s b 2 + v b x 2 − v b y 2 − v b z 2 ) ( 2 s a v a y + 2 v a x v a z ) ( 2 s b v b x + 2 v b y v b z ) + ( − 2 s a v a z + 2 v a x v a y ) ( s b 2 − v b x 2 + v b y 2 − v b z 2 ) + ( − 2 s b v b z + 2 v b x v b y ) ( s a 2 + v a x 2 − v a y 2 − v a z 2 ) ( 2 s a v a y + 2 v a x v a z ) ( s b 2 − v b x 2 − v b y 2 + v b z 2 ) + ( − 2 s a v a z + 2 v a x v a y ) ( − 2 s b v b x + 2 v b y v b z ) + ( 2 s b v b y + 2 v b x v b z ) ( s a 2 + v a x 2 − v a y 2 − v a z 2 ) ( − 2 s a v a x + 2 v a y v a z ) ( − 2 s b v b y + 2 v b x v b z ) + ( 2 s a v a z + 2 v a x v a y ) ( s b 2 + v b x 2 − v b y 2 − v b z 2 ) + ( 2 s b v b z + 2 v b x v b y ) ( s a 2 − v a x 2 + v a y 2 − v a z 2 ) ( − 2 s a v a x + 2 v a y v a z ) ( 2 s b v b x + 2 v b y v b z ) + ( 2 s a v a z + 2 v a x v a y ) ( − 2 s b v b z + 2 v b x v b y ) + ( s a 2 − v a x 2 + v a y 2 − v a z 2 ) ( s b 2 − v b x 2 + v b y 2 − v b z 2 ) ( − 2 s a v a x + 2 v a y v a z ) ( s b 2 − v b x 2 − v b y 2 + v b z 2 ) + ( 2 s a v a z + 2 v a x v a y ) ( 2 s b v b y + 2 v b x v b z ) + ( − 2 s b v b x + 2 v b y v b z ) ( s a 2 − v a x 2 + v a y 2 − v a z 2 ) ( 2 s a v a x + 2 v a y v a z ) ( 2 s b v b z + 2 v b x v b y ) + ( − 2 s a v a y + 2 v a x v a z ) ( s b 2 + v b x 2 − v b y 2 − v b z 2 ) + ( − 2 s b v b y + 2 v b x v b z ) ( s a 2 − v a x 2 − v a y 2 + v a z 2 ) ( 2 s a v a x + 2 v a y v a z ) ( s b 2 − v b x 2 + v b y 2 − v b z 2 ) + ( − 2 s a v a y + 2 v a x v a z ) ( − 2 s b v b z + 2 v b x v b y ) + ( 2 s b v b x + 2 v b y v b z ) ( s a 2 − v a x 2 − v a y 2 + v a z 2 ) ( 2 s a v a x + 2 v a y v a z ) ( − 2 s b v b x + 2 v b y v b z ) + ( − 2 s a v a y + 2 v a x v a z ) ( 2 s b v b y + 2 v b x v b z ) + ( s a 2 − v a x 2 − v a y 2 + v a z 2 ) ( s b 2 − v b x 2 − v b y 2 + v b z 2 ) ] \left[\begin{matrix}\left(2 s_{a} v_{ay} + 2 v_{ax} v_{az}\right) \left(- 2 s_{b} v_{by} + 2 v_{bx} v_{bz}\right) + \left(- 2 s_{a} v_{az} + 2 v_{ax} v_{ay}\right) \left(2 s_{b} v_{bz} + 2 v_{bx} v_{by}\right) + \left(s_{a}^{2} + v_{ax}^{2} - v_{ay}^{2} - v_{az}^{2}\right) \left(s_{b}^{2} + v_{bx}^{2} - v_{by}^{2} - v_{bz}^{2}\right) & \left(2 s_{a} v_{ay} + 2 v_{ax} v_{az}\right) \left(2 s_{b} v_{bx} + 2 v_{by} v_{bz}\right) + \left(- 2 s_{a} v_{az} + 2 v_{ax} v_{ay}\right) \left(s_{b}^{2} - v_{bx}^{2} + v_{by}^{2} - v_{bz}^{2}\right) + \left(- 2 s_{b} v_{bz} + 2 v_{bx} v_{by}\right) \left(s_{a}^{2} + v_{ax}^{2} - v_{ay}^{2} - v_{az}^{2}\right) & \left(2 s_{a} v_{ay} + 2 v_{ax} v_{az}\right) \left(s_{b}^{2} - v_{bx}^{2} - v_{by}^{2} + v_{bz}^{2}\right) + \left(- 2 s_{a} v_{az} + 2 v_{ax} v_{ay}\right) \left(- 2 s_{b} v_{bx} + 2 v_{by} v_{bz}\right) + \left(2 s_{b} v_{by} + 2 v_{bx} v_{bz}\right) \left(s_{a}^{2} + v_{ax}^{2} - v_{ay}^{2} - v_{az}^{2}\right)\\\left(- 2 s_{a} v_{ax} + 2 v_{ay} v_{az}\right) \left(- 2 s_{b} v_{by} + 2 v_{bx} v_{bz}\right) + \left(2 s_{a} v_{az} + 2 v_{ax} v_{ay}\right) \left(s_{b}^{2} + v_{bx}^{2} - v_{by}^{2} - v_{bz}^{2}\right) + \left(2 s_{b} v_{bz} + 2 v_{bx} v_{by}\right) \left(s_{a}^{2} - v_{ax}^{2} + v_{ay}^{2} - v_{az}^{2}\right) & \left(- 2 s_{a} v_{ax} + 2 v_{ay} v_{az}\right) \left(2 s_{b} v_{bx} + 2 v_{by} v_{bz}\right) + \left(2 s_{a} v_{az} + 2 v_{ax} v_{ay}\right) \left(- 2 s_{b} v_{bz} + 2 v_{bx} v_{by}\right) + \left(s_{a}^{2} - v_{ax}^{2} + v_{ay}^{2} - v_{az}^{2}\right) \left(s_{b}^{2} - v_{bx}^{2} + v_{by}^{2} - v_{bz}^{2}\right) & \left(- 2 s_{a} v_{ax} + 2 v_{ay} v_{az}\right) \left(s_{b}^{2} - v_{bx}^{2} - v_{by}^{2} + v_{bz}^{2}\right) + \left(2 s_{a} v_{az} + 2 v_{ax} v_{ay}\right) \left(2 s_{b} v_{by} + 2 v_{bx} v_{bz}\right) + \left(- 2 s_{b} v_{bx} + 2 v_{by} v_{bz}\right) \left(s_{a}^{2} - v_{ax}^{2} + v_{ay}^{2} - v_{az}^{2}\right)\\\left(2 s_{a} v_{ax} + 2 v_{ay} v_{az}\right) \left(2 s_{b} v_{bz} + 2 v_{bx} v_{by}\right) + \left(- 2 s_{a} v_{ay} + 2 v_{ax} v_{az}\right) \left(s_{b}^{2} + v_{bx}^{2} - v_{by}^{2} - v_{bz}^{2}\right) + \left(- 2 s_{b} v_{by} + 2 v_{bx} v_{bz}\right) \left(s_{a}^{2} - v_{ax}^{2} - v_{ay}^{2} + v_{az}^{2}\right) & \left(2 s_{a} v_{ax} + 2 v_{ay} v_{az}\right) \left(s_{b}^{2} - v_{bx}^{2} + v_{by}^{2} - v_{bz}^{2}\right) + \left(- 2 s_{a} v_{ay} + 2 v_{ax} v_{az}\right) \left(- 2 s_{b} v_{bz} + 2 v_{bx} v_{by}\right) + \left(2 s_{b} v_{bx} + 2 v_{by} v_{bz}\right) \left(s_{a}^{2} - v_{ax}^{2} - v_{ay}^{2} + v_{az}^{2}\right) & \left(2 s_{a} v_{ax} + 2 v_{ay} v_{az}\right) \left(- 2 s_{b} v_{bx} + 2 v_{by} v_{bz}\right) + \left(- 2 s_{a} v_{ay} + 2 v_{ax} v_{az}\right) \left(2 s_{b} v_{by} + 2 v_{bx} v_{bz}\right) + \left(s_{a}^{2} - v_{ax}^{2} - v_{ay}^{2} + v_{az}^{2}\right) \left(s_{b}^{2} - v_{bx}^{2} - v_{by}^{2} + v_{bz}^{2}\right)\end{matrix}\right] (2savay+2vaxvaz)(2sbvby+2vbxvbz)+(2savaz+2vaxvay)(2sbvbz+2vbxvby)+(sa2+vax2vay2vaz2)(sb2+vbx2vby2vbz2)(2savax+2vayvaz)(2sbvby+2vbxvbz)+(2savaz+2vaxvay)(sb2+vbx2vby2vbz2)+(2sbvbz+2vbxvby)(sa2vax2+vay2vaz2)(2savax+2vayvaz)(2sbvbz+2vbxvby)+(2savay+2vaxvaz)(sb2+vbx2vby2vbz2)+(2sbvby+2vbxvbz)(sa2vax2vay2+vaz2)(2savay+2vaxvaz)(2sbvbx+2vbyvbz)+(2savaz+2vaxvay)(sb2vbx2+vby2vbz2)+(2sbvbz+2vbxvby)(sa2+vax2vay2vaz2)(2savax+2vayvaz)(2sbvbx+2vbyvbz)+(2savaz+2vaxvay)(2sbvbz+2vbxvby)+(sa2vax2+vay2vaz2)(sb2vbx2+vby2vbz2)(2savax+2vayvaz)(sb2vbx2+vby2vbz2)+(2savay+2vaxvaz)(2sbvbz+2vbxvby)+(2sbvbx+2vbyvbz)(sa2vax2vay2+vaz2)(2savay+2vaxvaz)(sb2vbx2vby2+vbz2)+(2savaz+2vaxvay)(2sbvbx+2vbyvbz)+(2sbvby+2vbxvbz)(sa2+vax2vay2vaz2)(2savax+2vayvaz)(sb2vbx2vby2+vbz2)+(2savaz+2vaxvay)(2sbvby+2vbxvbz)+(2sbvbx+2vbyvbz)(sa2vax2+vay2vaz2)(2savax+2vayvaz)(2sbvbx+2vbyvbz)+(2savay+2vaxvaz)(2sbvby+2vbxvbz)+(sa2vax2vay2+vaz2)(sb2vbx2vby2+vbz2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/250943.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round 915 (Div. 2)(A~C)

坐牢一个半小时...D、E待补(太菜了,做的题还是太少了) A - Constructive 问题集 思路:手画一下发现:n个城市最多能重建n * n 的城市,所以n * m 需要重建max(n , m)个城市。 // Problem: A. Constructive Problems /…

使用netcore编写对比excel差异

一、新建项目Vlook项目 using MiniExcelLibs; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Data; using System.IO;namespace Vlook {internal class Program{static void Main(string[] args){var dir App…

MQTT的奇妙之旅:探索RabbitMQ Web MQTT插件的威力【RabbitMQ 十一】

欢迎来到我的博客,代码的世界里,每一行都是一个故事 MQTT的奇妙之旅:探索RabbitMQ Web MQTT插件的威力 前言第一:揭秘RabbitMQ Web MQTT插件背景和目的:MQTT 协议简介:WebSockets 和 MQTT 的融合&#xff1…

selenium+xpath爬取二手房标题

贝壳找房标题爬取需要注意的是,在页面中间有一个小广告 而他就在ul的li下面,当我们进行title所以输出时,会报错。 所以在进行页面解析之前必须把广告叉掉,不然也把广告那一部分的li给爬取下来了 所以,我们&#xff0…

【音视频 | H.264】H.264视频编码及NALU详解

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

医药行业的数据安全革新者:上海迅软DSE成功案例揭秘

随着网络化办公在医药企业中不断的深入应用,企业内部的药品保密配方、研发成果、技术资料等重要信息都散布在电脑或流转于网络之中,同时各种内部系统又集中存放着大量的敏感数据,一旦这些数据资产发生泄密,将对企业的持续运营造成…

Windows7下双网卡绑定(双网络冗余)

1.首先需要电脑主机里至少有两张网卡。 2.打开计算机管理,点击左侧的设备管理器: 3.点击展开右侧的 网络适配器: 4.如下是我们即将需要进行绑定的两张网卡: 5.右键点击第一张网卡,选择属性: 6.选择 分组 栏…

架构设计系列之常见架构(二)

五、DDD(领域驱动设计) 领域驱动设计(Domain-Driven Design,DDD)是一种开发思想,强调将软件系统的注意力集中在业务领域上,将领域视为应用的核心。在架构设计中,DDD 提供了一种不同…

【云原生kubernets】Service 的功能与应用

一、Service介绍 在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问。为了解决这个问题,kubernetes提供了Service资…

26 redis 中 replication/cluster 集群中的主从复制

前言 我们这里首先来看 redis 这边实现比较复杂的 replication集群模式 我们这里主要关注的是 redis 这边的主从同步的相关实现 这边相对比较简单, 我们直接基于 cluster集群模式 进行调试 主从命令同步复制 比如这里 master 是 redis_7002, slave 是 redis_7005 然后 这…

[c++]—vector类___提升版(带你了解vector底层的运用)

我写我 不论主谓宾 可以反复错 🌈vector的介绍 1.vector是表示可变大小数组的序列容器2.就像数组一样,vector也采用的连续存储空间来存储元素,也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组&…

工业性能CCD图像处理+

目录 硬件部分 ​编辑 软件部分 CCD新相机的调试处理(更换相机处理,都要点执行检测来查看图像变化) 问题:新相机拍摄出现黑屏,图像拍摄不清晰,(可以点击图像,向下转动鼠标的滚轮&#xff08…

nlp与cv的发展

Transformer的出现,促进了更高容量模型的建立,为大模型的出现奠定基础. 🧐大模型通常具有十亿个以上参数(仅供参考) 😮左边的蓝色是CV领域、右下绿色是NLP、右上蓝色是多模态😃基础模型(Foundational Models)首次由Bommasani等人在《Stanford…

算法--数据结构基础

文章目录 数据结构单链表栈表达式求值前缀表达式中缀表达式后缀表达式 队列单调栈单调队列KMPTrie并查集堆哈希表字符串哈希 数据结构 单链表 用数组模拟(静态链表)效率比定义Node类(动态链表)效率高些 使用数组模拟单链表&am…

2023年总结,讲讲我的故事吧,十年

文章目录 2023前十年后十年 周末,本该是提升自己的最好时机,也该是出去玩的大好时光,但是毫无意外的,在家躺了一天,单纯的有点累。 2023年,发生了好多事情,又好像没发生几件事,可能毕…

插入排序:直接插入排序 希尔排序

插入排序: 假设红竖线前的元素全部排好序,红线后面的数即为要插入的数据,红线依次往后移,假设end为排好序的最后一个数字,end1即为要插入的数字,一次插入时,end与要插入的数字依次比较&#xf…

springMVC-Restful风格

基本介绍 REST:即Representational State Transfer。(资源)表现层状态转化。是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用. 1.HTTP协议里面,四个表示操…

Java技术栈 —— 微服务框架Spring Cloud —— Ruoyi-Cloud 学习(二)

RuoYi项目开发过程 一、登录功能(鉴权模块)1.1 后端部分1.1.1 什么是JWT?1.1.2 什么是Base64?为什么需要它?1.1.3 SpringBoot注解解析1.1.4 依赖注入和控制反转1.1.5 什么是Restful?1.1.6 Log4j 2、Logpack、SLF4j日志框架1.1.7 如何将项目打包成指定bytecode字节…

ValueError: setting an array element with a sequence...

报错:ValueError: setting an array element with a sequence… 案例1:numpy库使用numpy.array转换list a是一个list,其包含两个元组,使用np.array进行转换,会报错: import numpy as np a ([([1, 2, 3]…

nodejs微信小程序+python+PHP的微博网络舆情分析系统-计算机毕业设计推荐

(4)微博信息交流:在首页导航栏上我们会看到“微博信息交流”这一菜单,我们点击进入进去以后,会看到所有管理员在后台发布的交流信息; (5)新闻资讯:用户可以查看新闻资讯信…