Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何计算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 - Fatal编程技术网

如何计算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;
}