如何用Cigen计算C ++中稀疏矩阵的diff

时间:2017-03-17 08:56:17

标签: c++ matlab matrix 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();

但是稀疏矩阵的特征中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那么我该如何有效地生成上述稀疏矩阵?

1 个答案:

答案 0 :(得分:2)

MATLAB的diff只是找到矩阵中相邻元素之间的差异(我认为默认为行),所以实现这一点的简单方法是Eigen是通过简单的矩阵减法,你只需要确保你生成了正确的矩阵。

您需要一个函数,给定m x n矩阵E,将创建两个矩阵E1E2E1只是m-1的第E行,E2m-1行(E没有第一行)。从E1中减去E2应该可以为您提供所需内容。

这样的事情:

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,那么适应这种方法应该是微不足道的。