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

この「チュートリアル」について話していると思いますが、これはチュートリアルではなく、ライブラリについて少し知っていることを前提とした FAQ です (ところで、情報源にリンクすると役に立ちます)。

これが言っていることは、pinv()メソッドをSVD「外側から」に追加できるということです。派生クラスでメソッドを派生さSVDせて提供できることを意味していると思います。pinv()関数をどこかに入力するだけでは、参照された名前がどこにあるかを判断するために必要なコンテキストがコンパイラに提供されません。

于 2012-11-04T13:49:13.863 に答える