首页 文章

如何用C赋值计算C中稀疏矩阵的差分

提问于
浏览
2

我正在尝试使用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();

But what's the equivalent of diff in Eigen for a sparse matrix?


我可以选择假设差值为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

If I can't use diff then how can I efficiently generate the above sparse matrix?

1 回答

  • 2

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

    您需要一个函数,给定 m x n 矩阵 E ,将创建两个矩阵 E1E2 . E1 只是 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 ,那么调整这种方法应该是微不足道的 .

相关问题