首页 > 代码库 > Eigen教程(5)

Eigen教程(5)

整理下Eigen库的教程,参考:http://eigen.tuxfamily.org/dox/index.html

块操作

块是matrix或array中的矩形子部分。

使用块

函数.block(),有两种形式

operation构建一个动态尺寸的block构建一个固定尺寸的block
起点(i,j)块大小(p,q) .block(i,j,p,q) .block< p,q >(i,j)

Eigen中,索引从0开始。

两个版本都可以用于固定尺寸和动态尺寸的matrix/array。功能是等价的,只是固定尺寸的版本在block较小时速度更快一些。

int main()
{
  Eigen::MatrixXf m(4,4);
  m <<  1, 2, 3, 4,
        5, 6, 7, 8,
        9,10,11,12,
       13,14,15,16;
  cout << "Block in the middle" << endl;
  cout << m.block<2,2>(1,1) << endl << endl;
  for (int i = 1; i <= 3; ++i)
  {
    cout << "Block of size " << i << "x" << i << endl;
    cout << m.block(0,0,i,i) << endl << endl;
  }
}

输出

Block in the middle
 6  7
10 11

Block of size 1x1
1

Block of size 2x2
1 2
5 6

Block of size 3x3
 1  2  3
 5  6  7
 9 10 11

作为左值

int main()
{
  Array22f m;
  m << 1,2,
       3,4;
  Array44f a = Array44f::Constant(0.6);
  cout << "Here is the array a:" << endl << a << endl << endl;
  a.block<2,2>(1,1) = m;
  cout << "Here is now a with m copied into its central 2x2 block:" << endl << a << endl << endl;
  a.block(0,0,2,3) = a.block(2,1,2,3);
  cout << "Here is now a with bottom-right 2x3 block copied into top-left 2x2 block:" << endl << a << endl << endl;
}

输出

Here is the array a:
0.6 0.6 0.6 0.6
0.6 0.6 0.6 0.6
0.6 0.6 0.6 0.6
0.6 0.6 0.6 0.6

Here is now a with m copied into its central 2x2 block:
0.6 0.6 0.6 0.6
0.6   1   2 0.6
0.6   3   4 0.6
0.6 0.6 0.6 0.6

Here is now a with bottom-right 2x3 block copied into top-left 2x2 block:
  3   4 0.6 0.6
0.6 0.6 0.6 0.6
0.6   3   4 0.6
0.6 0.6 0.6 0.6

行和列

OperationMethod
ith row matrix.row(i)
jth colum matrix.col(j)
int main()
{
  Eigen::MatrixXf m(3,3);
  m << 1,2,3,
       4,5,6,
       7,8,9;
  cout << "Here is the matrix m:" << endl << m << endl;
  cout << "2nd Row: " << m.row(1) << endl;
  m.col(2) += 3 * m.col(0);
  cout << "After adding 3 times the first column into the third column, the matrix m is:\n";
  cout << m << endl;
}

输出

Here is the matrix m:
1 2 3
4 5 6
7 8 9
2nd Row: 4 5 6
After adding 3 times the first column into the third column, the matrix m is:
 1  2  6
 4  5 18
 7  8 30

角相关操作

operationdynamic-size blockfixed-size block
左上角p\*q matrix.topLeftCorner(p,q); matrix.topLeftCorner< p,q >();
左下角p\*q matrix.bottomLeftCorner(p,q); matrix.bottomLeftCorner< p,q >();
右上角p\*q matrix.topRightCorner(p,q); matrix.topRightCorner< p,q >();
右下角p\*q matrix.bottomRightCorner(p,q); matrix.bottomRightCorner< p,q >();
前q行 matrix.topRows(q); matrix.topRows< q >();
后q行 matrix.bottomRows(q); matrix.bottomRows< q >();
左p列 matrix.leftCols(p); matrix.leftCols< p >();
右p列 matrix.rightCols(p); matrix.rightCols< p >();
int main()
{
  Eigen::Matrix4f m;
  m << 1, 2, 3, 4,
       5, 6, 7, 8,
       9, 10,11,12,
       13,14,15,16;
  cout << "m.leftCols(2) =" << endl << m.leftCols(2) << endl << endl;
  cout << "m.bottomRows<2>() =" << endl << m.bottomRows<2>() << endl << endl;
  m.topLeftCorner(1,3) = m.bottomRightCorner(3,1).transpose();
  cout << "After assignment, m = " << endl << m << endl;
}

输出

m.leftCols(2) =
 1  2
 5  6
 9 10
13 14

m.bottomRows<2>() =
 9 10 11 12
13 14 15 16

After assignment, m = 
 8 12 16  4
 5  6  7  8
 9 10 11 12
13 14 15 16

vectors的块操作

operationdynamic-size blockfixed-size block
前n个 vector.head(n); vector.head< n >();
后n个 vector.tail(n); vector.tail< n >();
i起始的n个元素 vector.segment(i,n); vector.segment< n >(i);

Eigen教程(5)