Eigen(3)行列Matrixとその簡単な動作
10934 ワード
1.Matrixクラス
Eigenでは、すべての行列とベクトルがMatrixテンプレートクラスのオブジェクトであり、Vectorは特殊な行列(1行または1列)にすぎません.
Matrixには6つのテンプレートパラメータがあり、主に最初の3つのパラメータを使用し、残りはデフォルト値があります.
Scalarは要素のタイプを表し、RowsAtCompileTimeは行列の行であり、ColsAtCompileTimeは行列の列である.
ライブラリには、次のような使いやすいタイプがあります.
2.Vectorsベクトル
列ベクトル
ラインベクトル
3. Dynamic
Eigenは既知のサイズ(コンパイルフェーズ)のマトリクスに限らず,一部のマトリクスのサイズは実行時に決定されるため,Dynamicという特殊な識別子を導入した.
4.コンストラクタ
デフォルトのコンストラクション関数では、スペース割り当ては実行されず、マトリクスの要素も初期化されません.
ここで、aは3*3のマトリクスであり、float[9]の空間が割り当てられているが、内部要素は初期化されていない.bは動的サイズのマトリクスであり、未割り当て空間(0*0)と定義される.
サイズを指定したマトリクスは、対応するサイズの空間を割り当てるだけで、要素は初期化されません.
ここで、aは10*15の動的サイズのマトリクスであり、空間が割り当てられているが初期化されていない要素である.bは30サイズのベクトルであり、同様に空間未初期化要素を割り当てる.
固定サイズと動的サイズのマトリクスに統一されたAPIを提供するために、指定されたサイズのMatrixに対してsizesを伝達することも合法的である(伝達も無視される).
コンストラクション関数で4以内の寸法のvectorの初期化を提供できます.
5.要素の取得
要素はカッコで取得され、行列に対しては:(行、列)、ベクトルに対してはインデックスが0で始まるだけです.
しゅつりょく
m(index)はマトリクス要素を取得するためにも使用できますが、matrixの格納順序によってはデフォルトでカラム別に格納されます.もちろん行別に変更することもできます.
[]オペレータはベクトル要素の取得に使用できますが、matrixには使用できません.C++の[]は1つ以上のパラメータを渡すことができません.
6.カンマ初期化
7. resizing
matrixのサイズはrows()、cols()、size()で取得でき、resize()は動的matrixのサイズを再調整できます.
出力:
matrixの実際のサイズが変更されない場合、resize関数は何もしません.resize操作では、コンストラクション関数が実行されます.要素の値が変更され、conservativeResize()を実行したくない場合は変更されます.
APIを統一するために、すべての操作を使用してサイズのmatrixを指定することができます.もちろん、実際にはサイズは変更されません.固定サイズのmatrixを異なる値に変更しようとすると、警告に失敗します.以下だけが合法です.
8.assignmentとresizing
assignment(アサイメント)は、オペレータ=であるマトリクスを別のマトリクスにコピーします.Eigenは、左変数のサイズが右変数のサイズに等しくなるように自動的にresizeします.たとえば、次のようになります.
もちろん、左の量が一定の大きさであれば、上のresizingは許されません.
9.固定寸法vs動寸法
実際には、固定サイズを使うべきか、ダイナミックサイズを使うべきか、簡単な答えは、小さいサイズは固定、大きいサイズはダイナミックです.固定サイズを使用すると、ダイナミックメモリの開口を回避できます.固定サイズは通常の配列にすぎません.
固定寸法(<=4*4)を使用するには、コンパイル前にマトリクスサイズを知る必要があり、32より大きいなどの十分なサイズの場合、固定寸法の収益は無視でき、スタックのクラッシュを引き起こす可能性があります.環境に基づいて、Eigenはダイナミック寸法を最適化します(std::vectorと似ています).
10.その他のテンプレートパラメータ
最初の3つのパラメータについてのみ説明しましたが、完全なテンプレートパラメータは次のとおりです.
Optionsはビットフラグビットです.ここでは、matrixが行単位で格納され、デフォルトは列単位で格納されていることを示すRowMajorについて説明します.
MaxRowsAtCompileTimeとMaxColsAtCompileTimeは、コンパイルフェーズマトリクスの上限を表します.主にダイナミックメモリ割り当てを回避し、配列を使用します.
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)等であってもよい.
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は、コンパイルフェーズマトリクスの上限を表します.主にダイナミックメモリ割り当てを回避し、配列を使用します.
Matrix
はfloat [12]
に等しい11.便利な定義
Eigenはいくつかのタイプを定義しています
tは、i(int)、f(float)、d(double)、cf(complex)、cd(complex)等であってもよい.