Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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++中的多元正态分布中提取随机向量,既有均值向量又有协方差矩阵,很像Matlab的MVNRND< /COD>函数。我找到了一个类的相关代码,该类在上实现了这一点,但在编译时遇到了一些问题。我已经创建了一个包含在main.cpp中的头文件,我正在尝试创建一个eigenmultivariationnormal类的对象: MatrixXd MN(10,1); MatrixXd CVM(10,10); EigenMultivariateNormal <double,int> (&MN,&CVM) mvn; MatrixXd-MN(10,1); MatrixXd-CVM(10,10); 特征多变量非线性(&MN,&CVM)mvn;_C++_Class_Templates_Boost_Eigen - Fatal编程技术网

从模板化类创建对象时出错 我一直在尝试从C++中的多元正态分布中提取随机向量,既有均值向量又有协方差矩阵,很像Matlab的MVNRND< /COD>函数。我找到了一个类的相关代码,该类在上实现了这一点,但在编译时遇到了一些问题。我已经创建了一个包含在main.cpp中的头文件,我正在尝试创建一个eigenmultivariationnormal类的对象: MatrixXd MN(10,1); MatrixXd CVM(10,10); EigenMultivariateNormal <double,int> (&MN,&CVM) mvn; MatrixXd-MN(10,1); MatrixXd-CVM(10,10); 特征多变量非线性(&MN,&CVM)mvn;

从模板化类创建对象时出错 我一直在尝试从C++中的多元正态分布中提取随机向量,既有均值向量又有协方差矩阵,很像Matlab的MVNRND< /COD>函数。我找到了一个类的相关代码,该类在上实现了这一点,但在编译时遇到了一些问题。我已经创建了一个包含在main.cpp中的头文件,我正在尝试创建一个eigenmultivariationnormal类的对象: MatrixXd MN(10,1); MatrixXd CVM(10,10); EigenMultivariateNormal <double,int> (&MN,&CVM) mvn; MatrixXd-MN(10,1); MatrixXd-CVM(10,10); 特征多变量非线性(&MN,&CVM)mvn;,c++,class,templates,boost,eigen,C++,Class,Templates,Boost,Eigen,问题是,我在编译时遇到与模板相关的错误: error: type/value mismatch at argument 2 in template parameter list for ‘template<class _Scalar, int _size> class EigenMultivariateNormal’ error: expected a constant of type ‘int’, got ‘int’ error: expected ‘;’ be

问题是,我在编译时遇到与模板相关的错误:

error: type/value mismatch at argument 2 in template parameter list for ‘template<class _Scalar, int _size> class EigenMultivariateNormal’    
error:   expected a constant of type ‘int’, got ‘int’    
error: expected ‘;’ before ‘mvn’
错误:“模板类特征多变量异常”的模板参数列表中参数2的类型/值不匹配
错误:应为“int”类型的常量,但得到了“int”
错误:应为“;”在“mvn”之前
我对如何使用模板只有一个肤浅的想法,而且我绝不是cpp专家,所以我想知道我到底做错了什么?显然,我的代码中应该有一个
const

模板类多变量NORMAL
是专门的模板类。第一个
class\u Scalar
要求输入一个类型,但
int\u size
要求输入一个int

您应该使用常量int来调用它,而不是像您那样使用int类型。 第二,你的语法实例一个新的类是错误的。 请尝试以下方法:

EigenMultivariateNormal<double, 10> mvn (&MN, &CVM); // with 10 is the size
特征多变量异常mvn(&MN,&CVM);//尺寸是10

那个代码有点旧了。这是一个更新的,可能是改进的版本。可能还有一些不好的事情。例如,我认为应该更改为使用
MatrixBase
而不是实际的
矩阵。这可能会让它优化并更好地决定何时需要分配存储空间。这也使用了名称空间
internal
,这可能是不赞成的,但似乎有必要使用Eigen的
NullaryExpr
,这似乎是正确的做法。还有可怕的
mutable
关键字的用法。这是必要的,因为当在
NullaryExpr
中使用时,Eigen认为应该是
const
。 依赖boost也有点烦人。似乎在C++11中,这已成为标准。在类代码下面,有一个简短的用法示例

