Eigen3 在给定行索引向量的情况下,构建由一些源矩阵行组成的新矩阵

Eigen3 在给定行索引向量的情况下,构建由一些源矩阵行组成的新矩阵,eigen3,Eigen3,我想构建一个新的矩阵,它由给定非连续索引向量的一些源矩阵行组成 也就是说,我想要一个row函数,它获取索引列表并返回存储在新矩阵中的行列表: VectorXi v = VectorXi::LinSpaced( 4, 10, 13); MatrixXi m = v.rowwise().replicate( 4 ); VectorXi r1 ( ( VectorXi(3) << 0, 3, 1 ).finished() ); // Here is some pseu

我想构建一个新的矩阵,它由给定非连续索引向量的一些源矩阵行组成

也就是说,我想要一个row函数,它获取索引列表并返回存储在新矩阵中的行列表:

  VectorXi v = VectorXi::LinSpaced( 4, 10, 13);
  MatrixXi m = v.rowwise().replicate( 4 );
  VectorXi r1 ( ( VectorXi(3) <<  0,  3, 1 ).finished() );

  // Here is some pseudo code to create the desired matrix N :
  MatrixXi N = m.row(r1);

  cout << "m = " << m << endl;
  cout << "r1 = " << r1 << endl;
  cout << "N = " << N << endl;
非常感谢你的帮助


Sylvain

使用开发分支并至少启用C++11,您可以编写:

Eigen::MatrixXi N = m(r1,Eigen::all);
这类似于Matlab语法:

N = m(r1, :);
您还可以直接传递{x,…}-list,或者任何行为类似于std::vector的东西都必须提供大小函数和运算符[],并返回整数类型,例如:

std::vector<int> c2{{3,0}};
std::cout << "m({2,1},c2) = \n" << m({2,1}, c2) << '\n';

Godbolt演示:

您好,非常感谢您提供了这一全面且极具教育意义的答案。我确实看到了v。3.3.90提供了非常好的设施。不过,我一直在开发一种代码,它必须非常可靠,因为它将嵌入到一个重要的科学系统中。你认为把我的软件建立在Eigen开发分支上会有危险吗?。。。。干杯Sylvain总的来说,开发部门应该保留使用,但我不敢做出任何承诺或保证。当然,如果你的代码很重要,你必须确保你的代码是彻底的和定期的单元测试,尤其是每次你更新你的Eigen版本,你不需要经常这样做。即使Eigen没有bug,它也有很多被误用的方法,而且不是所有的东西都被断言所覆盖。嗨,chtz!你知道它是否存在一些在线的Egen dev版本文档,上面所描述的内容都在这些文档中得到了解决吗?干杯知道了!很抱歉打扰您:
std::vector<int> c2{{3,0}};
std::cout << "m({2,1},c2) = \n" << m({2,1}, c2) << '\n';
m({2,1}, c2) = Eigen::Matrix2i{{1,2},{3,4}};
std::cout << m << '\n';