我是C 程序的新手。我必须实现一个程序女巫来计算矩阵的伪源。正如特征教程所建议的那样,我已经编写了这样的代码:
#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_isinitializatized"在此范围中没有声明tut_eigen/pinv.cpp:18:58:错误:在此范围中未声明" ei_assert"tut_eigen/pinv.cpp:20:4:错误:在此范围中未声明" SingullValuestype"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文件中声明?
我怀疑您谈论的是这个"教程",这不是一个教程,而是一个常见问题解答,假设您已经对图书馆有所了解(如果您链接到您的图书馆会有所帮助信息源,顺便说一句)。
这就是您可以将pinv()
方法添加到SVD
"从外部"中添加。我认为他们意味着您可以从SVD
派生并在派生类中提供pinv()
方法。仅在某处键入该函数并不能为编译器提供必要的上下文来确定引用名称的位置。