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