2

我是 C++ 编程的新手。我必须实现一个程序来计算矩阵的伪逆。正如 Eigen 教程所建议的,我编写了这样的代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <Core>
    #include <iostream>
    #include <Eigen/Dense>
    #include <Eigen/SVD>
    #include <Eigen/Eigen>
    using namespace Eigen;
    using namespace std;



    void pinv(MatrixXf& pinvmat)
     {
    ei_assert(m_isInitialized && "SVD is not initialized.");
   double  pinvtoler=1.e-6;                       // choose tolerance 
    SingularValuesType m_sigma_inv=m_sigma;
    for ( long i=0; i<m_workMatrix.cols(); ++i) {
    if ( m_sigma(i) > pinvtoler )
     m_sigma_inv(i)=1.0/m_sigma(i);
   else m_sigma_inv(i)=0;
   }
    pinvmat = (m_matV*m_sigma_inv.asDiagonal()*m_matU.transpose());


   }

    int main()
   {

    MatrixXf A(3,2);
    A<<1,2,3,4,5,6;
    pinv(A);
    cout << "pinv =" << endl << A << endl;
    return 0;
   }

如果我尝试编译它,我会得到错误:

tut_eigen/pinv.cpp:在函数 'void pinv(Eigen::MatrixXf&)' 中:
tut_eigen/pinv.cpp:18:14: 错误: 'm_isInitialized' 未在此范围内声明
tut_eigen/pinv.cpp:18:58: 错误: 'ei_assert' 未在此范围内声明
tut_eigen/pinv.cpp:20:4:错误:未在此范围内声明“SingularValuesType”
tut_eigen/pinv.cpp:20:23: 错误: 预期';' 在“m_sigma_inv”之前
tut_eigen/pinv.cpp:21:22: 错误: 'm_workMatrix' 未在此范围内声明
tut_eigen/pinv.cpp:22:19: 错误: 'm_sigma' 未在此范围内声明
tut_eigen/pinv.cpp:23:19: 错误: 'm_sigma_inv' 未在此范围内声明
tut_eigen/pinv.cpp:24:22: 错误: 'm_sigma_inv' 未在此范围内声明
tut_eigen/pinv.cpp:26:15: 错误: 'm_matV' 未在此范围内声明
tut_eigen/pinv.cpp:26:22: 错误: 'm_sigma_inv' 未在此范围内声明
tut_eigen/pinv.cpp:26:47: 错误: 'm_matU' 未在此范围内声明

为什么??它们没有在 SVD 文件中声明?

4

1 回答 1

2

我怀疑你在谈论这个“教程”,它不是一个教程,而是一个常见问题解答,假设你已经对这个库有所了解(如果你链接到你的信息源会很有帮助,顺便说一句)。

这说明您可以将pinv()方法添加到SVD“从外部”。我假设它们意味着您可以从派生类中派生SVD并提供该pinv()方法。只是在某处键入函数并不能为编译器提供必要的上下文来确定引用名称的位置。

于 2012-11-04T13:49:13.863 回答