0

隠れマルコフ モデルでのパラメーターの結合は、基本的に、HMM の複数の論理パラメーターをいくつかの物理パラメーターにマッピングして、計算を減らして制約を適用することです。

したがって、パラメーター (状態、GMM、平均ベクトル、共分散行列、遷移行列、ストリームの重みベクトル、期間パラメーター ベクトルなど) が HMM を表すオブジェクトのフィールドである場合、これらはいくつかの物理コピーにマッピングされます。たとえば、HMM セット内の任意の 2 つの状態は、同じ出力確率分布を持つことができます。

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

〜ハンドル()

RUN SUCCESSFUL (合計時間: 62ms)

于 2014-03-03T12:19:32.453 に答える