构造特征线中的对角矩阵

时间:2016-05-27 20:53:38

标签: eigen

在本征中,我们可以创建一个矩阵

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矩阵相同?

2 个答案:

答案 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个元素只是对角线。