1.5eigen中高級初始化


1.5 高級初始化

這一節討論一些初始化矩陣的高級方法。

1.The comma initializer

eigen提供一個簡單設定所有矩陣系數、向量、數組系數的初始化語法,從左上角開始到右下角結束。

Matrix3f m;
m << 1, 2, 3,
4, 5, 6,
7, 8, 9;
std::cout << m;
//output
1 2 3
4 5 6
7 8 9

另外,這個初始化也可以將多個向量或者矩陣結合起來,但是必須記住你在使用初始化器之前需要設置大小:

RowVectorXd vec1(3);
vec1 << 1, 2, 3;
std::cout << "vec1 = " << vec1 << std::endl;
RowVectorXd vec2(4);
vec2 << 1, 4, 9, 16;
std::cout << "vec2 = " << vec2 << std::endl;
RowVectorXd joined(7);
joined << vec1, vec2;//vec1后接vec2
std::cout << "joined = " << joined << std::endl;
//output
vec1 = 1 2 3
vec2 = 1 4 9 16
joined = 1 2 3 1 4 9 16

我們也可以使用塊來初始化矩陣:

MatrixXf matA(2, 2);
matA << 1, 2, 3, 4;
MatrixXf matB(4, 4);
matB << matA, matA/10, matA/10, matA;
std::cout << matB << std::endl;
//output
1 2 0.1 0.2
3 4 0.3 0.4
0.1 0.2 1 2
0.3 0.4 3 4

 

這樣的初始化形式也能初始化矩陣的塊,比如:

Matrix3f m;
m.row(0) << 1, 2, 3;
m.block(1,0,2,2) << 4, 5, 7, 8;
m.col(2).tail(2) << 6, 9;
std::cout << m;
//output
1 2 3
4 5 6
7 8 9

 


2.特殊的矩陣和數組

矩陣和數組類同樣也有靜態成員(訪問得用作用域訪問符)的方法比如Zero(),初始化所有系數為0。有三種用法:第一種是空括號,使用與固定大小的對象;第二種是帶一個參數的括號,適用於一維的動態大小對象;第三種是帶有兩個參數的括號,適用於二維的動態大小的對象。如下:

std::cout << "A fixed-size array:\n";
Array33f a1 = Array33f::Zero();
std::cout << a1 << "\n\n";
std::cout << "A one-dimensional dynamic-size array:\n";
ArrayXf a2 = ArrayXf::Zero(3);
std::cout << a2 << "\n\n";
std::cout << "A two-dimensional dynamic-size array:\n";
ArrayXXf a3 = ArrayXXf::Zero(3, 4);
std::cout << a3 << "\n";
//output
A fixed-size array:
0 0 0
0 0 0
0 0 0
A one-dimensional dynamic-size array:
0
0
0
A two-dimensional dynamic-size array:
0 0 0 0
0 0 0 0
0 0 0 0

 

類似地,靜態成員Constan(value)設置所有系數為某個常數。如果對象的大小需要確定,則在數值參數之前需要額外的兩個參數,例如MatrixXd::Constant(rows, cols, value)Random()的靜態成員是給矩陣或數組設置任一的值。單位矩陣是用Identity()函數,這個函數只適用與矩陣,而不適用與數組,因為單位矩陣是線性代數的概念。函數LinSpaced(size,low,high)只適用與向量和一維數組,它讓某一大小的向量或數組的系數均勻地從低到高的填滿,如下所示:

ArrayXXf table(10, 4);
table.col(0) = ArrayXf::LinSpaced(10, 0, 90);
table.col(1) = M_PI / 180 * table.col(0);
table.col(2) = table.col(1).sin();
table.col(3) = table.col(1).cos();
std::cout << " Degrees Radians Sine Cosine\n";
std::cout << table << std::endl;
//output
Degrees Radians Sine Cosine
0 0 0 1
10 0.175 0.174 0.985
20 0.349 0.342 0.94
30 0.524 0.5 0.866
40 0.698 0.643 0.766
50 0.873 0.766 0.643
60 1.05 0.866 0.5
70 1.22 0.94 0.342
80 1.4 0.985 0.174
90 1.57 1 -4.37e-08

 

以上的函數都是將函數返回值賦值給需要的矩陣而不是直接在需要改變的矩陣上使用,如果想直接在現有矩陣上改變,可以使用setZero(),setIdentity(),setLinSpaced()函數:

const int size = 6;

MatrixXd mat1(size, size);

mat1.topLeftCorner(size/2, size/2) = MatrixXd::Zero(size/2, size/2);

mat1.topRightCorner(size/2, size/2) = MatrixXd::Identity(size/2, size/2);

mat1.bottomLeftCorner(size/2, size/2) = MatrixXd::Identity(size/2, size/2);

mat1.bottomRightCorner(size/2, size/2) = MatrixXd::Zero(size/2, size/2);

std::cout << mat1 << std::endl << std::endl;

MatrixXd mat2(size, size);

mat2.topLeftCorner(size/2, size/2).setZero();

mat2.topRightCorner(size/2, size/2).setIdentity();

mat2.bottomLeftCorner(size/2, size/2).setIdentity();

mat2.bottomRightCorner(size/2, size/2).setZero();
std::cout << mat2 << std::endl << std::endl;
MatrixXd mat3(size, size);
mat3 << MatrixXd::Zero(size/2, size/2), MatrixXd::Identity(size/2, size/2),
MatrixXd::Identity(size/2, size/2), MatrixXd::Zero(size/2, size/2);
std::cout << mat3 << std::endl;
//output
0 0 0 1 0 0
0 0 0 0 1 0
0 0 0 0 0 1
1 0 0 0 0 0
0 1 0 0 0 0
0 0 1 0 0 0

0 0 0 1 0 0
0 0 0 0 1 0
0 0 0 0 0 1
1 0 0 0 0 0
0 1 0 0 0 0
0 0 1 0 0 0

0 0 0 1 0 0
0 0 0 0 1 0
0 0 0 0 0 1
1 0 0 0 0 0
0 1 0 0 0 0
0 0 1 0 0 0

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM