Eigen(3)行列Matrixとその簡単な動作

10934 ワード

1.Matrixクラス
Eigenでは、すべての行列とベクトルがMatrixテンプレートクラスのオブジェクトであり、Vectorは特殊な行列(1行または1列)にすぎません.
Matrixには6つのテンプレートパラメータがあり、主に最初の3つのパラメータを使用し、残りはデフォルト値があります.
Matrix

Scalarは要素のタイプを表し、RowsAtCompileTimeは行列の行であり、ColsAtCompileTimeは行列の列である.
ライブラリには、次のような使いやすいタイプがあります.
typedef Matrix Matrix4f;

2.Vectorsベクトル
列ベクトル
typedef Matrix Vector3f;

ラインベクトル
typedef Matrix RowVector2i;

3. Dynamic
Eigenは既知のサイズ(コンパイルフェーズ)のマトリクスに限らず,一部のマトリクスのサイズは実行時に決定されるため,Dynamicという特殊な識別子を導入した.
typedef Matrix MatrixXd;
typedef Matrix VectorXi;
Matrix

4.コンストラクタ
デフォルトのコンストラクション関数では、スペース割り当ては実行されず、マトリクスの要素も初期化されません.
Matrix3f a;
MatrixXf b;

ここで、aは3*3のマトリクスであり、float[9]の空間が割り当てられているが、内部要素は初期化されていない.bは動的サイズのマトリクスであり、未割り当て空間(0*0)と定義される.
サイズを指定したマトリクスは、対応するサイズの空間を割り当てるだけで、要素は初期化されません.
MatrixXf a(10,15);
VectorXf b(30);

ここで、aは10*15の動的サイズのマトリクスであり、空間が割り当てられているが初期化されていない要素である.bは30サイズのベクトルであり、同様に空間未初期化要素を割り当てる.
固定サイズと動的サイズのマトリクスに統一されたAPIを提供するために、指定されたサイズのMatrixに対してsizesを伝達することも合法的である(伝達も無視される).
Matrix3f a(3,3);

コンストラクション関数で4以内の寸法のvectorの初期化を提供できます.
Vector2d a(5.0, 6.0);
Vector3d b(5.0, 6.0, 7.0);
Vector4d c(5.0, 6.0, 7.0, 8.0);

5.要素の取得
要素はカッコで取得され、行列に対しては:(行、列)、ベクトルに対してはインデックスが0で始まるだけです.
#include 
#include 
using namespace Eigen;
int main()
{
  MatrixXd m(2,2);
  m(0,0) = 3;
  m(1,0) = 2.5;
  m(0,1) = -1;
  m(1,1) = m(1,0) + m(0,1);
  std::cout << "Here is the matrix m:
" << m << std::endl;
  VectorXd v(2);
  v(0) = 4;
  v(1) = v(0) - 1;
  std::cout << "Here is the vector v:
" << v << std::endl;
}

しゅつりょく
Here is the matrix m:
  3  -1
2.5 1.5
Here is the vector v:
4
3

m(index)はマトリクス要素を取得するためにも使用できますが、matrixの格納順序によってはデフォルトでカラム別に格納されます.もちろん行別に変更することもできます.
[]オペレータはベクトル要素の取得に使用できますが、matrixには使用できません.C++の[]は1つ以上のパラメータを渡すことができません.
6.カンマ初期化
Matrix3f m;
m << 1, 2, 3,
     4, 5, 6,
     7, 8, 9;
std::cout << m;

7. resizing
matrixのサイズはrows()、cols()、size()で取得でき、resize()は動的matrixのサイズを再調整できます.
#include 
#include 
using namespace Eigen;
int main()
{
  MatrixXd m(2,5);
  m.resize(4,3);
  std::cout << "The matrix m is of size "
            << m.rows() << "x" << m.cols() << std::endl;
  std::cout << "It has " << m.size() << " coefficients" << std::endl;
  VectorXd v(2);
  v.resize(5);
  std::cout << "The vector v is of size " << v.size() << std::endl;
  std::cout << "As a matrix, v is of size "
            << v.rows() << "x" << v.cols() << std::endl;
}

出力:
The matrix m is of size 4x3
It has 12 coefficients
The vector v is of size 5
As a matrix, v is of size 5x1

matrixの実際のサイズが変更されない場合、resize関数は何もしません.resize操作では、コンストラクション関数が実行されます.要素の値が変更され、conservativeResize()を実行したくない場合は変更されます.
APIを統一するために、すべての操作を使用してサイズのmatrixを指定することができます.もちろん、実際にはサイズは変更されません.固定サイズのmatrixを異なる値に変更しようとすると、警告に失敗します.以下だけが合法です.
#include 
#include 
using namespace Eigen;
int main()
{
  Matrix4d m;
  m.resize(4,4); // no operation
  std::cout << "The matrix m is of size "
            << m.rows() << "x" << m.cols() << std::endl;
}

8.assignmentとresizing
assignment(アサイメント)は、オペレータ=であるマトリクスを別のマトリクスにコピーします.Eigenは、左変数のサイズが右変数のサイズに等しくなるように自動的にresizeします.たとえば、次のようになります.
MatrixXf a(2,2);
std::cout << "a is of size " << a.rows() << "x" << a.cols() << std::endl;
MatrixXf b(3,3);
a = b;
std::cout << "a is now of size " << a.rows() << "x" << a.cols() << std::endl;
 
a is of size 2x2
a is now of size 3x3

もちろん、左の量が一定の大きさであれば、上のresizingは許されません.
9.固定寸法vs動寸法
実際には、固定サイズを使うべきか、ダイナミックサイズを使うべきか、簡単な答えは、小さいサイズは固定、大きいサイズはダイナミックです.固定サイズを使用すると、ダイナミックメモリの開口を回避できます.固定サイズは通常の配列にすぎません.  Matrix4f mymatrix;float mymatrix[16];に等しい  MatrixXf mymatrix(rows,columns);float *mymatrix = new float[rows*columns];に等しい
固定寸法(<=4*4)を使用するには、コンパイル前にマトリクスサイズを知る必要があり、32より大きいなどの十分なサイズの場合、固定寸法の収益は無視でき、スタックのクラッシュを引き起こす可能性があります.環境に基づいて、Eigenはダイナミック寸法を最適化します(std::vectorと似ています).
10.その他のテンプレートパラメータ
最初の3つのパラメータについてのみ説明しましたが、完全なテンプレートパラメータは次のとおりです.
Matrix
       int RowsAtCompileTime,
       int ColsAtCompileTime,
       int Options = 0,
       int MaxRowsAtCompileTime = RowsAtCompileTime,
       int MaxColsAtCompileTime = ColsAtCompileTime>
 

Optionsはビットフラグビットです.ここでは、matrixが行単位で格納され、デフォルトは列単位で格納されていることを示すRowMajorについて説明します.Matrix
MaxRowsAtCompileTimeとMaxColsAtCompileTimeは、コンパイルフェーズマトリクスの上限を表します.主にダイナミックメモリ割り当てを回避し、配列を使用します.Matrixfloat [12]に等しい
11.便利な定義
Eigenはいくつかのタイプを定義しています
  • MatrixNt=Matrixは、特にMatrixXi=Matrix
  • がある
  • VectorNt=Matrix例えばVector 2 f=Matrix
  • RowVectorNt=Matrix例えばRowVector 3 d=Matrix
  • Nは2,3,4またはX(Dynamic)であってもよい
    tは、i(int)、f(float)、d(double)、cf(complex)、cd(complex)等であってもよい.