oop — скрытые марковские модели — реализация связывания параметров в переполнении стека

Связывание параметров в скрытых марковских моделях по сути, отображает несколько логических параметров HMM на несколько физических параметров, чтобы уменьшить вычисления и ввести ограничения.

Таким образом, если параметры (состояния, GMM, средние векторы, ковариационные матрицы, матрицы переходов, векторы веса потока, векторы параметров продолжительности …) являются полями объекта, который представляет HMM, они должны быть сопоставлены с несколькими физическими копиями. Например, любые два состояния в наборе HMM могут иметь одинаковое распределение вероятности выхода.

Мне нужно иметь синтаксическое представление HMM и связывание параметров между ними, анализировать их и создавать из них объекты HMM.

Какой был бы хороший, элегантный способ связать эти параметры использовать функции языка C ++ (если это возможно)?

РЕДАКТИРОВАТЬ

Сырые указатели, безусловно, не вариант. Я смотрю в C ++ типа указателя, как shared_ptr, но я бы тоже хотел их избежать, если это возможно. Также кажется, что ссылки на C ++ могут ограничивать функциональность.

0

Решение

Вы можете использовать какой-то дескриптор для параметра, т.е.

#include <cstdio>
#include <boost/math/distributions/uniform.hpp>

template< class T>
class Handle {
T* rep_;
int* pcount_;
public:
T* operator->() { return rep_;}
Handle( T* rep) : rep_( rep), pcount_( new int(1)) {}
Handle( const Handle& r) : rep_( r.rep_), pcount_( r.pcount_) {
(*pcount_)++;
}
Handle& operator=( const Handle* r) {
if ( rep_ == r->rep_) return *this;
if ( --(*pcount_) == 0) {
delete rep_;
delete pcount_;
}
rep_ = r.rep_;
pcount_ = r.pcount_;
(*pcount_)++;
return *this;
}
~Handle() {
if ( --(*pcount_) == 0) {
delete rep_;
delete pcount_;
printf( "~Handle()");
}
}
};

Такая ручка может быть свободно передана, и все они могут иметь одно представление:

void f1( Handle<boost::math::uniform_distribution<int> > b) {
Handle<boost::math::uniform_distribution<int> > a = b;
}

Handle<boost::math::uniform_distribution<int> > f2() {
Handle<boost::math::uniform_distribution<int> > h(
new boost::math::uniform_distribution<int>);
return h;
}

/*
*
*/
int main(int argc, char** argv) {

Handle<boost::math::uniform_distribution<int> > h = f2();
f1( h);
Handle<boost::math::uniform_distribution<int> > k = h;
return 0;
}

~ Ручка ()

RUN SUCCESSFUL (общее время: 62ms)

0

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

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

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