【发布时间】:2015-10-18 06:52:19
【问题描述】:
我的代码中Matlab矩阵算术运算的低速度给我留下了深刻的印象,如下所示:
pitemp=zeros(nz,na,nb,nk,nxi,nann,nbn,nkn);
pitemp=alphal^(alphal*alphares)*alpham^(alpham*alphares)*expz.^alphares.*expk.^((eta-alphal-alpham)*alphares)+(1-delta)*expk-expkn...
-ximgrid.*(expkn./expk-1+delta>zeta | expkn./expk-1+delta<-zeta)+rd*amgrid-rl*bmgrid-amgridn+bmgridn;
pitemp、expz、expk、expkn、amgrid、bmgrid、amgridn、bmgridn 都是 8*D 矩阵。似乎不是逻辑运算符部分减慢了速度。我只是不明白为什么它可能需要 10 秒.... 有没有人看到问题出在哪里?提前非常感谢!就因为这条线,我真的被缓慢的性能杀死了......
【问题讨论】:
-
它很容易成为一个非常大的矩阵,有这么多维度,即使每个维度都相对较小。当操作需要 10 秒时,您使用的
nz,na,nb,nk,nxi,nann,nbn,nkn的值是多少? -
你的数组有 5000 万个元素...
-
好吧,考虑到您的矩阵是 50000000 个元素,或者大约 400MB 的 RAM,这是相当大的。 10秒对我来说似乎很合理。当您只是用第二行覆盖它时,您预分配内存的意义何在。我还想补充一点,在这种情况下,将所有内容都放入一行代码是不好的。这使得它非常不可读并且很难调试。
-
去掉不必要的操作,提高性能。在
(expkn./expk-1+delta>zeta | expkn./expk-1+delta<-zeta)中,您计算了两次相同的操作。 -
5e7元素的 10 秒是非常合理的。您输入的大小在您的时间安排中也很重要。如果你在一个中等大小的矩阵上尝试这个,那么你会发现它更快。除了 Daniel 所说的关于冗余计算的内容之外,您几乎可以 SOL 尝试让这更快。
标签: matlab matrix arithmetic-expressions