深蓝学院视觉slam十四讲第2章作业

首先给出有关四元数讲解一份比较好的pdf

在这里插入图片描述
2.1 设线性⽅程 A x = b \bm Ax = b Ax=b,则有解充要条件为:系数矩阵 A n × n \bm A_{n \times n} An×n与其增广矩阵 B n × ( n + 1 ) \bm B_{n \times (n+1)} Bn×(n+1)的秩相,即 R ( A ) = R ( B ) R(\bm A)=R(\bm B) R(A)=R(B);且解唯一的条件为 R ( A ) = R ( B ) = n R(\bm A)=R(\bm B)=n R(A)=R(B)=n

2.2 高斯消元法的原理是通过初等行变换把 A A A变换为上三角矩阵,然后从最下面一行(仅有一个未知量)开始求解,逐行回代依次解除每个未知量

2.3 实数矩阵 A \bm A A的QR分解是把 A \bm A A分解为 A = Q R \bm A = \bm Q \bm R A=QR ,这里的 Q \bm Q Q是正交矩阵,而 R \bm R R是上三角矩阵,如果 A \bm A A是非奇异的,且限定 R \bm R R的对角线元素为正,则这个分解是唯一的。 计算有很多方法,例如Givens旋转、Householder变换,以及Gram-Schmidt正交化等等。
用QR分解建立了计算矩阵特征值的QR方法

2.4 摘自wiki百科:Cholesky分解
Alt
2.5

#include <iostream>
#include <ctime>
// Eigen 核心部分
#include <Eigen/Core>
// 稠密矩阵的代数运算(逆,特征值等)
#include <Eigen/Dense>

using namespace std;
using namespace Eigen;

#define MATRIX_SIZE 100

int main(int argc, char **argv) {

    MatrixXd matrix_NN = MatrixXd::Random(MATRIX_SIZE, MATRIX_SIZE);
    matrix_NN = matrix_NN * matrix_NN.transpose();  // 对称阵,保证半正定
//    cout << "matrix_NN:\n" << matrix_NN << endl;

    // 实对称矩阵可以正交相似对角化,保证对角化成功
    SelfAdjointEigenSolver<MatrixXd> eigen_solver(matrix_NN);
    cout << "Eigen values = \n" << eigen_solver.eigenvalues() << endl;
//    The eigenvalues are sorted in increasing order. 所有特征值均大于0,保证正定
    cout << "Eigen values min = \n" << eigen_solver.eigenvalues()(0) << endl;

    clock_t time_stt = clock(); // 计时
    Matrix<double, MATRIX_SIZE, 1> v_Nd = MatrixXd::Random(MATRIX_SIZE, 1);
    Matrix<double, MATRIX_SIZE, 1> x;

    // 通常用矩阵分解来求,例如QR分解,速度会快很多
    time_stt = clock();
    x = matrix_NN.colPivHouseholderQr().solve(v_Nd);
    cout << "time of Qr decomposition is "
         << 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;
    cout << "x = " << x.transpose() << endl;

    // 对于正定矩阵,还可以用cholesky分解来解方程
    time_stt = clock();
    x = matrix_NN.ldlt().solve(v_Nd);
    cout << "time of ldlt decomposition is "
         << 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;
    cout << "x = " << x.transpose() << endl;

    return 0;
}

运行结果:
Alt

在这里插入图片描述3.

#include<iostream>
#include<cmath>
using namespace std;
#include<Eigen/Core>
#include<Eigen/Dense>
using namespace Eigen;

int main(int argc,char **argv)
{
    Quaterniond q1(0.55,0.3,0.2,0.2),q2(-0.1,0.3,-0.7,0.2);
    Vector3d t1(0.7,1.1,0.2),t2(-0.1,0.4,0.8);
    q1.normalize();
    q2.normalize();
    Vector3d p1(0.5,-0.1,0.2);

    //记得初始化为单位阵
    Isometry3d T1 = Isometry3d::Identity();
    Isometry3d T2 = Isometry3d::Identity();
    T1.rotate(q1);
    T2.rotate(q2);
    T1.pretranslate(t1);
    T2.pretranslate(t2);

    Vector3d p2=T2*T1.inverse()*p1;
    cout<<endl<<p2.transpose()<<endl;
    return 0;
}

运行结果:
在这里插入图片描述

