如何使用特征计算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();
但是,对于稀疏矩阵,本征中的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
只是找到矩阵中相邻元素之间的差异(我认为默认为逐行(,因此实现此目的的一种简单方法是特征是通过简单的矩阵减法,您只需要确保生成正确的矩阵。
你需要一个函数,给定一个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
调整这种方法应该是微不足道的。
相关文章:
- 使用指针在存在特征库的情况下动态分配 c++ 中的矩阵
- C++ 特征图3.5,特征图不使用命名返回值优化?
- 特征,错误地使用了不同类型的逗号初始值设定项
- 为什么我不能在同一 MS VS 解决方案中的两个控制台应用中使用C++特征(仅标头库)?
- 使用 C++17 编译特征需要_SILENCE_CXX17_NEGATORS_DEPRECATION_WARNING定义
- 在C++中使用OpenCV矩阵中的特征将图像旋转90度
- 计算数组的特征值/向量,而不是使用特征 3 计算矩阵
- 如何在没有返回值的情况下使用(特征)unaryExpr 和 lambda 函数?
- 使用特征矩阵的复矩阵乘法
- 如何使用类型特征将函数的通用引用参数限制为 r 值引用?
- 使用特征C++需要哪个代码块编译器?
- 特征::向量;在函数中使用 Eigen::Matrix3f 的值初始化向量,大于 4 个条目
- 有没有更好的方法可以使用特征/C++实现 matlab 的逻辑索引?
- 将帕迪索求解器与特征一起使用
- 如何将 stl 迭代器与特征一起使用?
- 将 libquadmath 与特征一起使用
- 特征库 --> 使用文件或现有 std::vector<string> content (c++) 中的数据初始化矩阵
- 对模板化函数中的通用特征矩阵使用 Ref<>
- 在特征中使用std::nth_element和相关的询问
- 使用 AVX2 编译时,特征无法使用 "Reference to EBX in function requiring stack alignment" 进行编译