在特征稀疏矩阵中将行/列/块设置为0?

时间:2014-01-08 03:09:11

标签: eigen

我看到新的Eigen 3.2,你可以从稀疏矩阵中获得行,列或甚至块,有没有办法将这些设置为0?

Eigen::SparseMatrix<float, Eigen::RowMajor> A( 5, 5 );
    A.block(1, 1, 2, 2) = 0; // won't work
    A.row(1) = 0; // won't work
    A.col(1) = 0; // won't work

谢谢!

3 个答案:

答案 0 :(得分:5)

对于5x5矩阵,使用稀疏矩阵是过度的。更好地使用MatrixXd,甚至是Matrix<float,5,5>。在这种情况下,您可以使用A.row(1).setZero()将行设置为零。对于大小约为1000x1000或更大的矩阵,稀疏矩阵是值得的。

无论如何,最好一次抑制稀疏矩阵的多个列和行是使用prune方法。以下是删除第二行和第三列的示例:

#include <Eigen/Sparse>
#include <iostream>

using namespace Eigen;

int main()
{
  Eigen::SparseMatrix<float, Eigen::RowMajor> A;
  A = MatrixXf::Random(5,5).sparseView();
  A.prune([](int i, int j, float) { return i!=1 && j!=2; });
  std::cout << A << "\n";
}

答案 1 :(得分:1)

稀疏矩阵的Eigen教程(Tutorial Sparse: block operations)解释了对于ColumnMajor(resp.RowMajor)稀疏矩阵,列(resp.row)子矩阵运算符具有写访问权。

因此,例如,要将rowmajor稀疏矩阵的第2行,第3行和第4行设置为零,您可以执行以下操作: Eigen::SparseMatrix<float, Eigen::RowMajor> A; A = MatrixXf::Random(5,5).sparseView(); A.middleRows(1,3) = Eigen::SparseMatrix<float,Eigen::RowMajor>(3,A.cols());

并保留prune()以设置行主矩阵和副主列的零列。

答案 2 :(得分:0)

对于初学者来说,将行/列/块设置为零的最简单方法是将其乘以0.0。

Eigen::SparseMatrix<float, Eigen::RowMajor> A;

A = MatrixXf::Random(8,8).sparseView(); //Initialize to random values

A.block(1, 1, 2, 2) *= 0; //Set a block to 0
A.row(1) *= 0;            //Set a row to 0
A.col(1) *= 0;            //Set a column to 0

std::cout << A << "\n";

如果稀疏矩阵的密度很高,则使用prune()将块设置为零会更快,但是对于大多数情况,*= 0很快,并且您不必根据RowMajor / ColMajor排序。

如果将行/列设置为0后,您真的对空闲内存感兴趣,只需在完成矩阵编辑后添加A.prune(0,0)