Matlab在高维矩阵算术运算中怎么会这么慢?

How Matlab can be so slow in high dimensional matrix arithmetic operation?

我的代码中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 秒.... 有没有人看到问题出在哪里?非常感谢!就因为这条线,我真的被缓慢的性能杀死了...

有时处理高维矩阵确实很慢。我将展示这个比较二维矩阵和你的矩阵的速度。矩阵的大小大致相同。

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

运行 timeit 函数,

timeit(@fRef1,1) 

二维矩阵的矩阵生成需要0.7058s

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

timeit(fRef2,1)

而对于 8D 矩阵,它需要 0.7277s,速度大致相同。

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

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

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

现在与 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.5276s,大约是二维矩阵时间的两倍。那么我们可以做得更好吗?答案是肯定的!由于操作是按元素进行的,因此操作与矩阵的形状无关。然后让我们将矩阵修改为 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.9494s。其中,通过删除创建 m 的时间,我们得到 0.2217s 的结果,这与二维矩阵的时间大致相同。

Windows7、英特尔酷睿 i5-2540M、2.60GHz、Matlab 2014b