在这里插入图片描述4.1
坐标系 [ e 1 , e 2 , e 3 ] \left[\bm e_{1}, \bm e_{2}, \bm e_{3}\right] [e1,e2,e3]发生了旋转,变成 [ e 1 ′ , e 2 ′ , e 3 ′ ] \left[\bm e_{1}^{\prime}, \bm e_{2}^{\prime}, \bm e_{3}^{\prime}\right] [e1,e2,e3]对应坐标变换如下:
[ e 1 , e 2 , e 3 ] [ a 1 a 2 a 3 ] = [ e 1 ′ , e 2 ′ , e 3 ′ ] [ a 1 ′ a 2 ′ a 3 ′ ] \left[\bm e_{1}, \bm e_{2}, \bm e_{3}\right] \left[ \begin{array}{c}a_{1} \\ a_{2} \\ a_{3}\end{array}\right]= \left[\bm e_{1}^{\prime}, \bm e_{2}^{\prime}, \bm e_{3}^{\prime}\right] \left[\begin{array}{c}a_{1}^{\prime} \\ a_{2}^{\prime} \\ a_{3}^{\prime}\end{array}\right] [e1,e2,e3]a1a2a3=[e1,e2,e3]a1a2a3
上式同时左乘 [ e 1 T e 2 T e 3 T ] \left[\begin{array}{c}\bm e_{1}^{T} \\ \bm e_{2}^{T} \\ \bm e_{3}^{T}\end{array}\right] e1Te2Te3T得:
a ≜ [ a 1 a 2 a 3 ] = [ e 1 T e 1 ′ e 1 T e 2 ′ e 1 T e 3 ′ e 2 T e 1 ′ e 2 T e 2 ′ e 2 T e 3 ′ e 3 T e 1 ′ e 3 T e 2 ′ e 3 T e 3 ′ ] [ a 1 ′ a 2 ′ a 3 ′ ] ≜ R a ′ \bm a \triangleq \left[\begin{array}{l} a_{1} \\a_{2} \\a_{3} \end{array}\right]= \left[\begin{array}{lll} \bm e_{1}^{T} \bm{e}_{1}^{\prime} & \bm e_{1}^{T} \bm{e}_{2}^{\prime} & \bm{e}_{1}^{T} \bm{e}_{3}^{\prime} \\ \bm e_{2}^{T} \bm{e}_{1}^{\prime} & \bm e_{2}^{T} \bm{e}_{2}^{\prime} & \bm{e}_{2}^{T} \bm{e}_{3}^{\prime} \\ \bm e_{3}^{T} \bm{e}_{1}^{\prime} & \bm e_{3}^{T} \bm{e}_{2}^{\prime} & \bm{e}_{3}^{T} \bm{e}_{3}^{\prime} \end{array}\right] \left[\begin{array}{l} a_{1}^{\prime} \\a_{2}^{\prime} \\a_{3}^{\prime} \end{array}\right] \triangleq \bm R \bm a^{\prime} aa1a2a3=e1Te1e2Te1e3Te1e1Te2e2Te2e3Te2e1Te3e2Te3e3Te3a1a2a3Ra

同理若上式同时左乘 [ e 1 ′ T e 2 ′ T e 3 ′ T ] \left[\begin{array}{c}\bm e_{1}^{\prime T} \\ \bm e_{2}^{\prime T} \\ \bm e_{3}^{\prime T}\end{array}\right] e1Te2Te3T得:
R − 1 a ≜ [ e 1 ′ T e 1 e 1 ′ T e 2 e 1 ′ T e 3 e 2 ′ T e 1 e 2 ′ T e 2 e 2 ′ T e 3 e 3 ′ T e 1 ′ e 3 ′ T e 2 e 3 ′ T e 3 ] [ a 1 a 2 a 3 ] = [ a 1 ′ a 2 ′ a 3 ′ ] ≜ a ′ \bm R^{-1} \bm a \triangleq \left[\begin{array}{lll} \bm e_{1}^{\prime T} \bm{e}_{1} & \bm e_{1}^{\prime T} \bm{e}_{2} & \bm{e}_{1}^{\prime T} \bm{e}_{3} \\ \bm e_{2}^{\prime T} \bm{e}_{1} & \bm e_{2}^{\prime T} \bm{e}_{2} & \bm{e}_{2}^{\prime T} \bm{e}_{3} \\ \bm e_{3}^{\prime T} \bm{e}_{1}^{\prime} & \bm e_{3}^{\prime T} \bm{e}_{2} & \bm{e}_{3}^{\prime T} \bm{e}_{3} \end{array}\right] \left[\begin{array}{l} a_{1} \\a_{2} \\a_{3} \end{array}\right]= \left[\begin{array}{l} a_{1}^{\prime} \\a_{2}^{\prime} \\a_{3}^{\prime} \end{array}\right] \triangleq \bm a^{\prime} R1ae1Te1e2Te1e3Te1e1Te2e2Te2e3Te2e1Te3e2Te3e3Te3a1a2a3=a1a2a3a