本征多变量非线性.hpp

#ifndef __EIGENMULTIVARIATENORMAL_HPP
#define __EIGENMULTIVARIATENORMAL_HPP

#include <Eigen/Dense>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/normal_distribution.hpp>    

/*
  We need a functor that can pretend it's const,
  but to be a good random number generator 
  it needs mutable state.  The standard Eigen function 
  Random() just calls rand(), which changes a global
  variable.
*/
namespace Eigen {
namespace internal {
template<typename Scalar> 
struct scalar_normal_dist_op 
{
  static boost::mt19937 rng;                        // The uniform pseudo-random algorithm
  mutable boost::normal_distribution<Scalar> norm;  // The gaussian combinator

  EIGEN_EMPTY_STRUCT_CTOR(scalar_normal_dist_op)

  template<typename Index>
  inline const Scalar operator() (Index, Index = 0) const { return norm(rng); }
};

template<typename Scalar> 
boost::mt19937 scalar_normal_dist_op<Scalar>::rng;

template<typename Scalar>
struct functor_traits<scalar_normal_dist_op<Scalar> >
{ enum { Cost = 50 * NumTraits<Scalar>::MulCost, PacketAccess = false, IsRepeatable = false }; };

} // end namespace internal
/**
    Find the eigen-decomposition of the covariance matrix
    and then store it for sampling from a multi-variate normal 
*/
template<typename Scalar, int Size>
class EigenMultivariateNormal
{
  Matrix<Scalar,Size,Size> _covar;
  Matrix<Scalar,Size,Size> _transform;
  Matrix< Scalar, Size, 1> _mean;
  internal::scalar_normal_dist_op<Scalar> randN; // Gaussian functor


public:
  EigenMultivariateNormal(const Matrix<Scalar,Size,1>& mean,const Matrix<Scalar,Size,Size>& covar)
  {
    setMean(mean);
    setCovar(covar);
  }

  void setMean(const Matrix<Scalar,Size,1>& mean) { _mean = mean; }
  void setCovar(const Matrix<Scalar,Size,Size>& covar) 
  {
    _covar = covar;

    // Assuming that we'll be using this repeatedly,
    // compute the transformation matrix that will
    // be applied to unit-variance independent normals

    /*
    Eigen::LDLT<Eigen::Matrix<Scalar,Size,Size> > cholSolver(_covar);
    // We can only use the cholesky decomposition if 
    // the covariance matrix is symmetric, pos-definite.
    // But a covariance matrix might be pos-semi-definite.
    // In that case, we'll go to an EigenSolver
    if (cholSolver.info()==Eigen::Success) {
      // Use cholesky solver
      _transform = cholSolver.matrixL();
    } else {*/
      SelfAdjointEigenSolver<Matrix<Scalar,Size,Size> > eigenSolver(_covar);
      _transform = eigenSolver.eigenvectors()*eigenSolver.eigenvalues().cwiseMax(0).cwiseSqrt().asDiagonal();
    /*}*/

  }

