我在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实施维特比的人,所以也许你有一些建议。我还看了一下Matlab自己的hmmviterbi,但没有任何启示(也使用嵌套循环)。我还测试了用一些原始操作替换max,但没有明显的差异(实际上有点慢)。
答案 0 :(得分:0)
不幸的是,循环在Matlab中速度很慢(尽管在最近的版本中它会变得更好) - 我认为它不容易被矢量化/并行化,因为循环内的操作不是独立于其他迭代。
这对于MEX来说似乎是一项任务 - 在C语言中写这个并不是太多的工作,预期的加速可能非常大。