我看到新的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
谢谢!
答案 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)
。