如何使用特征计算C++中稀疏矩阵的差分

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

本文关键字:特征 何使用 计算 C++      更新时间:2023-10-16

我正在尝试使用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();
但是,对于

稀疏矩阵,本征中的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只是找到矩阵中相邻元素之间的差异(我认为默认为逐行(,因此实现此目的的一种简单方法是特征是通过简单的矩阵减法,您只需要确保生成正确的矩阵。

你需要一个函数,给定一个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调整这种方法应该是微不足道的。