Eigen中的SparseMatrix

时间:2014-02-26 18:04:23

标签: c++ eigen

如果我在Eigen中设置SparseMatrix条目的值如下:

sparse_matrix->coeffref(10, 10) = 0;

这实际上会缩小矩阵所需的存储空间,还是会尝试存储0并在那里使用4个字节(假设整数类型)?

如果答案是后者,我如何将列设置为0,以便它不使用任何额外的空间?

此外,这样的事情:

typedef Eigen::Triplet<double> TripletType;
std::vector<TripletType> t;
for (int i = 0; i < some_value; ++i) {
    for (int j = 0; j < some_value; ++j) {
        t->push_back(TripletType(i, j, 0);
    }
}
sparse_matrix->setFromTriplets(t);

这会在稀疏矩阵中产生显式零吗?

1 个答案:

答案 0 :(得分:1)

使用coeffref插入后,您可以修剪稀疏矩阵,如:

Eigen::SparseMatrix<double, Eigen::ColMajor> A(5,5); // fill A A.insert(0,0)=9.; A.insert(1,0)=3.0/2.0; A.insert(0,1)=3.0/2.0; A.insert(2,0)=6.0; A.insert(0,2)=6.0; A.insert(3,0)=3.0/4.0; A.insert(0,3)=3.0/4.0; A.insert(4,0)=3.0; A.insert(0,4)=3.0; A.insert(1,1)=1.0/2.0; A.insert(2,2)=12.0; A.insert(3,3)=5.0/8.0; A.insert(4,4)=16.0; std::cout << A << std::endl; std::cout << A.data().size() << std::endl; A.coeffRef(3,0) = 0; A.prune(0,0); // Suppresses all nonzeros which are much smaller than reference under the tolerence epsilon std::cout << A << std::endl; std::cout << A.data().size() << std::endl;

输出:

Nonzero entries:
(9,0) (1.5,1) (6,2) (0.75,3) (3,4) (_,_) (_,_) (_,_) (1.5,0) (0.5,1) (6,0) (12,2
) (0.75,0) (0.625,3) (3,0) (16,4)

Outer pointers:
0 8 10 12 14  $
Inner non zeros:
5 2 2 2 2  $

9 1.5 6 0.75 3
1.5 0.5 0 0 0
6 0 12 0 0
0.75 0 0 0.625 0
3 0 0 0 16

16
Nonzero entries:
(9,0) (1.5,1) (6,2) (3,4) (1.5,0) (0.5,1) (6,0) (12,2) (0.75,0) (0.625,3) (3,0)
(16,4)

Outer pointers:
0 4 6 8 10  $

9 1.5 6 0.75 3
1.5 0.5 0 0 0
6 0 12 0 0
0 0 0 0.625 0
3 0 0 0 16

12

您可以看到尺寸已从16更改为12,同时删除了三个(_,_)

我没有检查sizeof(),如果需要的内存存储真的少了。