我尝试使用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
那么我该如何有效地生成上述稀疏矩阵?
答案 0 :(得分:2)
MATLAB的diff
只是找到矩阵中相邻元素之间的差异(我认为默认为行),所以实现这一点的简单方法是Eigen是通过简单的矩阵减法,你只需要确保你生成了正确的矩阵。
您需要一个函数,给定m x n
矩阵E
,将创建两个矩阵E1
和E2
。 E1
只是m-1
的第E
行,E2
行m-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
,那么适应这种方法应该是微不足道的。