  /// Draw nn samples from the gaussian and return them
  /// as columns in a Size by nn matrix
  Matrix<Scalar,Size,-1> samples(int nn)
  {
    return (_transform * Matrix<Scalar,Size,-1>::NullaryExpr(Size,nn,randN)).colwise() + _mean;
  }
}; // end class EigenMultivariateNormal
} // end namespace Eigen
#endif
\ifndef\uuu特征多变量非线性水电站
#定义本征多变量非线性水电站
#包括
#包括
#包括
/*
我们需要一个函子可以假装它是常量,
但要成为一个好的随机数发生器
它需要可变状态。标准本征函数
Random()只调用rand(),这会更改全局变量
变量
*/
名称空间特征{
命名空间内部{
模板
结构标量法向距离运算
{
静态boost::mt19937 rng;//统一伪随机算法
可变boost::正态分布范数;//高斯组合子
本征空结构向量(标量法域)
模板
内联常量标量运算符()(索引,索引=0)常量{返回范数(rng);}
};
模板
升压::mt19937标量法向分布::rng;
模板
结构函子
{enum{Cost=50*NumTraits::MulCost,PacketAccess=false,IsRepeatable=false};};
}//结束命名空间内部
/**
求协方差矩阵的特征分解
然后将其存储起来,以便从多变量正态分布中进行采样
*/
模板
多变量非线性的类特征
{
矩阵covar;
矩阵_变换;
矩阵<标量,大小,1>平均值;
内部::标量\u法线\u距离\u op randN;//高斯函子
公众:
特征多变量非线性(常数矩阵和平均值、常数矩阵和协方差)
{
平均值;
setCovar(covar);
}
void setMean(常数矩阵&平均值){u mean=mean;}
void setCovar(常数矩阵和covar)
{
_covar=covar;
//假设我们会反复使用它,
//计算将
//适用于单位方差独立的法线
/*
本征::低密度脂蛋白胆固醇解算器(_-covar);
//我们只能在以下情况下使用cholesky分解
//协方差矩阵是对称的,位置确定的。
//但是协方差矩阵可能是半正定的。
//在这种情况下,我们将使用特征解算器
if(cholSolver.info()==Eigen::Success){
//使用cholesky解算器
_transform=cholSolver.matrixL();
}否则{*/
自伴特征解算器(covar);
_transform=eigenSolver.eigenvectors()*eigenSolver.Eigenatures().cwiseMax(0.cwiseSqrt().asDiagonal();
/*}*/
}
///从高斯分布中提取nn样本并返回它们
///作为按nn矩阵大小排列的列
矩阵样本(int-nn)
{
返回(_transform*Matrix::NullaryExpr(Size,nn,randN)).colwise()+_-mean;
}
};//端类特征值多变量极大值
}//结束命名空间特征值
#恩迪夫
下面是一个使用它的简单程序:

#include <fstream>
#include "eigenmultivariatenormal.hpp"
#ifndef M_PI
#define M_PI REAL(3.1415926535897932384626433832795029)
#endif

/**
  Take a pair of un-correlated variances.
  Create a covariance matrix by correlating 
  them, sandwiching them in a rotation matrix.
*/
Eigen::Matrix2d genCovar(double v0,double v1,double theta)
{
  Eigen::Matrix2d rot = Eigen::Rotation2Dd(theta).matrix();
  return rot*Eigen::DiagonalMatrix<double,2,2>(v0,v1)*rot.transpose();
}

void main()
{
  Eigen::Vector2d mean;
  Eigen::Matrix2d covar;
  mean << -1,0.5; // Set the mean
  // Create a covariance matrix
  // Much wider than it is tall
  // and rotated clockwise by a bit
  covar = genCovar(3,0.1,M_PI/5.0);

  // Create a bivariate gaussian distribution of doubles.
  // with our chosen mean and covariance
  Eigen::EigenMultivariateNormal<double,2> normX(mean,covar);
  std::ofstream file("samples.txt");

  // Generate some samples and write them out to file 
  // for plotting
  file << normX.samples(1000).transpose() << std::endl;
}
#包括
#包括“最大水电站”
#伊夫德夫·穆皮
#定义M_PI REAL(3.1415926535897932384626433832795029)
#恩迪夫
/**
取一对不相关的方差。
通过关联创建协方差矩阵
将它们夹在旋转矩阵中。
*/
本征::矩阵2D genCovar(双v0,双v1,双θ)
{
特征::矩阵2d rot=特征::旋转2dd(θ).matrix();
返回rot*本征::对角矩阵(v0,v1)*rot.转置();
}
void main()
{
本征::矢量2D平均值;
本征::矩阵2d-covar;

意思是你需要给它一个数字,比如10,而不是一个“int”?我想它想让你对第二个模板参数使用int值,就像EigenMultivariantEnormal实际上,我心目中的使用速度可能确实是个问题,如果我是正数,协方差矩阵总是正定的,否则它将无法达到最终目的。因此我假设Cholesky方法更快,因为我需要迭代s分布函数中的充足值