gpt4 book ai didi

c++ - Eigen 中的稀疏矩阵

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:17:44 27 4
gpt4 key购买 nike

如果我按如下方式在 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);

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

最佳答案

使用 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() 是否需要的内存存储真的更少。

关于c++ - Eigen 中的稀疏矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22049568/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com