稀疏特征矩阵的子集列

Subset columns of sparse eigen matrix

我想获取一些稀疏矩阵的子集列(列优先) 据我所知,Eigen 中有 indexing 个东西。 但我不能将其称为稀疏矩阵:

Eigen::SparseMatrix<double> m;
std::vector<int> indices = {1, 5, 3, 6};
// error: type 'Eigen::SparseMatrix<double>' does not provide a call operator
m(Eigen::all, indices); 

有什么解决方法吗?

UPD1 明确指定列可以按任意顺序排列。

SparseMatrix实际上没有提供任何operator(),所以这是做不到的。

编辑:以下是针对旧版本的问题。

如果您的实际用例也有 属性 您要访问的列是相邻的,您可以改用

SparseMatrix<double,ColMajor> m(5,5);
int j = 1;
int number_of_columns=2;
m.middleCols(j,number_of_columns) = ...;

还有m.leftCols(number_of_columns)m.rightCols(number_of_columns) 这些甚至是可写的,因为矩阵是 column-major.

所有其他块表达式均已定义,但 read-only,请参阅 the corresponding Sparse Matrix documentation

编辑:回答更新后的问题: 我猜你将无法避免复制。通过复制可以这样完成(未测试)

Eigen::SparseMatrix<double> m;
std::vector<int> indices = {1, 5, 3, 6};
Eigen::SparseMatrix<double> column_subset(m.rows(),indices.size());
for(int j =0;j!=column_subset.cols();++j){
column_subset.col(j)=m.col(indices[j]);
}