我正在尝试使用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 回答
MATLAB的
diff
只是简单地找到矩阵中相邻元素之间的差异(我认为这是行向的默认),因此实现这一点的一个简单方法是Eigen是通过简单的矩阵减法,你只需要确保生成正确的矩阵 .您需要一个函数,给定
m x n
矩阵E
,将创建两个矩阵E1
和E2
.E1
只是E
的第m-1
行,E2
最后m-1
行(E
没有第一行) . 从E2
中减去E1
然后应该给你你想要的 .像这样的东西:
虽然我没有对此进行测试,但这个想法应该是正确的 . 您可以递归地应用它以获得
nth
差异近似值 .这是逐行操作的,如果你想要明智的列
diff
,那么调整这种方法应该是微不足道的 .