视觉SLAM理论与实践第二讲习题

视觉SLAM理论与实践第二讲习题_第1张图片

1、方阵A可逆时,x有解且唯一

2、高斯消元法是一种求解线性方程组的方法,也可以求矩阵的秩,以及可逆方阵的逆,它通过逐步消除未知元将原始线性系统转化成为一个更简单的线性系统,它的实质是通过行变换,将线性方程组的增广矩阵变换成为行阶梯阵。

3、对于n阶方阵A,若存在正交矩阵Q与上三角矩阵R使得A=QR,则称该式为A的QR分解。其中Q可通过A的施密特正交化得到,R则Q的转置乘以A得到。

4、Cholesky分解法是把对称正定的矩阵A表示成下三角矩阵L和其转置的矩阵乘积的分解,要求矩阵A的所有特征值都大于0。

5、test1.cpp

#include
#include
#include
#include
#include

#define maxsize 100

using namespace Eigen;
using namespace std;

int main(int argc, char** argv)
{
        //Matrix matrix_dynamic;//生成任意大小的动态矩
阵
        //MatrixXd matrix_x; //与上面代码功能一致
        Matrix matrixNN =
                MatrixXd::Random(maxsize, maxsize);
        matrixNN = matrixNN * matrixNN.transpose();  //保持半正定
        Matrix v_Nd = MatrixXd::Random(maxsize,1);


        //计时
                clock_t time_set = clock();
        //直接求逆
        v_Nd = matrixNN.inverse() * v_Nd;
        cout << "time of normal inverse is"
                << 1000 * (clock() - time_set) / (double) CLOCKS_PER_SEC << "ms" << endl;
        cout << "v_Nd = " << v_Nd.transpose() << endl;

        //QR分解
        time_set = clock();
        v_Nd =
                matrixNN.colPivHouseholderQr().solve(v_Nd);
         cout << "time of normal inverse is"
                << 1000 * (clock() - time_set) / (double) CLOCKS_PER_SEC << "ms"
<< endl;
        cout << "v_Nd = " << v_Nd.transpose() << endl;

         //Cholesky分解
        time_set = clock();
        v_Nd =
                matrixNN.ldlt().solve(v_Nd);
         cout << "time of normal inverse is"
                << 1000 * (clock() - time_set) / (double) CLOCKS_PER_SEC << "ms"
<< endl;
        cout << "v_Nd = " << v_Nd.transpose() << endl;
        return 0;

}

                                                 37,1          70%
                                           

视觉SLAM理论与实践第二讲习题_第2张图片

test.cpp

#include
#include
#include
#include
#include

using namespace std;
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);
        q1.normalize();
        q2.normalize();
        Vector3d t1(0.7,1.1,0.2), t2(-0.1,0.4,0.8);
        Vector3d p1(0.5,-0.1,0.2);

        Isometry3d T1w(q1), T2w(q2);
        T1w.pretranslate(t1);
        T2w.pretranslate(t2);

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

                    

 

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

project(test)

include_directories( "/usr/include/eigen3" )

add_executable(Test test.cpp)

 

 

视觉SLAM理论与实践第二讲习题_第3张图片

1、视觉SLAM理论与实践第二讲习题_第4张图片

 

 

2、实部是一维的,虚部是三维的

3、视觉SLAM理论与实践第二讲习题_第5张图片

 

视觉SLAM理论与实践第二讲习题_第6张图片

视觉SLAM理论与实践第二讲习题_第7张图片

 

视觉SLAM理论与实践第二讲习题_第8张图片

 

 

视觉SLAM理论与实践第二讲习题_第9张图片

 

视觉SLAM理论与实践第二讲习题_第10张图片

1、17行,在for循环上用到了基于范围的for循环,简化了for循环。

2、17行,auto的使用使得不用标注& a的数据类型,可以根据数字自动推导出数据类型。

3、16行,使用了lambda表达式来比较元素大小,其中const A&a1, const A&a2是参数列表,return a1.index

4、15行,使用了初始化列表来表达初始化对象。
 

 

 

 

 

 

你可能感兴趣的:(SLAM,自动驾驶)