R − 1 = [ e 1 ′ T e 1 e 1 ′ T e 2 e 1 ′ T e 3 e 2 ′ T e 1 e 2 ′ T e 2 e 2 ′ T e 3 e 3 ′ T e 1 ′ e 3 ′ T e 2 e 3 ′ T e 3 ] \bm R^{-1} = \left[\begin{array}{lll} \bm e_{1}^{\prime T} \bm{e}_{1} & \bm e_{1}^{\prime T} \bm{e}_{2} & \bm{e}_{1}^{\prime T} \bm{e}_{3} \\ \bm e_{2}^{\prime T} \bm{e}_{1} & \bm e_{2}^{\prime T} \bm{e}_{2} & \bm{e}_{2}^{\prime T} \bm{e}_{3} \\ \bm e_{3}^{\prime T} \bm{e}_{1}^{\prime} & \bm e_{3}^{\prime T} \bm{e}_{2} & \bm{e}_{3}^{\prime T} \bm{e}_{3} \end{array}\right] R1=e1Te1e2Te1e3Te1e1Te2e2Te2e3Te2e1Te3e2Te3e3Te3

R T = [ e 1 T e 1 ′ e 2 T e 1 ′ e 3 T e 1 ′ e 1 T e 2 ′ e 2 T e 2 ′ e 3 T e 2 ′ e 1 T e 3 ′ e 2 T e 3 ′ e 3 T e 3 ′ ] \bm R^{T} =\left[\begin{array}{lll} \bm e_{1}^{T} \bm{e}_{1}^{\prime} & \bm e_{2}^{T} \bm{e}_{1}^{\prime} & \bm e_{3}^{T} \bm{e}_{1}^{\prime} \\ \bm e_{1}^{T} \bm{e}_{2}^{\prime} & \bm e_{2}^{T} \bm{e}_{2}^{\prime} & \bm e_{3}^{T} \bm{e}_{2}^{\prime}\\ \bm{e}_{1}^{T} \bm{e}_{3}^{\prime}& \bm{e}_{2}^{T} \bm{e}_{3}^{\prime} & \bm{e}_{3}^{T} \bm{e}_{3}^{\prime} \end{array}\right] RT=e1Te1e1Te2e1Te3e2Te1e2Te2e2Te3e3Te1e3Te2e3Te3
同时
[ e i 1 , e i 2 , e i 3 ] [ e j 1 ′ e j 2 ′ e j 3 ′ ] = e i T e j ′ = e j ′ T e i = [ e j 1 ′ , e j 2 ′ , e j 3 ′ ] [ e i 1 e i 2 e i 3 ] \left[ e_{i1}, e_{i2}, e_{i3}\right] \left[ \begin{array}{c}e_{j1}^{\prime} \\e_{j2}^{\prime} \\e_{j3}^{\prime}\end{array}\right]= \bm e_{i}^{T} \bm{e}_{j}^{\prime} = \bm e_{j}^{\prime T} \bm{e}_{i}= \left[ e_{j1}^{\prime }, e_{j2}^{\prime }, e_{j3}^{\prime } \right] \left[ \begin{array}{c}e_{i1}\\ e_{i2}\\ e_{i3}\end{array}\right] [ei1,ei2,ei3]ej1ej2ej3=eiTej=ejTei=[ej1,ej2,ej3]ei1ei2ei3

R − 1 = R T \bm R^{-1}=\bm R^{T} R1=RT

∣ R ∣ = ∣ e 1 T e 2 T e 3 T ∣ ∣ e 1 ′ , e 2 ′ , e 3 ′ ∣ = 1 |\bm R| =\left|\begin{array}{c}\bm e_{1}^{T} \\ \bm e_{2}^{T} \\ \bm e_{3}^{T}\end{array}\right| \left|\bm e_{1}^{\prime}, \bm e_{2}^{\prime}, \bm e_{3}^{\prime}\right| =1 R=e1Te2Te3Te1,e2,e3=1

4.2 四元数的实部 η \eta η是一维,虚部 ε \bm \varepsilon ε是三维

4.3

