web-dev-qa-db-ja.com

固有値の対角行列の作成

固有では、次のように行列を作成できます。

Matrix3f m;
m << 1, 2, 3,
     4, 5, 6,
     7, 8, 9;

以下のような対角行列を作成するにはどうすればよいですか

 3, 0, 0,
 0, 8, 0,
 0, 0, 6;

Eigenが対角行列を処理する方法がわかりませんか?ここでは、対角要素のみが重要です。したがって、Eigenは上記の例の9つの要素をすべて保存しますか、それとも3つだけの要素を保存します3,8,6。また、固有値が9つの要素すべてを保存する場合、行列を対角線として定義する必要がありますか、それとも通常の3 * 3行列を定義するのと同じですか?

12
asdfkjasdfjk

スタンドアロンの対角行列が必要な場合は、 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()は行列の対角部分を抽出し、対角行列と見なします。

21
jdh8

ここにコードがあり、それが出力されます:

コード:

#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を保持することを意味します対角要素だけではありません。

5
Vtik