我想一定有一种算法能最有效地解决我的问题,但我还没有找到。我的问题是计算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)

这里的pCpBpA是存储中间结果的数组。
通过预分配和矢量化,应该可以使这更加有效,特别是如果prob()函数接受并返回向量参数,但我认为这是使算法在合理时间内完成的最重要步骤。
顺便说一句,最终结果Solution可能没那么有趣,因为它应该是1,因为它是一组穷尽可能性的概率之和,对吧?

关于algorithm - 使用最少的for_loop,Matlab计算条件概率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19892147/

10-09 03:16