我一直在谷歌搜索一段时间,但无法找到这个简单问题的答案。
在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?,但我认为必须有一些内置的方法,因为这是我认为非常常见的操作。
感谢。
答案 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]