gpt4 book ai didi

c++ - 对于 Eigen SparseMatrix,innerIndexPtr() 和 outerIndexPtr() 到底代表什么?

转载 作者:搜寻专家 更新时间:2023-10-31 00:50:29 27 4
gpt4 key购买 nike

我正在使用 Eigen::SparseMatrix,但我无法理解 innerIndexPtrouterIndexPtr 的含义。 the official page的解释对我来说很模糊。直觉上,我认为 innerIndexPtr 是非零元素的行索引,outerIndexPtr 是非零元素的列索引,但显然事实并非如此。请看下面的例子,

std::vector<Eigen::Triplet<double>> triplet;

triplet.emplace_back(0, 0, 10);
triplet.emplace_back(2, 0, 11);

Eigen::SparseMatrix<double> A(3, 3);

A.setFromTriplets(triplet.begin(), triplet.end());

std::cout << A.innerIndexPtr()[0] << std::endl; // prints 0
std::cout << A.innerIndexPtr()[1] << std::endl; // prints 2
std::cout << std::endl;
std::cout << A.outerIndexPtr()[0] << std::endl; // prints 0
std::cout << A.outerIndexPtr()[1] << std::endl; // prints 2, but I thought it should print 0
std::cout << std::endl;
std::cout << A.valuePtr()[0] << std::endl; // prints 10
std::cout << A.valuePtr()[1] << std::endl; // prints 11

谁能给我解释一下 innerIndexPtrouterIndexPtr 到底代表什么?

最佳答案

你的矩阵看起来像这样:

    (0) (1) (2)
(0) 10 0 0
(1) 0 0 0
(2) 11 0 0

在内部,稀疏由四个紧凑数组组成:

  • Values: stores the coefficient values of the non-zeros.
  • InnerIndices: stores the row (resp. column) indices of the non-zeros.
  • OuterStarts: stores for each column (resp. row) the index of the first non-zero in the previous two arrays.
  • InnerNNZs: stores the number of non-zeros of each column (resp. row). The word inner refers to an inner vector that is a column for a column-major matrix, or a row for a row-major matrix. The word outer refers to the other direction.

(参见 Sparse matrix manipulations)

您的矩阵存储为:

      Values: 10 11
InnerIndices: 0 2

OuterStarts: 0 2 2
InnerNNZs: 2 0 0

引用手册:

Low-level API

sm1.valuePtr();      // Pointer to the values
sm1.innerIndexPtr(); // Pointer to the indices.
sm1.outerIndexPtr(); // Pointer to the beginning of each inner vector

因此,valuePtr()返回[10, 11]innerIndexPtr()返回[0, 2]outerIndexPtr() 返回 [0, 2, 2]。这应该可以解释您观察到的结果。


关于 OuterStarts 数组的一些解释:编号为 1 和 2 的列由零组成。这不会影响外部索引。编号为 1 的列从位置 2 开始并在位置 2 结束。编号为 2 的列也从位置 2 开始并在位置 2 结束。它们完全由零组成的事实仅意味着它们的大小为零。我同意手册中对 OuterStarts 的解释有点误导。将“第一个非零”视为结束后的元素。

关于c++ - 对于 Eigen SparseMatrix,innerIndexPtr() 和 outerIndexPtr() 到底代表什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57367167/

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