2014-01-08 46 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的零列。