Eigen(6)快操作

1. 块操作

    块是matrixarray中的矩形子部分。

2. 使用块

    函数.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

3. 行和列

Operation

Method

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

4. 角相关操作

operation

dynamic-size block

fixed-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

5. vectors的块操作

operation

dynamic-size block

fixed-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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值