5 视觉SLAM十四讲读书笔记P40-P52( 四 )


// 下面是对Eigen阵的操作// 输入数据(初始化)matrix_23 << 1, 2, 3, 4, 5, 6;// 输出cout << "matrix 2x3 from 1 to 6: \n" << matrix_23 << endl;// 用()访问矩阵中的元素cout << "print matrix 2x3: " << endl;for (int i = 0; i < 2; i++) {for (int j = 0; j < 3; j++) cout << matrix_23(i, j) << "\t";cout << endl;}
以上代码是对 Eigen 矩阵的操作 , 具体内容如下:
1 2 34 5 6
matrix 2x3 from 1 to 6: 1 2 34 5 6
print matrix 2x3: 1 2 3 4 5 6
// 矩阵和向量相乘(实际上仍是矩阵和矩阵)v_3d << 3, 2, 1;vd_3d << 4, 5, 6;// 但是在Eigen里你不能混合两种不同类型的矩阵 , 像这样是错的// Matrix result_wrong_type = matrix_23 * v_3d;// 应该显式转换Matrix result = matrix_23.cast() * v_3d;cout << "[1,2,3;4,5,6]*[3,2,1]=" << result.transpose() << endl;Matrix result2 = matrix_23 * vd_3d;cout << "[1,2,3;4,5,6]*[4,5,6]: " << result2.transpose() << endl;
这段代码是演示如何对矩阵和向量进行乘法运算 。在Eigen中 , 矩阵和向量相乘仍然是矩阵和矩阵相乘 。首先 , 定义了两个向量v_3d和vd_3d , 然后使用cast()方法将矩阵中的元素转换为类型 , 与v_3d向量相乘 , 得到向量 。然后 , 矩阵与vd_3d向量相乘 , 得到向量 。最后 , 使用()方法将向量转置 , 以便于输出 。需要注意的是 , 在Eigen中 , 不同类型的矩阵和向量不能混合相乘 , 需要进行类型转换 。
矩阵的数据类型为  , 向量 v_3d 的数据类型为  , 这两个类型是不同的 。在 Eigen 中 , 对于矩阵乘法操作 , 两个矩阵的数据类型必须相同 , 否则编译器将会报错 。
在这种情况下 , 需要将的数据类型显式地转换为  , 这样才能与向量 v_3d 相乘 。具体做法是使用 cast 函数将中的每个元素转换为类型 。因此正确的写法是:= .cast() * v_3d;???????
.cast()可以将矩阵中的元素类型转换为类型 , 因为矩阵是类型的 , 其中元素类型是float , 而向量v_3d是类型的 , 其中元素类型是 , 两者不同类型的矩阵和向量不能直接相乘 。
因此 , 需要使用cast方法将矩阵中的元素类型转换为 , 得到一个类型的矩阵 , 才能和类型的向量v_3d相乘 。
在代码中 , v_3d 是类型的向量 , 元素类型是  , 而 vd_3d 是类型的向量 , 元素类型是 float 。
// 同样你不能搞错矩阵的维度// 试着取消下面的注释 , 看看Eigen会报什么错// Eigen::Matrix result_wrong_dimension = matrix_23.cast() * v_3d;
是一个类型的矩阵 , v_3d 是一个类型的向量 。这两者可以相乘 , 因为它们的维度匹配 , 但是得到的结果需要是一个类型的矩阵 。
=* v_3d 的问题在于 , 左侧矩阵的维度是不匹配的 。

5  视觉SLAM十四讲读书笔记P40-P52

文章插图
// 一些矩阵运算// 四则运算就不演示了 , 直接用+-*/即可 。matrix_33 = Matrix3d::Random();// 随机数矩阵cout << "random matrix: \n" << matrix_33 << endl;cout << "transpose: \n"