从索引向量中提取子矩阵

时间:2016-10-16 19:51:22

标签: c++ eigen

我一直在谷歌搜索一段时间,但无法找到这个简单问题的答案。

在matlab中,我可以这样做:

rows = [1 3 5 9];
A = rand(10);
B = A(rows, : );

我如何在本征中做到这一点?它似乎不可能。我发现的最接近的是

MatrixXd a(10,10);
a.row(1); 

,但我想获得多行/列。另一个用户也在这里问了一个问题:How to extract a subvector (of a Eigen::Vector) from a vector of indices in Eigen?,但我认为必须有一些内置的方法,因为这是我认为非常常见的操作。

感谢。

3 个答案:

答案 0 :(得分:7)

虽然在提出这个问题时这是不可能的,但它已被添加到开发分支中!

非常直接:

Eigen::MatrixXf matrix;
Eigen::VectorXi columns;
Eigen::MatrixXf extracted_cols = matrix(Eigen::placeholders::all, columns);

所以我猜这将是3.3.5稳定版。在此之前,开发分支是可行的方法。

答案 1 :(得分:2)

不幸的是,即使在Eigen 3.3中,仍然没有直接支持。一段时间内有此功能请求: http://eigen.tuxfamily.org/bz/show_bug.cgi?id=329

Gael链接到其中一条评论中的示例实现: http://eigen.tuxfamily.org/dox-devel/TopicCustomizing_NullaryExpr.html#title1

答案 2 :(得分:0)

好的,比方说你有一个3x3矩阵:

m = [3   -1   1; 2.5  1.5 6; 4    7   1]

并说你想从m矩阵中提取以下行:

[0 2], // row 0 and row 2

基本上给出了以下矩阵:

new_extracted_matrix = [3 -1 1; 4  7 1]  // row 0 and row 2 of matrix m

这里主要的是,让我们创建一个具有内容[0 2]的向量v,意味着我们将从矩阵m中提取以下行索引。 这是我做的:

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main()
{
  Matrix3f m;
  m(0,0) = 3;
  m(0,1) = -1;
  m(0,2) = 1;  
  m(1,0) = 2.5;
  m(1,1) = m(1,0) + m(0,1);
  m(1,2) = 6;
  m(2,0) = 4;
  m(2,1) = 7;
  m(2,2) = 1;  
  std::cout << "Here is the matrix m:\n" << m << std::endl; // Creating a random 3x3 matrix
  VectorXf v(2);
  v(0) = 0; // Extracting row 0
  v(1) = 2; // Extracting row 2

  MatrixXf r(1,v.size());
  for (int i=0;i<v.size();i++)
  {
      r.col(i) << v(i); // Creating indice vector
  }
  cout << "The extracted row indicies of above matrix: " << endl << r << endl;

  MatrixXf N = MatrixXf::Zero(r.size(),m.cols());
  for (int z=0;z<r.size();z++)
  {
    N.row(z) = m.row(r(z));
  }

  cout << "Extracted rows of given matrix: " << endl << N << endl;
}

这会给我们以下输出:

  

这是矩阵m:    [3 -1 1; 2.5 1.5 6; 4 7 1]

     

以上矩阵的提取行指示:    [0 2]

     

提取的给定矩阵行:    [3 -1 1; 4 7 1]