Matlab中的快速DP(用于轮廓HMM的Viterbi)



我在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,但没有明显的区别(实际上有点慢)。

不幸的是,循环在Matlab中的速度很慢(不过随着更新的版本,它会变得更好),而且我认为它不能很容易地向量化/并行化,因为循环中的操作并不独立于其他迭代。

这似乎是MEX的一项任务——用C写这篇文章应该不需要太多的工作,而且预期的加速速度可能相当大。

最新更新