如何使用 Eigen 在 C++ 中计算稀疏矩阵的差异
How to calculate diff of sparse matrix in C++ using 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();
但是对于稀疏矩阵,Eigen 中的 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
只是找出矩阵中相邻元素之间的差异(我认为默认为按行),因此实现此目的的一种简单方法是 Eigen 是通过简单的矩阵减法,您只需要确保生成正确的矩阵。
您需要一个函数,给定一个 m x n
矩阵 E
,将创建两个矩阵 E1
和 E2
。 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
,适应这种方法应该很简单。
我正在尝试使用 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();
但是对于稀疏矩阵,Eigen 中的 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
只是找出矩阵中相邻元素之间的差异(我认为默认为按行),因此实现此目的的一种简单方法是 Eigen 是通过简单的矩阵减法,您只需要确保生成正确的矩阵。
您需要一个函数,给定一个 m x n
矩阵 E
,将创建两个矩阵 E1
和 E2
。 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
,适应这种方法应该很简单。