0

Boost UBLASを使用して(x-mu)^ T * SigmaInverse *(x-mu)を計算しようとしています。ここで、xとmuはベクトルで、SigmaInverseは行列です。コードは次のようになります。

#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/matrix.hpp>

#include "matrixhelpers.h"

namespace ublas = boost::numeric::ublas;

class MultivariateNormalLogLikelihood
{
public:
  MultivariateNormalLogLikelihood(ublas::vector<double> &mu, ublas::matrix<double> &sigma) : mu(mu)
  {
    invertMatrix<double>(sigma, sigmaInverse);
    constElement = -std::log(2*M_PI)*0.5*mu.size()-0.5*std::log(determinant(sigma));
  }

  double operator()(ublas::vector<double> &x)
  {
    auto y = x-mu;
    double e = ublas::prod(ublas::prod(ublas::trans(y),sigmaInverse),y);
    return constElement-0.5*e;
  }
private:
  double constElement;
  ublas::matrix<double> sigmaInverse;
  ublas::vector<double> mu;
};

そして私はこのエラーを受け取ります:

/home/ga/PhD/cpp/grzesLib/multivariatenormalloglikelihood.h:23:71: error: no matching function for call to ‘prod(boost::numeric::ublas::matrix_vector_binary2_traits<double, boost::numeric::ublas::vector_unary<boost::numeric::ublas::vector_binary<boost::numeric::ublas::vector<double>, boost::numeric::ublas::vector<double>, boost::numeric::ublas::scalar_minus<double, double> >, boost::numeric::ublas::scalar_identity<double> >, double, boost::numeric::ublas::matrix<double> >::result_type, boost::numeric::ublas::vector_binary<boost::numeric::ublas::vector<double>, boost::numeric::ublas::vector<double>, boost::numeric::ublas::scalar_minus<double, double> >&)’

私は何を間違っているのですか、どうすればそれを機能させることができますか?

4

1 に答える 1

0

UBLAS ではベクトルを転置できないことがわかりました。代わりに、inner_product を明示的に使用する必要がありました。コードを修正するには、問題のある行を次のように変更する必要があります。

double e = ublas::prod(ublas::prod(ublas::trans(y),sigmaInverse),y);//WRONG

に:

double e = ublas::inner_prod(y, ublas::prod(sigmaInverse,y));//fine
于 2013-01-29T14:35:03.380 に答える