q 1 = [ ε 1 , η 1 ] T , q 2 = [ ε 2 , η 2 ] T \bm {q}_{1}=[\bm \varepsilon_1,\eta_1]^T, \quad \bm {q}_{2}=[\bm \varepsilon_2,\eta_2]^T q1=[ε1,η1]T,q2=[ε2,η2]T

或原始四元数表示法:
q 1 = η 1 + x 1 i + y 1 j + z 1 k , q 2 = η 2 + x 2 i + y 2 j + z 2 k \bm {q}_{1}=\eta_1+x_1 \bm i + y_1 \bm j + z_1\bm k, \quad \bm {q}_{2}=\eta_2+x_2 \bm i + y_2 \bm j + z_2\bm k q1=η1+x1i+y1j+z1k,q2=η2+x2i+y2j+z2k

q 1 q 2 = η 1 η 2 − x 1 x 2 − y 1 y 2 − z 1 z 2 + ( η 1 x 2 + x 1 η 2 + y 1 z 2 − z 1 y 2 ) i + ( η 1 y 2 − x 1 z 2 + y 1 η 2 + z 1 x 2 ) j + ( η 1 z 2 + x 1 y 2 − y 1 x 2 + z 1 η 2 ) k \begin{aligned} \bm {q}_{1}\bm {q}_{2}= &\eta_{1} \eta_{2}-x_{1} x_{2}-y_{1} y_{2}-z_{1} z_{2} \\ &+ \left(\eta_{1} x_{2}+x_{1} \eta_{2}+y_{1} z_{2}-z_{1} y_{2}\right)\bm i \\ &+\left(\eta_{1} y_{2}-x_{1} z_{2}+y_{1} \eta_{2}+z_{1} x_{2}\right)\bm j \\ &+\left(\eta_{1} z_{2}+x_{1} y_{2}-y_{1} x_{2}+z_{1} \eta_{2}\right)\bm k \end{aligned} q1q2=η1η2x1x2y1y2z1z2+(η1x2+x1η2+y1z2z1y2)i+(η1y2x1z2+y1η2+z1x2)j+(η1z2+x1y2y1x2+z1η2)k
q 1 q 2 = η 1 η 2 − x 1 x 2 − y 1 y 2 − z 1 z 2 + ( x 1 η 2 + η 1 x 2 − z 1 y 2 + y 1 z 2 ) i + ( y 1 η 2 + z 1 x 2 + η 1 y 2 − x 1 z 2 ) j + ( z 1 η 2 − y 1 x 2 + x 1 y 2 + η 1 z 2 ) k \begin{aligned} \bm {q}_{1}\bm {q}_{2}= &\eta_1 \eta_2-x_1 x_2-y_1 y_2-z_1 z_2\\ &+(x_1 \eta_2+\eta_1 x_2-z_1 y_2+y_1 z_2)\bm i \\ &+(y_1 \eta_2+z_1 x_2+\eta_1 y_2-x_1 z_2) \bm j \\ &+(z_1 \eta_2-y_1 x_2+x_1 y_2+\eta_1 z_2)\bm k \end{aligned} q1q2=η1η2x1x2y1y2z1z2+(x1η2+η1x2z1y2+y1z2)i+(y1η2+z1x2+η1y2x1z2)j+(z1η2y1x2+x1y2+η1z2)k

写成向量形式并利用内外积运算表示:
q 1 q 2 = [ η 1 ε 2 + η 2 ε 1 + ε 1 × ε 2 , η 1 η 2 − ε 1 T ε 2 ] T \bm {q}_{1}\bm {q}_{2}=[\eta_1 \bm \varepsilon_2 + \eta_2 \bm \varepsilon_1 + \bm \varepsilon_1 \times \bm \varepsilon_2, \eta_1 \eta_2 - \bm \varepsilon_1^T \bm \varepsilon_2]^T q1q2=[η1ε2+η2ε1+ε1×ε2,η1η2ε1Tε2]T

q 1 + = [ η 1 1 + ε 1 × ε 1 − ε 1 T η 1 ] , q 2 ⊕ = [ η 2 1 − ε 2 × ε 2 − ε 2 T η 2 ] \bm {q}^{+}_1=\left[\begin{array}{cc} \eta_1 \bm {1}+ \bm {\varepsilon}^{\times}_1 & \bm {\varepsilon}_1 \\ -\bm \varepsilon^{T}_1 & \eta_1 \end{array}\right] , \quad \bm {q}^{\oplus}_2=\left[\begin{array}{cc} \eta_2 \bm 1-\bm \varepsilon^{\times}_2 & \bm \varepsilon_2 \\ -\bm \varepsilon^{T}_2 & \eta_2 \end{array}\right] q1+=[η11+ε1×ε1Tε1η1],q2=[η21ε2×ε2Tε2η2]

