Matlab如何在高维矩阵算术运算中如此慢?

时间:2015-07-27 22:00:00

标签: matlab matrix arithmetic-expressions

我的代码中的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秒钟....   有人看到问题所在吗?非常感谢提前!我只是因为这条线而被慢速表演杀死了......

1 个答案:

答案 0 :(得分:2)

高维矩阵有时可能会很慢。我将展示这个比较2D矩阵和矩阵的速度。矩阵的大小大致相同。

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

运行timeit功能

timeit(@fRef1,1) 

对于2D矩阵,矩阵生成需要0.7058秒

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.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.5276秒,这大约是2D矩阵的时间的两倍。那我们能做得更好吗?答案是肯定的!由于操作是按元素完成的,因此操作与矩阵的形状无关。然后让我们将矩阵修改为a,以便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.2217s的结果,这与2D矩阵的结果大致相同。

Windows 7,intel core i5-2540M,2.60GHz,Matlab 2014b