如何使用 Eigen 在 C++ 中计算稀疏矩阵的差异

How to calculate diff of sparse matrix in C++ using Eigen

我正在尝试使用 Eigen 库在 C++ 中实现以下 MATLAB 代码(来自 Eilers,2003)。

m = length(y);
E = speye(m);
D = diff(E, d);
C = chol(E + lambda * D' * D);
z = C\(C'\y);

我可以很容易地创建一个稀疏矩阵:

Eigen::SparseMatrix<int> E(m,m);
E.setIdentity();

但是对于稀疏矩阵,Eigen 中的 diff 等价于什么?


我也可以假设差值为 3,给出 -1, 3, -3, 1 的系数。对于大小为 10 x 10 的初始矩阵,这看起来像:

-1 3 -3 1 0 0 0 0 0 0
0 -1 3 -3 1 0 0 0 0 0 
0 0 -1 3 -3 1 0 0 0 0
0 0 0 -1 3 -3 1 0 0 0
0 0 0 0 -1 3 -3 1 0 0
0 0 0 0 0 -1 3 -3 1 0
0 0 0 0 0 0 -1 3 -3 1

如果我不能使用diff那么我怎样才能有效地生成上面的稀疏矩阵?

MATLAB 的 diff 只是找出矩阵中相邻元素之间的差异(我认为默认为按行),因此实现此目的的一种简单方法是 Eigen 是通过简单的矩阵减法,您只需要确保生成正确的矩阵。

您需要一个函数,给定一个 m x n 矩阵 E,将创建两个矩阵 E1E2E1 只是 E 的前 m-1 行,E2 最后 m-1 行(E 没有第一行)。从 E2 中减去 E1 应该会给你你想要的。

像这样:

Eigen::SparseMatrix<double> diff(Eigen::SparseMatrix<double> E) {
    Eigen::SparseMatrix<double> E1 = E.block(0, 0, E.rows()-1, E.cols());
    Eigen::SparseMatrix<double> E2 = E.block(1, 0, E.rows()-1, E.cols());
    return E2 - E1;
}

虽然我没有测试过,但是思路应该是正确的。您可以递归地应用它以获得 nth 差异近似值。

这是按行操作的,如果你想按列操作diff,适应这种方法应该很简单。