2014-01-08 383 views
2

我看到新的Eigen 3.2,你可以从一个稀疏矩阵得到行,列或者甚至是块,有没有办法将其中的任何一个设置为0?在Eigen稀疏矩阵中将行/列/块设置为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

你想要什么?用明确的零替换非零?用明确的零填充行?删除所有非零?然后你想要做什么?保持空吗?用新值填充它?最后,简单地删除行/列不会更快吗? – ggael

+0

嗨ggael,我想删除该行/列的所有非零条目,但不是行/列本身,因为我仍然需要该矩阵为5 x 5. – echo

回答

5

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

无论如何,一次最好抑制一个稀疏矩阵的多个列和行是使用修剪方法。下面是一个例子移除第二行和第三列:

#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"; 
} 
+0

5,5矩阵只是一个例子对于问题和测试。感谢有关修剪的信息。 – echo

+0

ggael,我想知道这个修剪函数是否会遍历矩阵中的每个(i,j)?它的确如此,似乎这将导致大矩阵的性能问题。 – echo

+0

它只遍历非零。如果你想删除一个列主矩阵的列,那么这是过分的,但是为了移除列主矩阵的一行,那么这个策略并不是太糟糕,因为每列的非零数目被假定为很小,所以线性搜索不会比二分搜索慢很多(如果删除多行,这样会更好)。 – ggael

1

本征的教程稀疏矩阵(Tutorial Sparse: block operations)解释为ColumnMajor(相应RowMajor。)稀疏矩阵,列(相应行。)子矩阵算有写入权限。

因此,例如,设置为零的第二,第三和rowmajor稀疏矩阵的第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()设置以行为主的矩阵和vicevesa的零列。