在本征中,我们可以创建一个矩阵
Matrix3f m;
m << 1, 2, 3,
4, 5, 6,
7, 8, 9;
如何创建像下面那样的对角矩阵
3, 0, 0,
0, 8, 0,
0, 0, 6;
我不明白Eigen如何处理对角矩阵?这里只有对角线元素很重要。因此,Eigen会保存上面示例中的所有9个元素,或者Eigen只保存3个元素3,8,6。此外,如果特征保存所有9个元素,那么是否有必要将矩阵定义为对角线,或者它是否与定义普通3 * 3矩阵相同?
答案 0 :(得分:15)
如果您想要一个独立的对角矩阵,请构建一个DiagonalMatrix。
DiagonalMatrix<double, 3> m(3, 8, 6);
// Input after construction
m.diagonal() << 3, 8, 6;
DiagonalMatrix的工作方式与普通矩阵类似,但只存储对角线。
Vector3d v(1, 2, 3);
m * v; // 3 16 18
如果要从现有向量中创建对角矩阵,请调用。asDiagonal()。请注意,.diagonal()
将对角线作为向量返回,因此.diagonal().asDiagonal()
提取矩阵的对角线部分并将其视为对角矩阵。
答案 1 :(得分:3)
这是代码及其输出:
代码:
#include <iostream>
#include "Eigen/Dense"
int main()
{
Eigen::Matrix< double, 3, 1> v ;
v << 1, 2, 3;
Eigen::Matrix< double, 3, 3> m = v.array().sqrt().matrix().asDiagonal());
std::cout << m << "\n";
return 0;
}
输出:
1 0 0 0 1.41421 0 0 0 1.73205
如您所见,从(3 * 1)向量创建的asDiagonal()输出是一个普通(3 * 3)矩阵(您必须先定义),这意味着Eigen不包含9个元素只是对角线。