0

隐马尔可夫模型中的参数绑定本质上是将 HMM 的多个逻辑参数映射到几个物理参数,以减少计算并强制约束。

因此,如果参数(状态、GMM、均值向量、协方差矩阵、转移矩阵、流权重向量、持续时间参数向量……)是表示 HMM 的对象的字段,则这些将被映射到几个物理副本。例如,HMM 集合中的任何两个状态都可以具有相同的输出概率分布。

我需要 HMM 的语法表示和它们之间的参数绑定,并解析它们并从中构造 HMM 对象。

使用 C++ 语言(如果可能的话)的特性来绑定这些参数的一种很好、优雅的方式是 什么?

编辑

原始指针绝对不是一种选择。我正在研究像 C++ 指针类型shared_ptr,但如果可能的话,我也想避免使用它们。此外,似乎 C++ 引用可能会限制功能。

4

1 回答 1

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;
}

〜句柄()

运行成功(总时间:62ms)

于 2014-03-03T12:19:32.453 回答