如何计算C++;使用特征值 我试图用C++的EGIN库实现下面的Matlab代码(从EeLever,2003)。 m = length(y); E = speye(m); D = diff(E, d); C = chol(E + lambda * D' * D); z = C\(C'\y);
我可以很容易地创建稀疏矩阵:如何计算C++;使用特征值 我试图用C++的EGIN库实现下面的Matlab代码(从EeLever,2003)。 m = length(y); E = speye(m); D = diff(E, d); C = chol(E + lambda * D' * D); z = C\(C'\y);,c++,matlab,matrix,eigen,C++,Matlab,Matrix,Eigen,我可以很容易地创建稀疏矩阵: Eigen::SparseMatrix<int> E(m,m); E.setIdentity(); 如果我不能使用diff,那么我如何有效地生成上述稀疏矩阵?MATLAB的diff只需查找矩阵中相邻元素之间的差异(我认为默认为行),因此实现这一点的简单方法是通过简单的矩阵减法来实现特征值,您只需要确保生成正确的矩阵 您需要一个函数,给定一个mn矩阵E,该函数将创建两个矩阵E1和E2E1只是E的第一行m-1,E2最后一行m-1行(E没有第一行)。从E2中
Eigen::SparseMatrix<int> E(m,m);
E.setIdentity();
如果我不能使用
diff
,那么我如何有效地生成上述稀疏矩阵?MATLAB的diff
只需查找矩阵中相邻元素之间的差异(我认为默认为行),因此实现这一点的简单方法是通过简单的矩阵减法来实现特征值,您只需要确保生成正确的矩阵
您需要一个函数,给定一个mn
矩阵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;
}
Eigen::SparseMatrix diff(Eigen::SparseMatrix E){
Eigen::SparseMatrix E1=E.block(0,0,E.rows()-1,E.cols());
Eigen::SparseMatrix E2=E.block(1,0,E.rows()-1,E.cols());
返回E2-E1;
}
虽然我没有测试过这个,但是这个想法应该是正确的。您可以递归地应用它来获得n
差分近似值
这是按行操作的,如果您希望按列
diff
调整此方法应该很简单。这很好,除了使其递归之外,唯一需要的更改是将其设置为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;
}