0

Matlab での viterbi logodds 計算の効率に問題があります。

基本的に私の問題は、ネストされたループが必須であり、コードの速度が大幅に低下することです。これは高価な部分です:

for i=1:input_len
    for j=1:num_states
        v_m=emission_value+max_over_3_elements; %V_M
        v_i=max_over_2_elements; %V_I
        v_d=max_over_2_elements; %V_D
    end
end

プロファイル HMM に viterbi を実装したのは私が初めてではないと思うので、何かアドバイスがあるかもしれません。また、Matlab 独自の hmmviterbi も調べましたが、啓示はありませんでした (ネストされたループも使用しています)。max をいくつかのプリミティブ操作に置き換えることもテストしましたが、顕著な違いはありませんでした (実際には少し遅くなりました)。

4

1 に答える 1

0

残念ながら、Matlab ではループが遅いだけです (ただし、最近のバージョンでは改善されます)。また、ループ内の操作は他の反復から独立していないため、簡単にベクトル化/並列化できるとは思いません。

これは MEX のタスクのように思えます。これを C で記述するのはそれほど手間がかからず、予想されるスピードアップはおそらくかなり大きいでしょう。

于 2014-01-18T20:25:12.777 に答える