Как рассчитать квадратичную форму с помощью Boost UBLAS?

Я пытаюсь вычислить (x-mu) ^ T * SigmaInverse * (x-mu), используя Boost UBLAS, где 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> >&)’

Что я делаю не так и как мне заставить его работать?

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
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]