我想一定有一种算法能最有效地解决我的问题,但我还没有找到。我的问题是计算a,prob(a)的离散分布。使用条件概率,我们知道:
prob(a)=prob(a b,c,d)*prob(b c,d)*prob(c d)*prob(d)
a,b,c,d是相依的,我只知道上面每个术语的表达式。
所以在我的代码中,我使用了4层for循环:
Solution=zeros(1,max_A) % store Prob(A=0,1,2,3,...max_A) in each cell.
for a =0 to max_A
for b=0 to max_B
for c=0 to max_C
for d=0 to max_D
Result= Prob(A=a|B=b,C=c,D=d)*Prob(B|C,D)*Prob(C|D)*Prob(D)
Solution(a)= Solution(a)+Result % sum up the result
%in each iteration
end
end
end
end
在实际的程序中,我处理prob(a b,c,d),prob(b c,d),prob(c d),prob(d),每一个调用一个21层for循环。这是非常低效和缓慢的。Matlab被我的代码噎住了,它已经运行了5天了。
非常感谢任何帮助我消除一些循环的想法或演示代码。
非常感谢!
酯
最佳答案
我认为它是那么慢,因为你不必要地重复计算如果存储部分结果,速度应该更快。我真的不能这么做,因为你的代码不是一个完整的运行示例,但是这样的例子怎么样:
for c = 0 to max_C
pC(c) = 0;
for d = 0 to max_D
pC(c) = pC(c) + Prob(C|D) * Prob(D);
end
end
for b = 0 to max_B
pB(b) = 0;
for c = 0 to max_C
pB(b) = pB(b) + Prob(B|C) * pC(c);
end
end
for a = 0 to max_A
pA(a) = 0;
for b = 0 to max_B
pA(a) = pA(a) + Prob(A|B) * pB(b);
end
end
Solution = sum(a)
这里的
pC
、pB
和pA
是存储中间结果的数组。通过预分配和矢量化,应该可以使这更加有效,特别是如果prob()函数接受并返回向量参数,但我认为这是使算法在合理时间内完成的最重要步骤。
顺便说一句,最终结果
Solution
可能没那么有趣,因为它应该是1,因为它是一组穷尽可能性的概率之和,对吧?关于algorithm - 使用最少的for_loop,Matlab计算条件概率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19892147/