【问题标题】:SparseMatrix in EigenEigen 中的稀疏矩阵
【发布时间】:2023-03-16 13:57:01
【问题描述】:

如果我在 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);

这会导致稀疏矩阵中显式为零吗?

【问题讨论】:

    标签: c++ eigen


    【解决方案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()。

    【讨论】:

    • 不确定 sizeof 是否会为您提供该信息(稀疏矩阵使用堆分配 afaik)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    相关资源
    最近更新 更多