q 1 + q 2 = [ η 1 1 + ε 1 × ε 1 − ε 1 T η 1 ] [ ε 2 η 2 ] = [ η 1 ε 2 + ε 1 × ε 2 + η 2 ε 1 − ε 1 T ε 2 + η 1 η 2 ] = q 1 q 2 \bm {q}^{+}_1\bm {q}_{2}=\left[\begin{array}{cc} \eta_1 \bm {1}+ \bm {\varepsilon}^{\times}_1 & \bm {\varepsilon}_1 \\ -\bm \varepsilon^{T}_1 & \eta_1 \end{array}\right] \left[\begin{array}{c} \bm \varepsilon_2 \\ \eta_2 \end{array}\right]= \left[\begin{array}{c} \eta_1 \bm \varepsilon_2 + \bm \varepsilon_1 \times \bm \varepsilon_2 +\eta_2 \bm \varepsilon_1 \\ -\bm \varepsilon_1^T \bm \varepsilon_2 +\eta_1 \eta_2 \end{array}\right] = \bm {q}_{1}\bm {q}_{2} q1+q2=[η11+ε1×ε1Tε1η1][ε2η2]=[η1ε2+ε1×ε2+η2ε1ε1Tε2+η1η2]=q1q2
q 2 ⊕ q 1 = [ η 2 1 − ε 2 × ε 2 − ε 2 T η 2 ] [ ε 1 η 1 ] = [ η 2 ε 1 − ε 2 × ε 1 + η 1 ε 2 − ε 2 T ε 1 + η 1 η 2 ] = q 1 q 2 \bm {q}^{\oplus}_2\bm {q}_{1}= \left[\begin{array}{cc} \eta_2 \bm 1-\bm \varepsilon^{\times}_2 & \bm \varepsilon_2 \\ -\bm \varepsilon^{T}_2 & \eta_2 \end{array}\right] \left[\begin{array}{c} \bm \varepsilon_1 \\ \eta_1 \end{array}\right]= \left[\begin{array}{c} \eta_2 \bm \varepsilon_1 - \bm \varepsilon_2 \times \bm \varepsilon_1 +\eta_1 \bm \varepsilon_2 \\ -\bm \varepsilon_2^T \bm \varepsilon_1 +\eta_1 \eta_2 \end{array}\right] = \bm {q}_{1}\bm {q}_{2} q2q1=[η21ε2×ε2Tε2η2][ε1η1]=[η2ε1ε2×ε1+η1ε2ε2Tε1+η1η2]=q1q2

在这里插入图片描述5. 摘自维基百科 Rodrigues’ rotation formula

基本原理是将向量 v \bm v v绕转轴 k \bm k k的旋转分解为平行于转轴的 v ∥ \bm v_{\parallel } v和垂直于转轴的 v ⊥ \bm v _{\perp } v的旋转,并用 v \bm v v k \bm k k表示出来; v ∥ \bm v_{\parallel } v旋转后的 v ∥ r o t \bm{v}_{\parallel\mathrm{rot}} vrot保持不变, v ⊥ \bm v_{\perp } v旋转后的 v ⊥ r o t \bm{v}_{\perp \mathrm{rot}} vrot在由 v ⊥ \bm v_{\perp } v w \bm w w(与 v ⊥ \bm v_{\perp } v垂直)张成的二维平面内表示出来;最终获得 v r o t \bm{v}_{\mathrm{rot}} vrot

在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述

q = [ s , v ] T , p = [ 0 , u ] T \bm {q}=[s,\bm v]^{\mathrm{T}} , \bm {p}=[0,\bm u]^{\mathrm{T}} q=[s,v]T,p=[0,u]T

