【问题标题】:How Matlab can be so slow in high dimensional matrix arithmetic operation? [closed]Matlab在高维矩阵算术运算中怎么会这么慢? [关闭]
【发布时间】: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&gt;zeta | expkn./expk-1+delta&lt;-zeta) 中,您计算​​了两次相同的操作。
  • 5e7 元素的 10 秒是非常合理的。您输入的大小在您的时间安排中也很重要。如果你在一个中等大小的矩阵上尝试这个,那么你会发现它更快。除了 Daniel 所说的关于冗余计算的内容之外,您几乎可以 SOL 尝试让这更快。

标签: matlab matrix arithmetic-expressions


【解决方案1】:

有时,使用高维矩阵可能确实很慢。我将通过比较 2D 矩阵和您的矩阵的速度来展示这一点。矩阵的大小大致相同。

m = function fRef1()
    m = rand(5000,10000); % Generate an unsorted matrix to ensure worst case behaviour
end

运行timeit 函数,

timeit(@fRef1,1) 

2D矩阵的矩阵生成耗时0.7058s

m = function fRef2()
    m=rand(10,10,10,10,5,10,10,10);
end

timeit(fRef2,1)

对于 8D 矩阵,它需要 0.7277 秒,速度差不多。

现在测试做一个简单的矩阵运算

function M = f1()
    m = rand(5000,10000);
    M = m.^2.*m+m;
end

timeit 需要 0.9449 秒。使用fRef1的结果可以看到矩阵运算大约需要0.24s。

现在比较一下 8D 矩阵

function M = f2()
    m = rand(10,10,10,10,5,10,10,10);
    M = m.^2.*m+m;
end

timeit 需要 1.2553 秒。从fRef2 中删除时间,您将获得矩阵运算的时间。计算时间为 0.5276 秒,这大约是 2D 矩阵的时间的两倍。那么我们可以做得更好吗?答案是肯定的!由于操作是按元素完成的,因此操作与矩阵的形状无关。然后让我们将矩阵修改为 Matlab 认为更合适的矩阵。

function M=f3()
    m=rand(10,10,10,10,5,10,10,10);
    m=m(:); % Create a row vector
    M=m.^2.*m+m;
    M = reshape(M,10,10,10,10,5,10,10,10); % reshape the matrix again to
                                           % its original shape
end

timeit 给我们的结果是 0.9494 秒。其中,通过删除创建 m 的时间,我们得到 0.2217 秒的结果,这与二维矩阵的时间大致相同。

Windows 7,英特尔酷睿 i5-2540M,2.60GHz,Matlab 2014b

【讨论】:

  • 非常感谢您的指导性示例。这真的很有用!
  • @Woodpecker 谢谢,如果它回答了您的问题,请考虑接受它;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
  • 2014-01-13
  • 2015-10-29
相关资源
最近更新 更多