• 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:
    ";
      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);
  • 相关阅读:
    交换函数作业
    对本课程的期望及对老师的建议
    前一半元素与后一半元素交换
    使用多线程(newSingleThreadScheduledExecutor)创建一个定时任务
    js判断是否为整数
    kafka入门及使用(不用集成spring)
    Eclipse 必须安装的几个插件
    mybatis 批量插入/批量修改的写法
    maven pom.xml中出现错误failOnMissingWebXml Dynamic Web Module 3.1 requires Java 1.7 or newer,每次update后都会回滚到1.5解决方案
    Eclipse 插件安装及相关问题解决方案(svn、spring、gradle、git)
  • 原文地址:https://www.cnblogs.com/houkai/p/6349974.html
Copyright © 2020-2023  润新知