q + ( q − 1 ) ⊕ = [ s − v T v s I + v ∧ ] [ s v T − v s I + v ∧ ] = [ 1 0 0 T v v T + s 2 I + 2 s v ∧ + ( v ∧ ) 2 ] \bm q^{+}\left(\bm q^{-1}\right)^{\oplus}=\left[\begin{array}{cc} s & -\bm v^{\mathrm{T}} \\ \bm v & s \bm I+\bm v^{\wedge} \end{array}\right]\left[\begin{array}{cc} s & \bm v^{\mathrm{T}} \\ -\bm v & s\bm I+\bm v^{\wedge} \end{array}\right]= \left[\begin{array}{cc} 1 & \bm 0 \\ \bm 0^{\mathrm{T}} & \bm v\bm v^{\mathrm{T}}+s^{2} \bm I+2 s \bm v^{\wedge}+\left(\bm v^{\wedge}\right)^{2} \end{array}\right] q+(q1)=[svvTsI+v][svvTsI+v]=[10T0vvT+s2I+2sv+(v)2]
p ′ = q p q − 1 = q + ( q − 1 ) ⊕ p = [ 1 0 T 0 v v T + s 2 I + 2 s v ∧ + ( v ∧ ) 2 ] [ 0 u ] = [ 0 ( ( v v T + s 2 I + 2 s v ∧ + ( v ∧ ) 2 ) u ] \bm p^{\prime} =\bm q \bm p \bm q^{-1}=\bm q^{+}\left(\bm q^{-1}\right)^{\oplus}\bm p= \left[\begin{array}{cc} 1 & \bm 0^{\mathrm{T}} \\ \bm 0 & \bm v\bm v^{\mathrm{T}}+s^{2} \bm I+2 s \bm v^{\wedge}+\left(\bm v^{\wedge}\right)^{2} \end{array}\right] \left[\begin{array}{c} 0 \\ \bm u \end{array}\right]= \left[\begin{array}{c} 0 \\ \left((\bm v\bm v^{\mathrm{T}}+s^{2} \bm I+2 s \bm v^{\wedge}+\left(\bm v^{\wedge}\right)^{2}\right) \bm u \end{array}\right] p=qpq1=q+(q1)p=[100TvvT+s2I+2sv+(v)2][0u]=[0((vvT+s2I+2sv+(v)2)u]
由上式结果看 p ′ \bm p^{\prime} p实部为 0 0 0 p ′ \bm p^{\prime} p为虚四元数
若记 q = s + x i + y j + z k \bm q =s+x\bm i+y\bm j+z\bm k q=s+xi+yj+zk则旋转矩阵 Q \bm Q Q可表示为:
Q = q + ( q − 1 ) ⊕ = [ 1 0 0 T v v T + s 2 I + 2 s v ∧ + ( v ∧ ) 2 ] = [ 1 0 0 0 0 1 − 2 y 2 − 2 z 2 2 x y − 2 s z 2 s y + 2 x z 0 2 x y + 2 s z 1 − 2 x 2 − 2 z 2 2 y z − 2 s x 0 2 x z − 2 s y 2 s x + 2 y z 1 − 2 x 2 − 2 y 2 ] \bm Q =\bm q^{+}\left(\bm q^{-1}\right)^{\oplus}= \left[\begin{array}{cc} 1 & \bm 0 \\ \bm 0^{\mathrm{T}} & \bm v\bm v^{\mathrm{T}}+s^{2} \bm I+2 s \bm v^{\wedge}+\left(\bm v^{\wedge}\right)^{2} \end{array}\right]= \left[\begin{array}{cccc} 1 & 0 & 0 & 0 \\ 0 & 1-2 y^{2}-2 z^{2} & 2 x y-2 s z & 2 s y+2 x z \\ 0 & 2 x y+2 s z & 1-2 x^{2}-2 z^{2} & 2 y z-2 s x \\ 0 & 2 x z-2 s y & 2 s x+2 y z & 1-2 x^{2}-2 y^{2} \end{array}\right] Q=q+(q1)=[10T0vvT+s2I+2sv+(v)2]=1000012y22z22xy+2sz2xz2sy02xy2sz12x22z22sx+2yz02sy+2xz2yz2sx12x22y2

方法二:摘自 A brief introduction to the quaternions and its applications in 3D geometry
在这里插入图片描述

在这里插入图片描述7.
所用的新特性已写在注释中

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class A {
public:
    A(const int &i) : index(i) {}

    int index = 0;
};

int main() {
    A a1(3), a2(5), a3(9);
    vector<A> avec{a1, a2, a3}; // 初始化列表

    // 运用lambda表达式 []
    // 提供了一个类似匿名函数的特性,而匿名函数则是在需要一个函数,但是又不想费力去命名一个函数的情况下去使用
    std::sort(avec.begin(), avec.end(), [](const A&a1, const A&a2) {return a1.index<a2.index;});

    // 范围for循环:用a遍历容器avec中的每个量  auto自动类型推导:根据a获得的值,自动推断出a的类型
    for ( auto& a: avec ) cout<<a.index<<" ";
    cout<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值